现代OpenGL:绘制球体和圆柱体

时间:2014-09-30 09:10:35

标签: opengl graphics

我已经学会了如何使用OpenGL从各种教程中绘制一个立方体。

对于立方体,我们认为每个面由两个三角形组成,然后适当地设置顶点和颜色缓冲区。然后将这些缓冲区发送到着色器代码。

我们如何同样绘制球体和圆柱体?所有在线教程都专注于绘制立方体。

为球体或圆柱体设置顶点缓冲区似乎并不重要;我不能像三角形一样从三角形“构造”它们。

2 个答案:

答案 0 :(得分:2)

这是我在绘制球体时使用的一些代码。

注意:此代码使用C ++和GLM数学库。

// Calc The Vertices
for (int i = 0; i <= Stacks; ++i){

    float V   = i / (float) Stacks;
    float phi = V * glm::pi <float> ();

    // Loop Through Slices
    for (int j = 0; j <= Slices; ++j){

        float U = j / (float) Slices;
        float theta = U * (glm::pi <float> () * 2);

        // Calc The Vertex Positions
        float x = cosf (theta) * sinf (phi);
        float y = cosf (phi);
        float z = sinf (theta) * sinf (phi);

        // Push Back Vertex Data
        vertices.push_back (glm::vec3 (x, y, z) * Radius);
    }
}

// Calc The Index Positions
for (int i = 0; i < Slices * Stacks + Slices; ++i){

    indices.push_back (i);
    indices.push_back (i + Slices + 1);
    indices.push_back (i + Slices);

    indices.push_back (i + Slices + 1);
    indices.push_back (i);
    indices.push_back (i + 1);
}

此算法可创建所谓的UV球体。 'Slices'和'Stacks'是X轴和Y轴上的细分数。

答案 1 :(得分:1)

对于气缸,可以方便地在cylindrical coordinates中工作:(角度,半径,高度)。您将计算两个多边形(恒定角度增量,固定半径,两个高度值)并创建:基础的两组三角形和侧面的一组矩形(分成两部分)。

对于球体,您将使用球面坐标:(倾斜度,高度,半径)。通过改变两个角度(一次一个),您将描述球体上的平行线和经线。这些定义了网格,使得每个瓦片都是四边形(除了在极点处);沿对角线分割得到三角形。