int v = 0; for (int y = 0; y <= ySize; y++) { for (int x = 0; x <= xSize; x++) { _vertices[v++] = new Vector3(x, y, 0); yieldreturnnewWaitForSeconds(0.05f); }
for (int z = 1; z <= zSize; z++) { _vertices[v++] = new Vector3(xSize, y, z); yieldreturnnewWaitForSeconds(0.05f); }
for (int x = xSize - 1; x >= 0; x--) { _vertices[v++] = new Vector3(x, y, zSize); yieldreturnnewWaitForSeconds(0.05f); }
for (int z = zSize - 1; z > 0; z--) { _vertices[v++] = new Vector3(0, y, z); yieldreturnnewWaitForSeconds(0.05f); } }
int v = 0; for (int y = 0; y <= ySize; y++) { for (int x = 0; x <= xSize; x++) { _vertices[v++] = new Vector3(x, y, 0); yieldreturnnewWaitForSeconds(0.05f); }
for (int z = 1; z <= zSize; z++) { _vertices[v++] = new Vector3(xSize, y, z); yieldreturnnewWaitForSeconds(0.05f); }
for (int x = xSize - 1; x >= 0; x--) { _vertices[v++] = new Vector3(x, y, zSize); yieldreturnnewWaitForSeconds(0.05f); }
for (int z = zSize - 1; z > 0; z--) { _vertices[v++] = new Vector3(0, y, z); yieldreturnnewWaitForSeconds(0.05f); } }
for (int z = 1; z < zSize; z++) { for (int x = 1; x < xSize; x++) { _vertices[v++] = new Vector3(x, ySize, z); yieldreturnnewWaitForSeconds(0.05f); } }
for (int z = 1; z < zSize; z++) { for (int x = 1; x < xSize; x++) { _vertices[v++] = new Vector3(x, 0, z); yieldreturnnewWaitForSeconds(0.05f); } }
for (int q = 0; q < ring - 1; q++, v++) { t = SetQuad(triangles, t, v, v + 1, v + ring, v + ring + 1); } t = SetQuad(triangles, t, v, v + 1 - ring, v + ring, v + 1);
到此为止,环看起来就很正常了。同样类似于上面创建顶点的办法,要使得侧面都被正方形包围我们只需要在 Y 方向上重复这个操作即可。
1 2 3 4 5 6 7 8
for (int y = 0; y < ySize; y++, v++) { for (int q = 0; q < ring - 1; q++, v++) { t = SetQuad(triangles, t, v, v + 1, v + ring, v + ring + 1); } t = SetQuad(triangles, t, v, v + 1 - ring, v + ring, v + 1); }
接着是顶部面的创建,首先我们来通过一张图清晰了解一下顶部的顶点结构(这张图对理解代码很重要):
接着我们首先来完成顶层第一排的创建工作(此处也是提取出了一个独立的方法):
1 2 3 4 5 6 7 8 9 10 11 12
privateintCreateTopFace(int[] triangles, int t, int ring) { // 找到最顶层的第一个顶点,也就是从上往下看左下角 int v = ring * ySize; for (int x = 0; x < xSize - 1; x++, v++) { t = SetQuad(triangles, t, v, v + 1, v + ring - 1, v + ring); } t = SetQuad(triangles, t, v, v + 1, v + ring - 1, v + 2);
return t; }
接着是第二行:
1 2 3 4 5 6 7 8 9 10
int vMin = ring * (ySize + 1) - 1; // 对应图中的 15 int vMid = vMin + 1; // 对应图中的 A int vMax = v + 2; // 对应图中的 5 t = SetQuad(triangles, t, vMin, vMid, vMin - 1, vMid + xSize - 1);
for (int x = 1; x < xSize - 1; x++, vMid++) { t = SetQuad(triangles, t, vMid, vMid + 1, vMid + xSize - 1, vMid + xSize); } t = SetQuad(triangles, t, vMid, vMax, vMid + xSize - 1, vMax + 1);