【发布时间】:2014-06-10 09:16:14
【问题描述】:
在 OpenGL ES 2.0 中使用 GL_TRIANGLES 绘制纹理球体的最简单方法是什么?
我特别想知道如何计算顶点。
【问题讨论】:
-
可能重复Drawing a sphere in OpenGL ES 注意:如果这个问题是重复的,我觉得当前的答案应该与重复的问题合并。
标签: ios opengl-es geometry drawing
在 OpenGL ES 2.0 中使用 GL_TRIANGLES 绘制纹理球体的最简单方法是什么?
我特别想知道如何计算顶点。
【问题讨论】:
标签: ios opengl-es geometry drawing
有多种方法可以对球体进行三角测量。受欢迎的,不太受欢迎的,好的,不太好的。不幸的是,最广泛使用的方法并不是很好。
这可能是最广泛使用的方法。您在两个嵌套循环中遍历 spherical coordinate system 中的两个角度,并为每对角度生成点。角度theta从-pi/2迭代到pi/2,角度phi从0迭代到2*pi,球体半径r,每个点计算如下:
x = r * cos(theta) * cos(phi)
y = r * cos(theta) * sin(phi)
z = r * sin(theta)
如有必要,计算可以提高效率,但我将跳过这方面的答案。细分的级别(精度)由角度的细分数决定。
这种方法的主要优点是实现简单,并且易于理解。您可以将细分想象成地球上的经纬线。
但是,它不会产生非常好的三角测量。赤道周围的三角形在所有方向上都有相似的尺寸,但靠近北极/南极的三角形变得越来越窄。在北极/南极,您有大量非常窄的三角形在一个点上相遇。好的三角剖分都有大小非常相似的三角形,而这个没有。
使用这种方法,您可以从常规的octahedron 开始,为您提供 8 个三角形。然后递归地将每个三角形细分为 4 个子三角形,如下所示:
/\
/ \
/____\
/\ /\
/ \ / \
/____\/____\
因此,每个三角形通过计算位于两个现有顶点中间的 3 个额外顶点来细分,并且由这 6 个顶点形成 4 个三角形。为了计算两个输入点之间的中点,您需要计算两个向量的和,然后对结果进行归一化以使该点回到球体上。
细分的级别(精度)由递归细分中的级别数确定。它从 0 层八面体的 8 个原始三角形开始,在 1 层产生 32 个三角形,在 2 层产生 128 个三角形,在 3 层产生 512 个等。通常在 3 层附近得到一个相当漂亮的球体。
这种方法产生更规则的三角测量,因此优于球坐标方法。
主要缺点是它可能看起来更复杂。积分的计算其实很简单。如果您想使用索引顶点而不是重复公共顶点,它会变得更加棘手。如果你想构建漂亮的三角形条带,那就更痛苦了。不是很困难,但需要一些工作。
这是我最喜欢的绘制球体的方法。
您可以从其他多面体开始对八面体进行我描述的相同操作。由三角形组成的正多面体特别合适,这使得四面体和二十面体成为自然候选。八面体是最吸引人的恕我直言,因为初始坐标很容易枚举。使用二十面体可能会导致更规则的三角剖分,并且可以查找顶点坐标。
我不确定是否有人真的在使用它。但我最近尝试了它,它很有趣。 :) 这个想法是你取一个以原点为中心的立方体,并将六个边中的每一个细分为更小的子正方形。然后,您可以通过简单地对描述顶点的每个向量进行归一化来将立方体变成一个球体。
这种方法的优点是非常简单,包括构建三角条。三角测量的质量似乎相当不错。我认为它不像递归细分八面体那样规则,但绝对比(非常)广泛使用的球坐标方法更好。