基本的思考方式:
第一种方法不使用连续的三角形带......
已经有一段时间了,所以我可能犯了一个错误......
参数定义的单位圆:
Where 0 =< theta < 2pi
x = sin(theta);
y = cos(theta);
现在我们可以定义一个圆,想象 x,y 平面上的同心环。
现在想象一下,抬起最里面的圆圈,当您抬起它时,它会拉起下一个环,就像一个紧身衣……这种视觉效果仅适用于半个球体。
因此,从同心环产生球体形状的形式当然是另一个与环正交的圆,即 (z,y) 平面...当然,我们只感兴趣于找到环的偏移量(它需要从 (x,y) 平面偏移多高或多低。
因为我们只需要偏移量,所以我们只需要半个圆……而且极点只是一个点。在两极处使用三角扇,并在每个环之间使用条带。
经过这个心理练习后,看看http://en.wikipedia.org/wiki/Sphere http://en.wikipedia.org/wiki/Sphere并搜索“半径为 r 的球体上的点可以通过参数化”,您将在该行后面看到参数形式。
法线非常简单,球体应始终围绕 (0,0,0) 构建,并且球体应始终以半径 1 构建(因此您可以简单地将其缩放到所需的大小),然后是圆上的每个顶点表面等于法线。
上面的方法使用两个三角形扇形和一系列三角形带...另一种方法可以生成顶点均匀分布的球体,并且可以用单个三角形带绘制,尽管目前我会疯狂地尝试编码它涉及以下想法:
想象一个以原点为中心的四面体(点距 0,0,0 1 个单位)。这是一个相当可悲的球体表示,但它是一个近似值。现在想象一下,我们找到四个面上每个面的中点,然后将该点推出,直到它位于球体的表面上。然后我们找到这些面的中点并将它们推出到球体的表面......
tetrahdralSphere(int 递归){}
找到中点非常简单,它只是每个 x、y、z 分量的平均值。然后,由于球体是单位球体,因此将它们移动到表面就像规范化这个新向量一样简单。
方法一产生一个看起来像经度和纬度线的点分布,并产生一个非均匀分布(如果使用四边形和线框,它看起来就像一个地球仪),它很容易实现。第二种方法需要递归,所以有点困难,但看起来更统一。如果你想变得非常复杂并且伤到你的头......那么尝试分布n个点,然后模拟点之间的排斥力,使它们分开,然后在表面上对它们进行标准化。要使这项工作有效进行,需要解决各种令人头疼的问题,但是您拥有相当均匀分布的点,并且可以控制顶点的数量,并且您将开始了解建模工具需要做什么找到表示模型的最小几何形状。
使用第一种方法。
在 (0,0,1) 处画一个点,然后您需要第一个同心环(为简单起见,每个环将具有相同数量的点)。
让我们在每个环上画 10 个点...所以 phi 将以 2pi/10 的增量递增
让我们画10个同心环
我们将绘制 10 个环 + 2 个极点,因此 theta 将以 pi/12 的增量增加。
//this psudo code places the points
//NOT TESTED
deltaTheta = pi/12;
deltaPhi = 2pi/10;
drawVertex(0,0,1) //north pole end cap
for(int ring; ring < 10; ring++){ //move to a new z - offset
theta += deltaTheta;
for(int point; point < 10; point++){ // draw a ring
phi += deltaPhi;
x = sin(theta) * cos(phi)
y = sin(theta) * sin(phi)
z = cos(theta)
drawVertex(x,y,z)
}
}
drawVertex(0, 0, -1) //south pole end cap