Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
现代OpenGL:绘制球体和圆柱体_Opengl_Graphics - Fatal编程技术网

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

现代OpenGL:绘制球体和圆柱体,opengl,graphics,Opengl,Graphics,我从各种教程中学习了如何使用OpenGL绘制立方体 对于一个立方体,我们认为每个面由两个三角形组成,然后适当地设置顶点和颜色缓冲器。然后将这些缓冲区发送到着色器代码 我们怎样画一个球体和圆柱体?所有在线教程的重点都是绘制立方体 为球体或圆柱体设置顶点缓冲区似乎并不简单;我无法像立方体那样从三角形“构造”它们。对于圆柱体,在:(角度、半径、高度)中工作很方便。您将计算两个多边形(恒定角度增量、固定半径、两个高度值)并创建:两组三角形作为基础,一组矩形(一分为二)作为侧面 对于球体,将使用球坐标:(

我从各种教程中学习了如何使用OpenGL绘制立方体

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

我们怎样画一个球体和圆柱体?所有在线教程的重点都是绘制立方体


为球体或圆柱体设置顶点缓冲区似乎并不简单;我无法像立方体那样从三角形“构造”它们。

对于圆柱体,在:(角度、半径、高度)中工作很方便。您将计算两个多边形(恒定角度增量、固定半径、两个高度值)并创建:两组三角形作为基础,一组矩形(一分为二)作为侧面


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

下面是我在绘制球体时使用的一些代码

注:此代码使用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);
}
//计算顶点

对于(int i=0;i),它会溢出索引范围。在哪里发生这种情况?代码从不访问任何数组元素,只添加到数组中。如果从未访问它,它怎么会溢出索引范围?当
i=Slices*Stacks+Slices-1
时,您将
i+Slices+1
推到索引中。因为您总共有
(Stacks+1)*(切片+1)切片> Stacks <代码>时,<代码> i+Studio +1 的索引将引用到顶点集的末尾。这不会导致C++中的乌布,而是将在OpenGL代码(<代码> GLD)中出现。.在实践中,你会看到随机三角形从你的球体中伸出。啊,是的。我明白你的意思。奇怪的是,它似乎从来没有给我带来任何问题。谢谢。@Ruslan我使用上面的代码绘制椭球体。我有一些奇怪的问题。我读了你的答案,但我不知道如何解决。你能检查一下吗