OpenTKでOpenGLを使用して円柱を描画するにはどうすればよいですか?
2 に答える
円柱のジオメトリを生成するのは非常に簡単です (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 チュートリアルでこれをカバーする必要があります。あなたはその部分に精通していますか?
私の古いプロジェクトのサンプルコード。これにより、「キャップのない」円柱が作成されます (上部と下部は空です)。
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();
頂点とインデックスを頂点バッファー オブジェクトにアップロードして、パフォーマンスを向上させることもできます。