2010-11-10 109 views
0

我正在使用processing.org中的OpenGL做第一步。我想繪製兩個交叉的三角形,但實際上並沒有如何旋轉三角形來穿過它們。在OpenGL中繪製兩個交叉三角形

PGraphicsOpenGL pgl = (PGraphicsOpenGL) g; 
GL gl = pgl.beginGL(); 

gl.glTranslatef(width/2, height/2, 0); 
gl.glRotatef(a, 0, 0, 0); 

gl.glBegin(GL.GL_TRIANGLES); 
gl.glColor4f(0.7, 0.1, 0.7, 0.8); 
gl.glVertex3f(0, 0, 0); 
gl.glVertex3f(0, 50, 0); 
gl.glVertex3f(25, 0, 25); 
gl.glEnd(); 

gl.glRotatef(90, 1, 0, 0); 
gl.glBegin(GL.GL_TRIANGLES); 
gl.glColor4f(0.1, 0.9, 0.7, 0.8); 
gl.glVertex3f(0, 0, 0); 
gl.glVertex3f(0, 50, 0); 
gl.glVertex3f(25, 0, 25); 
gl.glEnd(); 

pgl.endGL(); 

三角形應像這些舊的3D樹木模型一樣交叉。他們應該旋轉並在後面的使用中作爲一個對象移動,我認爲這兩個頂點都是彈出和推動的,我只是無法弄清楚旋轉以獲得這兩個三角形。

回答

0

感謝您的代碼,並在紙上的一些幾何,我終於找到了我的問題的解決方案(S):

交叉三角解決方案:

gl.glBegin(GL.GL_TRIANGLES); 
    gl.glColor4f(0.1, 0.9, 0.7, 0.8); 
    gl.glVertex3f(-25, 0, 0); // lower left vertex 
    gl.glVertex3f(25, 0, 0); // lower right vertex 
    gl.glVertex3f(0, 50, 0); // upper vertex 
gl.glEnd(); 

gl.glBegin(GL.GL_TRIANGLES); 
    gl.glColor4f(0.9, 0.1, 0.7, 0.8); 
    gl.glVertex3f(0, 0, 25); // lower left vertex 
    gl.glVertex3f(0, 0, -25); // lower right vertex 
    gl.glVertex3f(0, 50, 0); // upper vertex 
gl.glEnd(); 

或用四個三角形是一樣的:

gl.glBegin(GL.GL_TRIANGLES); 
    gl.glColor4f(0.7, 0.1, 0.7, 0.8); 
    gl.glVertex3f(0, 0, 0); 
    gl.glVertex3f(0, 50, 0); 
    gl.glVertex3f(25, 0, 25); 
gl.glEnd(); 

gl.glBegin(GL.GL_TRIANGLES); 
    gl.glColor4f(0.1, 0.9, 0.7, 0.8); 
    gl.glVertex3f(0, 0, 0); 
    gl.glVertex3f(-25, 0, -25); 
    gl.glVertex3f(0, 50, 0); 
gl.glEnd(); 

gl.glBegin(GL.GL_TRIANGLES); 
    gl.glColor4f(0.1, 0.1, 0.9, 0.8); 
    gl.glVertex3f(0, 0, 0); 
    gl.glVertex3f(25, 0, -25); 
    gl.glVertex3f(0, 50, 0); 
gl.glEnd(); 

gl.glBegin(GL.GL_TRIANGLES); 
    gl.glColor4f(0.1, 0.9, 0.7, 0.8); 
    gl.glVertex3f(0, 0, 0); 
    gl.glVertex3f(-25, 0, 25); 
    gl.glVertex3f(0, 50, 0); 
gl.glEnd(); 
1

如果我正確理解你,你正在試圖獨立於彼此旋轉三角形?在這種情況下,您需要在三角形和gl.PopMatrix()之前使用gl.PushMatrix();三角後。例如:

gl.PushMatrix(); 
{ 
    gl.glTranslatef(width/2, height/2, 0); 
    gl.glRotatef(a, 0, 0, 0); 

    gl.glBegin(GL.GL_TRIANGLES); 
    gl.glColor4f(0.7, 0.1, 0.7, 0.8); 
    gl.glVertex3f(0, 0, 0); 
    gl.glVertex3f(0, 50, 0); 
    gl.glVertex3f(25, 0, 25); 
    gl.glEnd(); 
} 
gl.PopMatrix(); 

gl.PushMatrix(); 
{ 
    gl.glRotatef(90, 1, 0, 0); 
    gl.glBegin(GL.GL_TRIANGLES); 
    gl.glColor4f(0.1, 0.9, 0.7, 0.8); 
    gl.glVertex3f(0, 0, 0); 
    gl.glVertex3f(0, 50, 0); 
    gl.glVertex3f(25, 0, 25); 
    gl.glEnd(); 
} 
gl.PopMatrix(); 

其他明智的頂部旋轉將應用於兩個三角形。

此外,我注意到你說你需要兩個交叉的「矩形」。如果是這種情況,你將需要4個三角形或每個四邊形。所以,一個四,矩形,應該是:

