使用GL_TRIANGLES在OpenGL ES 2.0中绘制带纹理的球体最简单的方法是什么?
我特别想知道如何计算顶点。
发布于 2014-06-11 05:31:56
球体的三角剖分有多种方法。流行的、不太受欢迎的、好的和不太好的。不幸的是,最广泛使用的方法并不是很好。
球面坐标
这可能是使用最广泛的方法。在两个嵌套循环中迭代spherical coordinate system中的两个角度,并为每对角度生成点。对于从-pi/2
到pi/2
的角度theta
迭代,以及从0
到2*pi
的角度phi
迭代,以及球体半径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附近会得到一个相当好看的球体。
这种方法产生更规则的三角剖分,因此优于球坐标法。
主要的缺点是它可能看起来更复杂。这些点的计算其实很简单。如果你想使用索引顶点,而不是重复常见的顶点,这会变得稍微复杂一些。如果你想构建漂亮的三角形条带,那就更痛苦了。不是很难,但需要一些工作。
这是我最喜欢的绘制球体的方法。
其他多面体
你可以从其他多面体开始,对八面体做我所描述的相同的事情。由三角形组成的正多面体特别适合,这使得四面体和二十面体成为自然的候选者。八面体是最吸引人的IMHO,因为初始坐标很容易枚举。使用二十面体可能会导致更规则的三角剖分,并且可以查找顶点坐标。
细分立方体
我不确定是否有人真的在使用它。但我最近试过了,还挺有趣的。:)想法是以原点为中心取一个立方体,并将六个边的每一边细分为较小的子正方形。然后,您可以通过简单地对描述顶点的每个向量进行规格化,将立方体转换为球体。
这种方法的优点是它非常简单,包括构建三角形条带。三角测量的质量似乎相当不错。我不认为它像递归细分八面体那样规则,但肯定比(太)广泛使用的球坐标法更好。
https://stackoverflow.com/questions/24137198
复制相似问题