2个版本
0.2.1 | 2024年6月22日 |
---|---|
0.2.0 | 2024年6月22日 |
#898 in 游戏开发
99KB
1.5K SLoC
SMesh
[!警告] 库仍在开发中
SMesh是一个基于表面网格数据结构和pmp库的多边形网格操作库。
目前,它是对出色的pmp库的粗略移植,上面有一个“rusty”的API,但我计划添加更多功能。该库使用基于slotmap的表面网格实现,大量借鉴了blackjacks的半边网格实现。
示例
使用可视化示例应用程序来交互式探索库功能
cargo运行 --示例可视化
还有一个用于bevy网格集成的示例
cargo运行 --示例bevy_mesh
用法
前言:SMesh中的网格元素通过唯一的类型安全ID标识,可以是以下类型:VertexId
、HalfedgeId
和FaceId
。
网格创建
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