我已经学会了如何使用OpenGL从各种教程中绘制一个立方体。
对于立方体,我们认为每个面由两个三角形组成,然后适当地设置顶点和颜色缓冲区。然后将这些缓冲区发送到着色器代码。
我们如何同样绘制球体和圆柱体?所有在线教程都专注于绘制立方体。
为球体或圆柱体设置顶点缓冲区似乎并不重要;我不能像三角形一样从三角形“构造”它们。
答案 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中工作:(角度,半径,高度)。您将计算两个多边形(恒定角度增量,固定半径,两个高度值)并创建:基础的两组三角形和侧面的一组矩形(分成两部分)。
对于球体,您将使用球面坐标:(倾斜度,高度,半径)。通过改变两个角度(一次一个),您将描述球体上的平行线和经线。这些定义了网格,使得每个瓦片都是四边形(除了在极点处);沿对角线分割得到三角形。