2010-08-07 80 views
12

我想了解OpenGL座標系。我看到的所有地方都被描述爲右撇子,但與我的經驗不符。我試圖繪製一些形狀和三維物體,我發現顯然z軸指向「進入屏幕」(而x指向右側,y起始 - 這是對左手座標系的描述)。我錯過了什麼?哪裏指向OpenGL z軸?

編輯: 例如:
http://img576.imageshack.us/img576/9234/triangles.jpg
如果+ Z點瀏覽器,爲什麼綠色三角形,其Z座標越大,背後是紅色的嗎?

initializeGL:

qglClearColor(Qt::darkGray); 
glClearDepth(1.0); 
glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_LEQUAL);  
glEnable(GL_COLOR); 

resizeGL:

glViewport(0, 0, width, height); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(-50.0f, 50.0f, -50.0f, 50.0f, 50.0, -50.0); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

paintGL:

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glLoadIdentity(); 
glRotatef (-30.0, 1.0, 0.0, 0.0); 
glRotatef (20.0, 0.0, 1.0, 0.0); 
glColor3f(1.0, 0.0, 0.0); 
glBegin(GL_LINES); 
glVertex3f(45.0, 0.0, 0.0); 
glVertex3f(-45.0, 0.0, 0.0); 
glVertex3f(0.0, 45.0, 0.0); 
glVertex3f(0.0, -45.0, 0.0); 
glVertex3f(0.0, 0.0, 45.0); 
glVertex3f(0.0, 0.0, -45.0); 
glEnd(); 
glBegin(GL_TRIANGLES); 
//Red triangle: 
glColor3f(1.0, 0.0, 0.0); 
glVertex3f(0.0, 0.0, 1.0); 
glVertex3f(0.0, 20.0, 1.0); 
glVertex3f(20.0, 0.0, 1.0); 
//Green triangle:  
glColor3f(0.0, 1.0, 0.0); 
glVertex3f(-15.0, 0.0, 20.0); 
glVertex3f(0.0, 25.0, 20.0); 
glVertex3f(15.0, 0.0, 20.0); 
glEnd(); 
+0

「如果+ Z點查看器,爲什麼綠色三角形(z座標較大)在紅色背後? 您旋轉了整個場景兩次。在渲染三角形之前爲模型視圖矩陣調用glLoadIdentity,然後比較結果。 – SigTerm 2010-08-08 03:27:34

回答

5

最後2個參數glOrtho參考:

nearVal,farVal
指定距離較近和較遠深度剪切平面。 如果飛機要在觀看者的後面,這些值是負值。

你的更接近的裁剪平面是在觀衆面前和更遠,後面。它會翻轉Z軸。

+3

這基本上是我說這個答案前12小時。 – JustBoo 2010-08-08 12:21:43

+0

是的,Z軸確實被意外翻轉了,但是我找到了一個確切的代碼行, – majaen 2010-08-08 14:22:37

8

好了,站出來爲我的事情是glOrtho功能。近距離和遠距離的裁剪面只有100個單位。這似乎很小。你真的想這樣嗎?它由該函數中的最後2個參數表示。

此外,您的對象是非常大的關於這個小的平截體。物體可以直接坐在相機的前面,它可以阻止其他物體被看到。

我會放大glOrtho調用中的所有參數。 HTH


在右手系統(OpenGL)中,負Z(-Z)應該指向屏幕。積極的Y應該是「向上」,積極的X應該在右邊。

這似乎是你所描述的,這是一個右手座標系。

也許這可以幫助。 http://www.geometrictools.com/Documentation/LeftHandedToRightHanded.pdf

+0

通過z軸「進入屏幕」我的意思是正Z(大點的Z座標是,更遠離它)。我不會使用帶有負值的glScale或類似的東西,所以對我來說這有點神祕。 – majaen 2010-08-07 15:23:29

+0

@majaen:也許你設置不同的模型視圖矩陣。 z越接近物體對你越大。 – SigTerm 2010-08-07 15:33:38

+1

你確定在代碼的某個地方,某個軸沒有被「翻轉」嗎?我記得(隱約地)一旦我翻轉某些軸,甚至在左上方產生原點以適應Windows系統。它看起來在代碼中某處引起怪異。 – JustBoo 2010-08-07 15:39:20

1

這取決於你如何繪製。

模型視圖的標識和投影的常規gluPerspective期望輸入座標系統是右手的(如JustBoo提到的,-z在屏幕中)。

如果您加載了一組不同的矩陣,但沒有任何東西阻止您翻轉矩陣中的一個座標,導致出現左手系統。 (或而不是翻轉。gluPerspective/glFrustum實際翻轉z座標)。做這件事時要記住一些實際的事情,比如清盤的訂單。

5

我錯過了什麼?

在(中視)左手系x點權,y點起來,z點向前(遠離觀察者)。

在右手x點右,y點,z點落後(對觀衆)。

Picture

圖片是從wikipedia拍攝。

x是拇指,y是食指,z是中指。

+0

感謝您的鏈接,這是很容易解釋這個圖像:) – Calvin1602 2010-08-08 18:02:17