网格专题
一、网格几何结构
1.1 顶点(Vertex)
MAX中的模型顶点仍然采用常用的顶点数组方式,mesh的顶点数组成员为verts,verts为顶点三维坐标的一维数组, Mesh::numVerts为顶点的数目。
1.2 面片(Face)
Mesh网格中的面片均为三角形,有专门的Face类描述,Face类记录了一个面片的三个顶点在顶点数组中的索引,三条边的可见性、该面的可见性、所属的光滑组、以及关联的材质ID。而在Mesh类中,面片数组为faces,它是一个Face类型的数组,数组长度由Mesh::numFaces决定。相关联的方法有:
int Mesh::getNumFaces() const //返回网格面片的数目
BOOL Mesh::setNumFaces(int ct, BOOL keep=FALSE, BOOL synchSel=TRUE); //设置面片数目并分配面片数组
面片数组分配后,可以设置面片对应的顶点索引,该方法由Face类提供:
void Face::setVerts(int a, int b, int c);
当然Face类提供了设置边可见性、面可见性、光滑组、关联材质ID的存取方法。在Mesh类中,仅仅存在这样一个Face数组,有关面片具体的信息完全由Face类记录。
1.3 边(Edge)
网格除了有顶点和面信息外,当然还存在着边信息,当然,MAX中的也存在着边信息,然而边信息是“虚拟”的。为什么呢?因为面信息中自然就包含了边信息, 因此,Mesh并不需要记录边集,而是在需要的时候创建一个边列表。Edge类为描述边的类,它包含了两个端点的索引,以及关联三角形面片的索引。
1.4 几何元素的状态
在Mesh类中存在着三个选择状态标志位数组,分别是顶点选择状态位数组(vertSel),面片选择状态位数组(faceSel),边选择状态位数组(edgeSel),它们均是BitArray类型(位数组)。显然,vertSel位数组的长度为numVerts,faceSel位数组的长度为numFaces。但是我们刚才已经说过,边集并不存在,那么如何来确定边的索引呢?其实这里的edgeSel的长度为3*numFaces,这怎么来的应该很显然,一个三角形三条边,所以第i个三角形对应的三条边在edgeSel中分别为edgeSel[i*3], edgeSel[i*3+1], and edgeSel[i*3+2]。
另外还有一个位数组记录顶点的显示/隐藏状态,为vertHide,长度为numVerts,如果vertHide[i]为1则标志着该顶点处于隐藏状态。
1.5 几何信息的获取
Mesh类提供了很多方法让我们获取其相关的几何信息,并不仅仅是顶点以及面片信息,包括建立在此之上的其他几何信息,比如我们可以获取面法线或者顶点法线,可以求取两个面之间的角度等等。或者说,Mesh类已经实现了很多基于几何的计算,我们要做的就是调用它提供的方法即可。下面是一些常见的获取信息方法:
• 包围盒信息(Bounding