【问题标题】:How to generate a subdivided icosahedron?如何生成细分的二十面体?
【发布时间】:2009-02-18 13:47:04
【问题描述】:

我在这里问了一些问题,并且在其他测地线形状中多次提到过这个几何形状,但我很好奇我将如何生成关于点 xyz 的几何形状?

【问题讨论】:

  • 有教程here.
  • @MarkPattison 链接断开

标签: algorithm math geometry


【解决方案1】:

有教程here

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

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

【讨论】:

  • 现在添加了链接文章的摘要(我想我6年前不知道这个规则......)
  • 抱歉,这是来自审核队列的预设回复——我什至没有注意到答案上的 09 年印章。感谢您的更新。
  • 此答案中的链接不再指向有效的 URL。请更新此答案!
【解决方案2】:

Here 是我用于细分二十面体的参考之一,基于 OpenGL 红皮书。 BSD 许可的source code 到我的iPhone 应用程序Molecules 包含用于生成简单二十面体并将它们加载到OpenGL ES 的顶点缓冲区对象的代码。我还没有合并细分来提高渲染质量,但它在我的计划中。

【讨论】:

  • 已经很久了,但我相信这是我的基础代码。结果很好。最后我得到了一个 3D 网球,它会在撞击时变形(用 gluSphere 是不可能的)。
  • 这段代码的作用:添加一个简单的 icosphere,细分,然后归一化 - 不会给出完全均匀的分布(接近原始顶点的三角形会稍微小一些)。
【解决方案3】:

为了细分球体,大多数人将点线性细分,但这不会产生圆形。

对于圆形镶嵌,通过一系列旋转旋转两个点。

  1. 将第二个点绕 z 旋转(按点 1 的 z 角)到 0
  2. 将第二个点绕 y 旋转(按点 1 的 y 角)至 0(这在逻辑上将点 1 置于北极)。
  3. 将围绕 z 的第二个点旋转到 0(这在逻辑上将点 1 放在 x/y 平面上,现在变成单位圆)。
  4. 求半角,计算新的第 3 个点,即第 3 点的 x 和 y。
  5. 以相反的顺序执行步骤 3)、2) 和 1) 的反向旋转,以将第 3 个点定位到其目的地。

对于每个接近 0 的位置附近的值也有一些数学考虑,例如北极和南极,最右边和最左边,最前面和最后面的位置,所以检查如果它们在这些位置,则首先执行 pi/4(45 度)的额外旋转。这可以防止浮点数学库出现异常并为 atan2() 和其他三角函数生成异常的字符值。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    相关资源
    最近更新 更多