解释一下上一篇中Mesh的三角形索引算法。
首先是要知道顶点数组是如何产生的:
如此图,一个大矩形,是由6个顶点,两个矩形构成的。
一般来讲,构建此矩形,需要知道每个顶点的位置,以及顶点和顶点之间的关系。
ok,
// 初始化顶点位置 private void initVertexPos() { int currentIndex = 0; for (int i = 0; i < ConstNumber.YLength; i++) { for (int j = 0; j < ConstNumber.XLength; j++) { vertices[currentIndex] = new Vector3(j, 0, i); currentIndex++; } } }
这一步,就是讲顶点的位置按一定的次序排列进数组
那么,索引数组就是存这些0,1,2,3...这些顶点数组索引值。
已知,三角形有3个顶点,所以每3个为一组,构造一个三角形。
矩形由两个三角形产生,可以如图划分,也可以垂直于黄线
那么,我们规定按顺时针方向构造(注意,要么全顺时针,要么全逆时针)
得到 0,3,4,0,4,1,1,4,5,1,5,2
实现的算法就是
// 初始化三角形索引 private void initTriangles() { // 代表triangl数组当前索引值,每放入数组中一个值,currentIndex都增1 int currentIndex = 0; for (int i = 0; i < ConstNumber.YLength - 1; i++) { for (int j = 0; j < ConstNumber.XLength - 1; j++) { // 顺时针画左上角三角形 triangles[currentIndex++] = (i + 0) * ConstNumber.XLength + (j + 0); triangles[currentIndex++] = (i + 1) * ConstNumber.XLength + (j + 0); triangles[currentIndex++] = (i + 1) * ConstNumber.XLength + (j + 1); // 顺时针画右下角三角形 triangles[currentIndex++] = (i + 0) * ConstNumber.XLength + (j + 0); triangles[currentIndex++] = (i + 1) * ConstNumber.XLength + (j + 1); triangles[currentIndex++] = (i + 0) * ConstNumber.XLength + (j + 1); } } }
这是一种实现方式,是以整体的矩形来分析。
我自己还写了另外一种索引算法,是以矩形左下角为基准,表达整个矩形。
因为你知道了矩形的一个点,矩形单位长度为1,你就可以知道其他点的位置。
ok,看算法
// 初始化三角形索引 private void initTriangles() { float xdelta = 1.0f / (float)(ConstNumber.XLength - 1); float ydelta = 1.0f / (float)(ConstNumber.YLength - 1); int currentPosNum = 0; for (int i = 0; i < ConstNumber.YLength; i++) { for (int j = 0; j < ConstNumber.XLength; j++) { vertices[currentPosNum] = new Vector3(j * xdelta, 0, i * ydelta); currentPosNum++; } } }
这个样,只需要遍历一遍所有的顶点(而且有些顶点无需遍历)只有一层for就OK了。
不过它的缺点也和它的优点一样明显,就是长必须大于宽。
其实,是可以弥补的,不过今天事情太多了,我只做记录了~~~~
时间: 2024-10-31 23:14:42