首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >OpenGL ES 2.0领域

OpenGL ES 2.0领域
EN

Stack Overflow用户
提问于 2014-06-10 09:16:15
回答 1查看 1.7K关注 0票数 1

使用GL_TRIANGLES在OpenGL ES 2.0中绘制带纹理的球体最简单的方法是什么?

我特别想知道如何计算顶点。

EN

回答 1

Stack Overflow用户

发布于 2014-06-11 05:31:56

球体的三角剖分有多种方法。流行的、不太受欢迎的、好的和不太好的。不幸的是,最广泛使用的方法并不是很好。

球面坐标

这可能是使用最广泛的方法。在两个嵌套循环中迭代spherical coordinate system中的两个角度,并为每对角度生成点。对于从-pi/2pi/2的角度theta迭代,以及从02*pi的角度phi迭代,以及球体半径r,每个点计算如下:

代码语言:javascript
运行
AI代码解释
复制
x = r * cos(theta) * cos(phi)
y = r * cos(theta) * sin(phi)
z = r * sin(theta)

如果有必要,计算可以更有效,但我将跳过这方面的回答。细分的级别(精度)由角度的细分数量确定。

这种方法的主要优点是它易于实现,并且易于理解。您可以将细分想象为地球上的经纬线。

然而,它不会产生非常好的三角剖分。赤道周围的三角形在所有方向上都有相似的尺寸,但靠近北极/南极的三角形变得越来越窄。在北极/南极,有大量非常窄的三角形汇合在一个点上。好的三角剖分都有非常相似大小的三角形,而这个不是。

八面体的递归细分

使用这种方法,您可以从一个常规的octahedron开始,得到8个三角形。然后将每个三角形递归细分为4个子三角形,如下图所示:

代码语言:javascript
运行
AI代码解释
复制
     /\
    /  \
   /____\
  /\    /\
 /  \  /  \
/____\/____\

因此,通过计算位于两个现有顶点中间的3个额外顶点来细分每个三角形,并由这6个顶点形成4个三角形。为了计算两个输入点之间的中点,您需要计算两个向量的和,并对结果进行归一化以使该点回到球体上。

细分的级别(精度)由递归细分中的级别数确定。它从级别0的八面体的8个原始三角形开始,在级别1产生32个三角形,在级别2产生128个三角形,在级别3产生512个三角形,依此类推。通常在级别3附近会得到一个相当好看的球体。

这种方法产生更规则的三角剖分,因此优于球坐标法。

主要的缺点是它可能看起来更复杂。这些点的计算其实很简单。如果你想使用索引顶点,而不是重复常见的顶点,这会变得稍微复杂一些。如果你想构建漂亮的三角形条带,那就更痛苦了。不是很难,但需要一些工作。

这是我最喜欢的绘制球体的方法。

其他多面体

你可以从其他多面体开始,对八面体做我所描述的相同的事情。由三角形组成的正多面体特别适合,这使得四面体和二十面体成为自然的候选者。八面体是最吸引人的IMHO,因为初始坐标很容易枚举。使用二十面体可能会导致更规则的三角剖分,并且可以查找顶点坐标。

细分立方体

我不确定是否有人真的在使用它。但我最近试过了,还挺有趣的。:)想法是以原点为中心取一个立方体,并将六个边的每一边细分为较小的子正方形。然后,您可以通过简单地对描述顶点的每个向量进行规格化,将立方体转换为球体。

这种方法的优点是它非常简单,包括构建三角形条带。三角测量的质量似乎相当不错。我不认为它像递归细分八面体那样规则,但肯定比(太)广泛使用的球坐标法更好。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24137198

复制
相关文章

相似问题

领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文