3D数学 学习笔记(5)三角网格
发表于2018-01-03
三角网格就是全部由三角形组成的多边形网格。多边形和三角网格在图形学和建模中广泛使用,下面我们就来学习在unity游戏开发中会用到的这个三角网格知识。
三角网格
在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。
三角扇
所有三角形共享第一个顶点。
拓扑与一致性
如果两个顶点数相同且三角形互联方式一致的三角网格,称为拓扑的。即使对应不同物体、不同拉伸,不打破邻接性就是同拓扑网格。
- 封闭网格(流形):网格覆盖在物体表面,是没有缝隙的。
拓扑异常的三角网格:
- 孤立顶点:顶点未被任何三角形使用。
- 重复定点:完全重复的顶点。
- 退化三角形:使用顶点超过一次的三角形(看起来像一条线那样)。
- 开放边:仅为一个三角形用。
- 超过两个三角形共享的边。
- 重复的面。
三角网格操作
焊接顶点
将相同的(邻近的)顶点删除,留下一个。
- 在焊接前,应该去除孤立点。
- 当两个来自“细长”三角形,焊接可能产生退化三角形,应该删除这样的三角形。
- 焊接时,应该用原顶点的平均作为新顶点,但也因此可能产生原来不再容差范围内的点被新顶点干扰。解决方案有下面这些:
- 先找出所有误差容限内的顶点组,再焊接。
- 不考虑已经焊接过的点。
- 记录原顶点坐标,当顶点和它们相比在容限外时不焊接。
面拆分
即复制顶点(位置不变),使边不再被共用。和焊接相反。新顶点和边和原来的重合。
边缩坍
将边缩减为顶点,顶点拆分。
3D数学 学习笔记系列教程: