关于画球一开始真是一点思路都没有,楼主也查了好多资料,比较有代表性的是两篇帖子。
一篇是Jasper Flick的帖子,一个很厉害的人:
http://www.binpress.com/tutorial/creating-an-octahedron-sphere/162#comments
这一篇的思路是根据柏拉图体,正八面体分割成的球。
第二篇是OpenGL或者XNA回答的思路,是根据柏拉图体正二十面体画的
http://gamedev.stackexchange.com/questions/31308/algorithm-for-creating-spheres#
如果你能直接看懂上面两篇中的任何一篇,那么楼主下面写的对于你来说都是废话,你可以直接不用看了。
一、思路
简单的说下,首先是画出一个正八面体,这个我们上一篇文章:Unity Mesh(二) Mesh画立方体和八面体,已经写了怎么画正八面体,然后我们的思路是取每条边的重点,细分三角形,比如那正八面体的一个面来说,我们拆分一次的情况如图所示:
两次的情况如图:
以此类推,根据前面两篇我们可以了解到,Mesh画图形必须知道三角形的顶点和三角形的点顺序,这样的话我们需要知道的参数有三个,三角形的顶点数,三角形的个数,三角形的顶点顺序。
下面我们根据这三个数据的要求,一次进行计算说明。
二、计算三角形的个数
我们以正八面体中的一个面为例,我们拆分一次会有四个小三角形(这里不算总共,我们Mesh画以最小单位的三角形画),拆分两次会有16个三角形,这样的话我们假设拆分次数为s(subdivisions),这样每个面会有4^s个三角形,我们的正八面体有八个面,我们一共就有8*4^s个三角形,也就是2^(2s+3)个三角形。
结论:三角形的个数是:2^(2s+3)
三、计算三角形的顶点数
这里我们以四分之一个正八面体为单位进行运算,举列如图:
1次拆分:1+2+1=4
2次拆分:1+2+3+2+1=9
3次拆分:1+2+3+4+5+4+3+2+1=25
以一个面来说我们用r(row)表示三角形的行数,r=2^s就代表一个面的三角形的行数,这样我们四分之一的正八面体有的顶点数为(r+1)^2.
现在我们知道了1/4个正八面体有(r+1)^2.个顶点,但是整个合并不是4*(r+1)^2个顶点,因为我们还要舍去重合的点,为了更好的理解,我在Untiy里放了4个1/4个正八面体来演示合并后的顶点的计算流程。
如图所示,是四个四分之一正八面体,每个单个都有(r+1)^2个顶点,但是当上面两个合并时: