绘制Cube的一个面其实是两个三角形拼成的。首先要弄清楚怎么绘制一个三角形,绘制三角形的三个顶点是怎么确定的。
首先我们定义一个int类型的数值,并赋予三个顶点,我们要搞清楚一个Cube的8个顶点是怎么排序的,所以先看一个面的四个顶点怎么分布。先随便给三个点,mCubeMeshRender.mesh.SetTriangles(newTriangles, 0) 赋值之后,运行效果如下:
顶点0,2,3顺序绘制出的三角形以及剩下的3的顶点位置如上,由于unity使用的是左手坐标系,顺指针绘制,所以初步推测0,1,2,3的位置如下。
进行验证,数组中的顶点顺序交换位置newTriangles = new int[3] {0,1,2}; 运行结果如下:
三角形边边是有了,可是怎么看不到面呢??视角调整到三角形背面后0,1,2顺序绘制出的三角形:
so,证明了之前的推测是对的,三角形的绘制是根据三个顶点顺时针绘制!!
好了,知道了正确的三角形的顶点顺序后继续绘制面。newTriangles = new int[6] {0, 2, 1, 2, 3, 1};(红色数字表示顶点,绿色数字表示三角形绘制顺序)
之后再绘制一个顶面,不知道顶面的四个点的顺序,还是先随便写三个接在前面6个点之后newTriangles = new int[9] {0, 2, 1, 2, 3, 1,2, 4, 5};运行结果如下
那最后就只差一个三角形了,继续加三个点newTriangles = new int[12] {0, 2, 1, 2, 3, 1,2, 4, 5,2, 5, 3};
画是画出来了,但是和旁边的完整cube一比,咋感觉不对劲啊。之后经过多番验证,出现这个问题的原因是三角形绘制不在一个面时,不能共用顶点!!
也就是说前面0,2,3,1四个点绘制的两个三角形形成一个面,顶面虽然也有2,3两个顶点,但是绘制过程中必须重新取两个数字,而不能再用到2,3。也就是说把2换成8,3换成9。newTriangles = new int[12] {0, 2, 1, 2, 3, 1,8, 4, 5,8, 5, 9};
为啥不能换成6,7呢?因为三角形8个顶点用到了0-7,所以得用其他数字。
那除了8,9还能换成其他数字吗?
经验证,不能。也不能使用不相邻的数字,比如8,10
我的理解是三角形顶点到7,后面绘制也需要是相邻7的数字.
newTriangles = new int[18] {0, 2, 1, 2, 3, 1,8, 4, 5,8, 5, 9,4,6,7,5,4,7}; 绘制如下
把后面的6,7所在面的4,5换成10,11,newTriangles = new int[18] {0, 2, 1, 2, 3, 1,8, 4, 5,8, 5, 9,10,6,7,11,10,7};
以上就是绘制Cube面,总结:
1.绘制三角形时,顺序是顺时针。
2.不同面的三角形不能共用相同顶点。
3.cube顶点0-7,顶点数必须是相邻数字。