在OpenGL中绘制球体而不使用gluSphere()?

新手上路,请多包涵

是否有任何教程可以解释如何在 OpenGL 中绘制球体而无需使用 gluSphere()

OpenGL 的许多 3D 教程都只是在立方体上。我已经搜索过,但大多数绘制球体的解决方案是使用 gluSphere() 。还有一个站点具有在 此站点 上绘制球体的代码,但它没有解释绘制球体背后的数学原理。我还有其他版本的如何在该链接中以多边形而不是四边形绘制球体。但同样,我不明白球体是如何用代码绘制的。我希望能够可视化,以便在需要时修改球体。

原文由 Carven 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 458
2 个回答

一种方法是从具有三角形边的柏拉图立体开始 - 例如 八面体。然后,取出每个三角形并递归地将其分解为更小的三角形,如下所示:

递归绘制的三角形

一旦你有足够数量的点,你就可以对它们的向量进行归一化,使它们与实体中心的距离都是恒定的。这会导致侧面凸出成类似于球体的形状,随着点数的增加,平滑度也会增加。

这里的归一化意味着移动一个点,使其相对于另一个点的角度相同,但它们之间的距离不同。这是一个二维的例子。

在此处输入图像描述

A 和 B 相距 6 个单位。但是假设我们想在 AB 线上找到一个距离 A 12 个单位的点。

在此处输入图像描述

我们可以说 C 是 B 关于 A 的归一化形式,距离为 12。我们可以使用如下代码获得 C:

 #returns a point collinear to A and B, a given distance away from A.
function normalize(a, b, length):
    #get the distance between a and b along the x and y axes
    dx = b.x - a.x
    dy = b.y - a.y
    #right now, sqrt(dx^2 + dy^2) = distance(a,b).
    #we want to modify them so that sqrt(dx^2 + dy^2) = the given length.
    dx = dx * length / distance(a,b)
    dy = dy * length / distance(a,b)
    point c =  new point
    c.x = a.x + dx
    c.y = a.y + dy
    return c

如果我们对很多点进行归一化处理,所有点都相对于同一个点 A 并且具有相同的距离 R,那么归一化的点都将位于圆心 A 和半径 R 的圆弧上。

凸出线段

在这里,黑点从一条线上开始,然后“凸出”成一条弧线。

这个过程可以扩展到三个维度,在这种情况下,你会得到一个球体而不是一个圆。只需在 normalize 函数中添加一个 dz 组件即可。

归一化多边形

1级膨胀八面体3级膨胀八面体

如果您查看 Epcot 的球体,您可以看到这种技术在起作用。它是一个带有凸面的十二面体,使其看起来更圆。

原文由 Kevin 发布,翻译遵循 CC BY-SA 3.0 许可协议

@Constantinius 答案的 Python 改编:

 lats = 10
longs = 10
r = 10

for i in range(lats):
    lat0 = pi * (-0.5 + i / lats)
    z0 = sin(lat0)
    zr0 = cos(lat0)

    lat1 = pi * (-0.5 + (i+1) / lats)
    z1 = sin(lat1)
    zr1 = cos(lat1)

    glBegin(GL_QUAD_STRIP)
    for j in range(longs+1):
        lng = 2 * pi * (j+1) / longs
        x = cos(lng)
        y = sin(lng)

        glNormal(x * zr0, y * zr0, z0)
        glVertex(r * x * zr0, r * y * zr0, r * z0)
        glNormal(x * zr1, y * zr1, z1)
        glVertex(r * x * zr1, r * y * zr1, r * z1)

    glEnd()

原文由 Jaime02 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题