gl.PushMatrix(); 
{ 

    gl.glTranslatef(width/2, height/2, 0);  
    gl.glRotatef(a, 0, 0, 0);  

    gl.glBegin(GL.GL_TRIANGLES);  
    gl.glColor4f(0.7, 0.1, 0.7, 0.8);  
    gl.glVertex3f(0, 0, 0);  
    gl.glVertex3f(0, 50, 0);  
    gl.glVertex3f(25, 0, 25); 
    gl.glVertex3f(25, 0, 25); 
    gl.glVertex3f(0, 50, 0); 
    gl.glVertex3f(25, 50, 25);  
    gl.glEnd(); 

} 
gl.PopMatrix(); 

甚至更​​好

gl.PushMatrix(); 
{  
    gl.glTranslatef(width/2, height/2, 0);  
    gl.glRotatef(a, 0, 0, 0);  

    gl.glBegin(GL.GL_QUADS); 
    gl.glColor4f(0.7, 0.1, 0.7, 0.8);  
    gl.glVertex3f(0, 0, 0);  
    gl.glVertex3f(0, 50, 0); 
    gl.glVertex3f(25, 50, 25);  
    gl.glVertex3f(25, 0, 25);   
    gl.glEnd();  
} 
gl.PopMatrix(); 

希望這有助於。

啊,現在我們正在某個地方!好吧,這很簡單。就旋轉而言,您可以避免這種情況,並直接將四邊形繪製在彼此之上。去根據你原有的25和50在這裏值是三角形爲例:

gl.PushMatrix(); 
{ 
    gl.glBegin(GL.GL_TRIANGLES);  
    gl.glColor4f(0.7, 0.1, 0.7, 0.8); 

    gl.glVertex3f(-12.5, -25, -12.5);  
    gl.glVertex3f(-12.5, 25, -12.5);  
    gl.glVertex3f(12.5, -25, -12.5); 
    gl.glVertex3f(12.5, -25, -12.5); 
    gl.glVertex3f(-12.5, 25, -12.5); 
    gl.glVertex3f(12.5, 25, -12.5); 

    gl.glVertex3f(0, -25, 0);  
    gl.glVertex3f(0, 25, 0);  
    gl.glVertex3f(0, -25, -25); 
    gl.glVertex3f(0, -25, -25); 
    gl.glVertex3f(0, 25, 0); 
    gl.glVertex3f(0, 25, -25); 

    gl.glEnd(); 

} 
gl.PopMatrix(); 

例與四邊形:

gl.PushMatrix(); 
{ 
    gl.glBegin(GL.GL_QUADS); 
    gl.glColor4f(0.7, 0.1, 0.7, 0.8); 

    gl.glVertex3f(-12.5, -25, -12.5);  
    gl.glVertex3f(-12.5, 25, -12.5); 
    gl.glVertex3f(12.5, 25, -12.5);  
    gl.glVertex3f(12.5, -25, -12.5); 


    gl.glVertex3f(0, -25, 0);  
    gl.glVertex3f(0, 25, 0); 
    gl.glVertex3f(0, 25, -25);  
    gl.glVertex3f(0, -25, -25); 
    gl.glEnd();  
} 
gl.PopMatrix(); 

如果這僅僅是一個例子那麼這段代碼應該罰款。但是,如果您要渲染這些圖像的多個像素,則您需要將四維渲染代碼存儲到頂點緩衝區對象中,然後渲染多個頂點緩衝區對象。

+0

我會盡量更清晰: 我只需要兩個三角形,應在中間交叉(如樹木的這些老的3D模型,這是很難解釋)。它們應該一起旋轉,這是我迄今爲止,但不是交叉的三角形本身。 – Patrick 2010-11-10 17:06:59

+0

那麼我有兩個解決方案爲你的樹。我需要知道的是,如果你指的是他們曾經用過的遊戲中使用的樹木,樹葉上只有兩個交叉的四邊形紋理,或者你的意思是一個金字塔頂部的樹葉。否則我不確定你的意思是兩個交叉的trianges。也許你可以快速地模擬一些簡單的塗料。我保證我不會對你的程序員藝術評分。 – lrussell851 2010-11-10 17:45:48

+0

我指的是來自遊戲的樹木,其中兩個紋理四邊形交叉。如果從按鈕看,它應該看起來像一個+,從兩側看就像一個三角形。明天可以繪製某些東西,但是我猜想+它變得清晰了嗎? 下次我會直接畫畫。 – Patrick 2010-11-10 18:08:33

0

我會盡量在幾個部分回答你的問題。

1)這段代碼會繪製一個矩形,但是您提到了2個矩形和2個三角形,它會讓您想要做的事情相當混亂。

2)「兩個矩形都應該稍後作爲一個對象」。這實際上不可能通過OpenGL。在opengl中(至少在初學者級別),通過將單個命令鏈接在一起來創建整個對象。所以你不要說「這裏是一個對象,現在把它畫在這裏,在這裏和這裏」。相反,你說「畫這個三角形,現在畫這個矩形,現在旋轉,現在畫這個三角形」。這是一個循序漸進的過程。

OpenGL對對象或模型一無所知,取決於您在代碼中定義它,然後告訴OpenGL如何繪製每個對象。

學習OpenGL的最佳資源之一是這裏找到的NeHe教程http://nehe.gamedev.net/他們應該有java版本的教程,否則不難理解。

+0

試圖重新制定上述問題。感謝您的鏈接! – Patrick 2010-11-10 17:12:38