是否有任何教程可以解释如何在 OpenGL 中绘制球体而无需使用 gluSphere()
?
OpenGL 的许多 3D 教程都只是在立方体上。我已经搜索过,但大多数绘制球体的解决方案是使用 gluSphere()
。还有一个站点具有在 此站点 上绘制球体的代码,但它没有解释绘制球体背后的数学原理。我还有其他版本的如何在该链接中以多边形而不是四边形绘制球体。但同样,我不明白球体是如何用代码绘制的。我希望能够可视化,以便在需要时修改球体。
原文由 Carven 发布,翻译遵循 CC BY-SA 4.0 许可协议
一种方法是从具有三角形边的柏拉图立体开始 - 例如 八面体。然后,取出每个三角形并递归地将其分解为更小的三角形,如下所示:
一旦你有足够数量的点,你就可以对它们的向量进行归一化,使它们与实体中心的距离都是恒定的。这会导致侧面凸出成类似于球体的形状,随着点数的增加,平滑度也会增加。
这里的归一化意味着移动一个点,使其相对于另一个点的角度相同,但它们之间的距离不同。这是一个二维的例子。
A 和 B 相距 6 个单位。但是假设我们想在 AB 线上找到一个距离 A 12 个单位的点。
我们可以说 C 是 B 关于 A 的归一化形式,距离为 12。我们可以使用如下代码获得 C:
如果我们对很多点进行归一化处理,所有点都相对于同一个点 A 并且具有相同的距离 R,那么归一化的点都将位于圆心 A 和半径 R 的圆弧上。
在这里,黑点从一条线上开始,然后“凸出”成一条弧线。
这个过程可以扩展到三个维度,在这种情况下,你会得到一个球体而不是一个圆。只需在 normalize 函数中添加一个 dz 组件即可。
如果您查看 Epcot 的球体,您可以看到这种技术在起作用。它是一个带有凸面的十二面体,使其看起来更圆。