2010-11-13 81 views

回答

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(); 

您也可以上傳頂點和索引到一個頂點緩衝區對象,以提高性能。

+0

提琴手,你的代碼運作良好。你能解釋指數與頂點映射嗎?最初,您正在計算圓柱體的底部和頂部圓的頂點,然後將這些頂點映射到索引。我的序列不清楚。你可以在樣本圖像中標記這些段嗎? – 2014-07-13 09:58:32

+0

頂點是三維空間中的點。索引描述如何將這些點連接成三角形(每個三角形有三個頂點)。有關更多詳情,請參閱此處:http://www.opentk.com/doc/chapter/2/opengl/geometry/primitives – 2014-07-13 14:34:20

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等於圓柱(這取決於身高和步驟B)和M等於數「水平」或「片」的數量每個「切片」上的點(取決於StepA)。

氣缸含有一些四邊形,每一個橫跨兩座相鄰的片,所以指數看起來像:

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教程都應該覆蓋這個;你熟悉那個部分嗎?

+0

對不起,我不明白你的僞代碼。我找到了OpenTK.Glu.Cylinder,但是在解決問題時遇到了問題,如果您使用OpenTK,也許您可​​以幫助我解決問題。 ty – Chris 2010-11-13 17:28:33

+0

您的問題最初提到OpenGL 3和VBO,它向我建議您想自己生成幾何圖形。你能用Glu.Cylinder來描述你的問題嗎? – Kos 2010-11-13 18:42:11

+0

請不要使用Glu.Cylinder。 Glu在OpenGL 3.0中被棄用,不再被支持。 – 2010-11-13 22:39:50

相關問題