Triangle Meshes
一、要解决问题
对三角形网格的存贮来说,最简单的想法,莫过每个三角形三个顶点坐标,每个顶点坐标都是三维,利用三角形数组存贮,如下:
Triangle{
vec3 vertexPosition [3];
}
但是这样的结构的结构存在两个问题:
- 网格中的每个顶点都被多个三角形共享,所以说同样的数据会被存贮很多次,造成严重浪费
- 无法知道三角形,顶点,边之间的相邻关系,这对于渲染等过程的处理是非常不利的
第一个问题其实很好解决,只要把顶点单独存贮,然后三角形中存储顶点数组的下标即可,如下:
IndexedMesh{
int tInd[nt][3]; //nt:number of triangle
vec3 vertex [nv] //nv:number of vertex
}
这个文件的重点在解决第二个问题,思路有以下两种:
- 以顶点为中心视角,将一个顶点周围的三角形以某种方式遍历
- 以边为中心视角,让边顺/逆时针旋转一周回到它自己,也就实现了对于三角形的遍历
同时为了避免旋转和边/顶点选择的混乱,要进行如下规定:
- 三角形的三个顶点,在其本身分别内为0,1,2,而且顺时针旋转