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

时间:2017-04-14 13:26:45

标签: c++ opengl shapes normals

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

首先,“切片”是一种锥形圆柱形状,它们彼此堆叠在一起以形成球体,“分段”是在圆形中生成的四边形,以生成墙壁/侧面每个锥形圆柱片?

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

修改

这是我刚刚尝试过的,这肯定是在正确的方向,但我的坐标计算在某处:

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();
    }
}

1 个答案:

答案 0 :(得分:0)

我没有看到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

我不太确定订单,因为我不使用Quads而是使用三角形。