如何在 OpenTK 中使用 OpenGL 绘制圆柱体?
问问题
4860 次
2 回答
1
生成圆柱体的几何形状非常简单(让我们考虑一个 Z 对齐的圆柱体)。让我使用伪代码:
points = list of (x,y,z)
where x = sin(a)*RADIUS, y = cos(a)*RADIUS, z = b,
for each a in [0..2*PI) with step StepA,
for each b in [0..HEIGHT] with step StepB
关于索引:让我们假设N
等于圆柱体的“层”或“切片”的数量(取决于 HEIGHT 和 StepB)并M
等于每个“切片”上的点数(取决于 StepA)。
圆柱体包含一些四边形,每个四边形跨越 2 个相邻切片,因此索引如下所示:
indices = list of (a,b,c,d)
where a = M * slice + point,
b = M * slice + (point+1) % M,
c = (M+1) * slice + (point+1) % M,
d = (M+1) * slice + point
for each slice in [0..N-2]
for each point in [0..M-1]
如果您需要圆柱体的法线,它们很容易生成:
normals = (x/RADIUS,y/RADIUS,0)
for each (x,y,z) in points
这就是圆柱体的圆形部分,您可能还想要“帽子”,但我相信它们很容易做到。
我将把我的伪代码翻译成你选择的语言的有趣部分留给你。:)
剩下的就是创建/绑定 VBO、加载几何体、设置指针、使用您选择的着色器并调用 glDrawArrays(...) - 任何 OpenGL 3 教程都应该涵盖这一点;你熟悉那部分吗?
于 2010-11-13T12:47:48.537 回答
1
我的一个旧项目的示例代码。这将创建一个“无盖”圆柱体(顶部和底部都是空的)。
int segments = 10; // Higher numbers improve quality
int radius = 3; // The radius (width) of the cylinder
int height = 10; // The height of the cylinder
var vertices = new List<Vector3>();
for (double y = 0; y < 2; y++)
{
for (double x = 0; x < segments; x++)
{
double theta = (x / (segments - 1)) * 2 * Math.PI;
vertices.Add(new Vector3()
{
X = (float)(radius * Math.Cos(theta)),
Y = (float)(height * y),
Z = (float)(radius * Math.Sin(theta)),
});
}
}
var indices = new List<int>();
for (int x = 0; x < segments - 1; x++)
{
indices.Add(x);
indices.Add(x + segments);
indices.Add(X + segments + 1);
indices.Add(x + segments + 1);
indices.Add(x + 1);
indices.Add(x);
}
您现在可以像这样渲染圆柱体:
GL.Begin(BeginMode.Triangles);
foreach (int index in indices)
GL.Vertex3(vertices[index]);
GL.End();
您还可以将顶点和索引上传到顶点缓冲区对象以提高性能。
于 2010-11-13T22:50:48.643 回答