#mesh #polygon #half-edge #3d #procedural #3d-graphics #mesh-manipulation

smesh

基于pmp的快速且人性化的表面网格/半边网格实现和多边形网格操作库

2个版本

0.2.1 2024年6月22日
0.2.0 2024年6月22日

#898 in 游戏开发

MIT许可证

99KB
1.5K SLoC

CI crates.io

SMesh

[!警告] 库仍在开发中

SMesh是一个基于表面网格数据结构和pmp库的多边形网格操作库。

目前,它是对出色的pmp库的粗略移植,上面有一个“rusty”的API,但我计划添加更多功能。该库使用基于slotmap的表面网格实现,大量借鉴了blackjacks的半边网格实现。

示例

screenshot 使用可视化示例应用程序来交互式探索库功能

cargo运行 --示例可视化

还有一个用于bevy网格集成的示例

cargo运行 --示例bevy_mesh

用法

前言:SMesh中的网格元素通过唯一的类型安全ID标识,可以是以下类型:VertexIdHalfedgeIdFaceId

网格创建

SMesh提供了一个简单的API来向您的网格添加顶点并将它们连接到面:添加顶点

    let mut smesh = SMesh::new();
    let v0 = smesh.add_vertex(vec3(-1.0, -1.0, 0.0)); // Returns a unique VertexId
    let v1 = smesh.add_vertex(vec3(1.0, -1.0, 0.0));
    let v2 = smesh.add_vertex(vec3(1.0, 1.0, 0.0));
    let v3 = smesh.add_vertex(vec3(-1.0, 1.0, 0.0));

构建面

    smesh.add_face(vec![v0, v1, v2, v3])?;

网格查询

SMesh提供了一个链式API,用于使用典型的半边网格关系查询网格元素

获取顶点的出边半边

let outgoing_halfedge_query = v0.halfedge(); // returns a MeshQueryBuilder<HalfedgeId>

您可以通过使用.run(&smesh)在smesh实例上执行查询

let outgoing_halfedge = v0.halfedge().run(&smesh)?;  // returns a HalfedgeId

链式查询

let vertex = v0.halfedge_to(v1).cw_rotated_neighbour().dst_vert().run(&smesh)?;  // returns a VertexId

网格操作

即将推出...

请查看示例以了解更多信息 :)

目标

我的目标是提供Surface Mesh的灵活Rust实现,重点关注过程网格生成的实用性。其他目标还包括

  • 人体工程学且易于使用的API
  • 从pmp库中移植了大部分操作
  • 支持现代3D建模软件(如Blender)中大部分可行的操作
  • 与bevy游戏引擎集成
  • 目前针对多边形三角和四边形网格

依赖项

~4–44MB
~761K SLoC