使用四边形绘制球体的算法

Algorithm to draw a sphere using quadrilaterals

我正在尝试使用 OpenGL 从头开始​​绘制一个球体。该函数必须定义为 void drawSphere(float radius, int nSegments, int nSlices),必须以 (0, 0, 0) 原点为中心,并且必须使用 GL_QUADS 创建。

首先,"slices" 是那种相互堆叠以创建球体的锥形圆柱形状,"segments" 是在圆形中生成的四边形生成每个这些锥形圆柱切片的 wall/side?

其次,我似乎找不到任何算法或示例来说明如何使用四边形进行计算以生成此球体 - 大多数示例似乎是从三角形生成的。

编辑

这是我刚刚试过的,绝对是正确的方向,但我的坐标计算有些地方不对:

void drawSphere(float radius, int nSegments, int nSlices) {
  /*
   * TODO
   * Draw sphere centered at the origin using GL_QUADS
   * Compute and set normal vectors for each vertex to ensure proper shading
   * Set texture coordinates
   */

  for (float slice = 0.0; slice < nSlices; slice += 1.0) {
        float lat0 = M_PI * (((slice - 1) / nSlices) - 0.5);
        float z0 = sin(lat0);
        float zr0 = cos(lat0);

        float lat1 = M_PI * ((slice / nSlices) - 0.5);
        float z1 = sin(lat1);
        float zr1 = cos(lat1);

        glBegin(GL_QUADS);

        for (float segment = 0.0; segment < nSegments; segment += 1.0) {
            float long0 = 2 * M_PI * ((segment -1 ) / nSegments);
            float x0 = cos(long0);
            float y0 = sin(long0);

            float long1 = 2 * M_PI * (segment / nSegments);
            float x1 = cos(long1);
            float y1 = sin(long1);

            glVertex3f(x0 * zr0, y0 * zr0, z0);
            glVertex3f(x1 * zr1, y1 * zr1, z0);
            glVertex3f(x0 * zr0, y0 * zr0, z1);
            glVertex3f(x1 * zr1, y1 * zr1, z1);
        }

        glEnd();
    }
}

我没有看到 radius 被使用。可能是一个简单的遗漏。假设对于其余的计算,半径为 1。您应该通过在 (x, y) 和 (z, zr) 上使用 0-1 来生成 4 个值,但不要在这些元组中混合。

所以 x1 * zr1, y1 * zr1, z0 是不对的,因为您混合了 zr1z0。你可以看到这个向量的范数不再是 1。您的 4 个值应该是

x0 * zr0, y0 * zr0, z0
x1 * zr0, y1 * zr0, z0
x0 * zr1, y0 * zr1, z1
x1 * zr1, y1 * zr1, z1

我不太确定顺序,因为我不使用四边形而是三角形。