3D数学 学习笔记(5) 三角网格
参考书籍:
《3D数学基础:图形与游戏开发》
三角网格
在Unity中,导入的模型都有这个Mesh,如果模型顶点过多,会分成多个Mesh。
索引三角网格
// 顶点级别信息
struct Vertex
{
// 顶点的3D坐标
Vector3 pos;
// 还可以有纹理映射坐标,表面法向量,光照值等。
};
// 三角形级别信息
struct Triangle
{
// 顶点列表
int vertexIndex [3];
// 法向量,材质信息等。
};
// 索引三角网格
struct TriangleMesh
{
// 顶点数量
int vertexCount ;
// 顶点链表
Vertex *vertexList ;
// 三角形数量
int triangleCount ;
// 三角形链表
Triangle *triangleList ;
};
三角带
每个三角形都与前一个三角形共享一边。
多个三角带可以用连接起来,点7和8之间线段可以理解为压扁的三角形,为778或788。
三角扇
所有三角形共享第一个顶点。
拓扑与一致性
如果两个顶点数相同且三角形互联方式一致的三角网格,称为拓扑的。即使对应不同物体、不同拉伸,不打破邻接性就是同拓扑网格。
- 封闭网格(流形):网格覆盖在物体表面,是没有缝隙的。
拓扑异常的三角网格:
- 孤立顶点:顶点未被任何三角形使用。
- 重复定点:完全重复的顶点。
- 退化三角形:使用顶点超过一次的三角形(看起来像一条线那样)。
- 开放边:仅为一个三角形用。
- 超过两个三角形共享的边。
- 重复的面。
三角网格操作
焊接顶点
将相同的(邻近的)顶点删除,留下一个。
- 在焊接前,应该去除孤立点。
- 当两个来自“细长”三角形,焊接可能产生退化三角形,应该删除这样的三角形。
- 焊接时,应该用原顶点的平均作为新顶点,但也因此可能产生原来不再容差范围内的点被新顶点干扰。解决方案有下面这些:
- 先找出所有误差容限内的顶点组,再焊接。
- 不考虑已经焊接过的点。
- 记录原顶点坐标,当顶点和它们相比在容限外时不焊接。
面拆分
即复制顶点(位置不变),使边不再被共用。和焊接相反。新顶点和边和原来的重合。
边缩坍
将边缩减为顶点,顶点拆分。