3D数学 学习笔记(5)三角网格

发表于2018-01-03
评论0 6.5k浏览
三角网格就是全部由三角形组成的多边形网格。多边形和三角网格在图形学和建模中广泛使用,下面我们就来学习在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数学 学习笔记系列教程:

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引