如何生成一个细分的二十面体?

10

我在这里问了几个问题,发现在其他地方提到了一些几何形状,但我很好奇如何生成一个关于某个点xyz的这种几何形状?


2
这里有一个教程:链接 - Mark Pattison
@MarkPattison 链接已损坏。 - gansub
3个回答

11

这里有一个教程,链接在此处

基本思路是从一个二十面体(具有20个三角形面)开始,在每个三角面上重复地细分出更小的三角形。每个新的点在每个阶段都会被径向移动,以使其与中心的距离正确。

阶段数决定了生成多少个三角形,因此决定了结果网格与球体的接近程度。


现在已经添加了链接文章的摘要(我想我6年前不知道这个规则...) - Mark Pattison
抱歉,那是来自审核队列的预设回复 - 我甚至没有注意到答案上的“09年”时间戳。感谢您的更新。 - LittleBobbyTables - Au Revoir
这个答案中的链接不再指向有效的URL。请更新此答案! - boof
@boof 完成了,谢谢 jespertheend。 - Mark Pattison

10

这里是我用过的一个基于OpenGL Red Book的细分二十面体的参考文献。我的iPhone应用程序Molecules的BSD许可的源代码包含了生成简单二十面体并将它们加载到OpenGL ES顶点缓冲区对象中的代码。我尚未加入细分以改善渲染质量,但这是我的计划。


已经过了很长时间,但我相信这是我基于的代码。它运行得非常好。最终,我有了一个能够在撞击时变形的3D网球(使用gluSphere无法实现)。 - Steve Wortham
3
这段代码的作用是:添加一个简单的球体,对其进行细分,然后进行归一化处理——但无法完全实现均匀分布(距离原始顶点更近的三角形会稍微变小)。 - ideasman42

8
为了对球进行镶嵌,大多数人会线性地细分点,但这并不会产生一个圆形的形状。
如果要获得一个圆形的镶嵌,需要通过一系列旋转来旋转两个点。
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() 和其他三角函数产生极端的值。
希望这可以帮到你! :-)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接