这里有一个教程,链接在此处。 基本思路是从一个二十面体(具有20个三角形面)开始,在每个三角面上重复地细分出更小的三角形。每个新的点在每个阶段都会被径向移动,以使其与中心的距离正确。 阶段数决定了生成多少个三角形,因此决定了结果网格与球体的接近程度。
这里是我用过的一个基于OpenGL Red Book的细分二十面体的参考文献。我的iPhone应用程序Molecules的BSD许可的源代码包含了生成简单二十面体并将它们加载到OpenGL ES顶点缓冲区对象中的代码。我尚未加入细分以改善渲染质量,但这是我的计划。
为了对球进行镶嵌,大多数人会线性地细分点,但这并不会产生一个圆形的形状。如果要获得一个圆形的镶嵌,需要通过一系列旋转来旋转两个点。1. 将第二个点绕 z 轴旋转(以第一个点的 z 角度为基准)到 0 度。 2. 将第二个点绕 y 轴旋转(以第一个点的 y 角度为基准)到 0 度(这将逻辑上将第一个点放在北极)。 3. 将第二个点绕 z 轴旋转到 0 度(这将逻辑上将第一个点放在 x/y 平面上,该平面现在成为一个单位圆)。 4. 找到半角,计算新的第三个点 point 3 的 x 和 y 坐标。 5. 按步骤 3)、2)和1)的相反顺序执行逆旋转,将第三个点定位到其目的位置。对于靠近每个接近 0 的位置(例如北极和南极、最右侧和最左侧、前部和后部),还有一些数学方面的考虑,因此首先检查它们,并在这些位置上额外旋转 pi/4(45 度)。这可以防止浮点数计算库出现问题,并为 atan2() 和其他三角函数产生极端的值。希望这可以帮到你! :-)