现代OpenGL:绘制球体和圆柱体
我从各种教程中学习了如何使用OpenGL绘制立方体 对于一个立方体,我们认为每个面由两个三角形组成,然后适当地设置顶点和颜色缓冲器。然后将这些缓冲区发送到着色器代码 我们怎样画一个球体和圆柱体?所有在线教程的重点都是绘制立方体现代OpenGL:绘制球体和圆柱体,opengl,graphics,Opengl,Graphics,我从各种教程中学习了如何使用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我使用上面的代码绘制椭球体。我有一些奇怪的问题。我读了你的答案,但我不知道如何解决。你能检查一下吗