English 中文(简体)
如何生成细分的二十面体?
原标题:
  • 时间:2009-02-18 13:47:04
  •  标签:

我在这里提出了一些问题,看到了这个几何形状在其他几何形状中被提到几次,但我很好奇我应该如何围绕一个点xyz生成一个这样的形状?

最佳回答

这是我用过的一个基于OpenGL红皮书的用于分级二十面体的参考文献。我的iPhone应用程序“分子”(Molecules)的BSD许可源代码包含了用于生成简单的二十面体并将它们加载到OpenGL ES顶点缓冲区对象中的代码。我还没有整合细分来提高渲染质量,但这是我的计划之一。

问题回答

这里有一个教程:这里

基本思想是从二十面体(有20个三角形面)开始,并将每个三角形面重复细分成更小的三角形。在每个阶段,每个新点都会径向移动,以确保它与中心的距离正确。

级数的数量将决定生成多少个三角形,从而决定结果网格与球体的接近程度。

为了使球面出现镶嵌效果,大多数人会对点进行线性细分,但这并不能产生圆形的形状。

为了圆形镶嵌,通过一系列旋转使两个点旋转。

  1. Rotate the second point around z (by the z angle of point 1) to 0
  2. Rotate the second point around y (by the y angle of point 1) to 0 (this logically puts point 1 at the north pole).
  3. Rotate the second point around z to 0 (this logically puts point 1 on the x/y plane, which now becomes a unit circle).
  4. Find the half-angle, compute x and y for the new 3rd point, point 3.
  5. Perform the counter-rotations in the reverse order for steps 3), 2) and 1) to position the 3rd point to its destination.

还有一些数学上的考虑,在接近0的位置,比如北极、南极、最右边和最左边,以及前端和后端位置,所以首先要检查这些位置,如果它们在这些位置,就执行额外的π/4(45度)旋转。这可以防止浮点数数学库出现问题,并为atan2()和其他三角函数生成异常值。

希望这个有所帮助! :-)





相关问题
热门标签