2013-10-10 39 views
1

我正在做我自己的世界 - >凸輪變換(而不是使用gluLookAt)。我正在關注信息here,但是Im爲最終的4x4模型視圖轉換獲得了不同的翻譯符號。DIY相機變換爲openGL

該文章說「既然我們正在往下看x軸,世界就會被相機的負位置轉換。」。然後他們翻譯了-eye,這是我的代碼中的-camPos

我不認爲這是正確的,因爲opengl是右撇子,相機通常看起來-Z(離開屏幕)。所以看起來正確的翻譯變換應該是+camPos

float lookAtP[3] = {0,0,0}; /* camera look at point */ 
float camPos[3] = {0,0,-150}; /* camera location */ 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(camPos[0],camPos[1],camPos[2], lookAtP[0],lookAtP[1],lookAtP[2], 0,1,0); 

GLfloat matrix[16]; 
glGetFloatv (GL_MODELVIEW_MATRIX, matrix); 
mat_print(matrix); 

結果(gluLookAt):

-1.0000 0.0000 0.0000 0.0000 
0.0000 1.0000 0.0000 0.0000 
0.0000 0.0000 -1.0000 0.0000 
    0.0000 0.0000 -150.0000 1.0000 

當我按照文章中,我得到不同的符號(+150)的翻譯。我計算旋轉矩陣R,然後翻譯T。然後,用glLoadMatrix加載T*R的轉置(因爲opengl是右手,文章處理左手座標系)。

-1.0000 0.0000 0.0000 0.0000 
0.0000 1.0000 0.0000 0.0000 
0.0000 0.0000 -1.0000 0.0000 
0.0000 0.0000 150.0000 1.0000 

問題是,文章是否正確?

+0

嗯,當你說GL_MODELVIEW矩陣是右手的,相機矩陣是左手的時候,你是對的......我會閱讀這篇文章,看看能否得到更多的結論。 – fvdalcin

+0

NDC,它是在最終的視口變換之前最終結束的座標空間是左手的。這是OpenGL中唯一無法控制的座標空間,z = -1總是最接近的深度,z = 1總是最遠的深度。只要最終產品在邏輯上映射到左手NDC,深度範圍,投影和您的模型視圖矩陣都可以具有不同的手型的各種中間座標空間。在固定功能流水線中,投影之前的所有內容都是右旋的,而投影矩陣/深度範圍是生成適當NDC的原因。 –

回答

0

OpenGL本身不是左手或右手的。 OpenGL的剪輯和窗口空間通常被認爲是右手的(儘管人們可以用其他方式來使用它們,如果真的想的話)。

在經典的固定功能流水線中,眼睛和物體空間通常定義爲左側 -handed。 gluLookAt()使用這個約定。此外,gluPerspective()/glFrustum()/glOrtho()使用此約定作爲近視和遠視的正值,它們實際上指的是眼睛空間中的 z值。這些投影矩陣通常會改變手型。