OpenGL ES 2.0领域
使用GL_TRIANGLES在OpenGL ES 2.0中绘制纹理球体的最简单方法是什么?
我特别想知道如何计算顶点。
有三angular球的各种方法。 stream行的,不stream行的,好的,不好的。 不幸的是,最广泛使用的方法不是很好。
球面坐标
这可能是最广泛使用的方法。 您可以在两个嵌套循环中遍历球面坐标系中的两个angular度,并为每对angular生成点。 当angular度theta
从-pi/2
迭代到pi/2
并且angular度phi
从0
到2*pi
和球体半径r
迭代时,每个点被计算为:
x = r * cos(theta) * cos(phi) y = r * cos(theta) * sin(phi) z = r * sin(theta)
如有必要,计算可以更高效,但是我会跳过这个答案。 镶嵌的级别(精度)由angular度的细分数决定。
这种方法的主要优点是实现简单,易于理解。 您可以将细分图像作为地球上的经线和纬线。
尽pipe如此,它并没有带来很好的三angular测量。 赤道周围的三angular形在所有方向上都具有相似的尺寸,但是接近南/北极的三angular形越来越窄。 在北/南极你有大量非常狭窄的三angular形在一个点上相遇。 好的三angular形具有所有非常相似大小的三angular形,而这个不是。
八面体的recursion细分
采用这种方法,你从一个正八面体开始,给你八个三angular形。 然后,您recursion地将每个三angular形细分为4个子三angular形,如下所示:
/\ / \ /____\ /\ /\ / \ / \ /____\/____\
因此每个三angular形通过计算两个现有顶点之间的中间三个附加顶点来细分,并且由这六个顶点形成四个三angular形。 为了计算两个input点之间的中间点,可以计算两个向量的和,并将结果归一化,以使点返回到球体上。
曲面细分的级别(精确度)由recursion细分中的级数决定。 它从0级八面体的8个原始三angular形开始,在1级产生32个三angular形,在2级产生128个,在3级产生512个等等。通常你会在3级左右得到一个相当好看的球体。
这种方法导致更加规则的三angular测量,因此优于球坐标方法。
主要的缺点是它可能看起来更复杂。 点的计算其实很简单。 如果你想使用索引顶点,而不是重复公共顶点,它会变得稍微棘手。 如果你想build立漂亮的三angular形条更加痛苦。 不是非常困难,但需要一些工作。
这是我最喜欢的绘画领域的方法。
其他多面体
你可以做同样的事情,我描述了八面体从其他多面体开始。 由三angular形组成的正多面体是特别合适的,这使得三面体和二十面体成为自然候选。 八面体是最有吸引力的恕我直言,因为最初的坐标是如此容易列举。 使用二十面体可能导致更加规则的三angular测量,并且可以查找顶点坐标。
细分立方体
我不确定是否有人使用这个。 但是我最近试了一下,真的很有趣。 :)这个想法是,你以一个以原点为中心的立方体,并将六边中的每一边细分成更小的平方。 然后,您可以通过简单化每个描述顶点的vector来将立方体变成一个球体。
这种方法的优点是非常简单,包括build造三angular形条。 三angular测量的质量似乎相当好。 我认为它不如recursion细分的八面体那样规则,但肯定比(非常)广泛使用的球坐标方法更好。