2017-05-19 45 views
0

我的問題是爲什麼我有三個不同的矩陣,有什麼區別,這是從剪輯到眼睛空間轉換座標的正確方法。OpenGL爲什麼我得到了三個不同的投影矩陣

詳情:

我想獲得的OpenGL的投影矩陣,以實現虛擬掃描儀,我用這個矩陣座標從剪輯轉換爲眼睛空間。 我發現了三個途徑獲得:

  1. glGetFloatv(GL_PROJECTION_MATRIX,projection_tmp);

  2. GLM :: MAT4 PROJ = GLM ::透視( FOV, 方面, zNear,zFar);

  3. 計算它通過這個頁面給出的方法手動:gluperspective source code

參數傳遞給這三個方法如下:

const double zNear = 1; 
const double zFar = 10001;//for computational convenience 
const double fov = _model.getCamera().getFieldOfViewAngle();//60 
//w(523)h(489) 
const double aspect = static_cast<double>(w)/static_cast<double>(h); 

然後我得到三個不同的矩陣:

glGetFloatv:

1.61945  0  0  0 
     0 1.73205  0  0 
     0  0 -1.0002  -1 
     0  0 -2.0002  0 

GLM:

-0.145971   0   0   0 
     0 -0.15612   0   0 
     0   0 -1.0002  -1 
     0   0 -2.0002   0 

手冊:

0.504724  0  0  0 
     0 0.57735  0  0 
     0  0 -1.0002  1 
     0  0 -2.0002  0 

謝謝!

+0

'glGetFloatv'返回當前投影矩陣。但你是如何設置它的? – ybungalobill

+0

@ybungalobill我已經通過opengl渲染了一個模型,矩陣似乎是通過我在qt opengl渲染過程中調用的gluperspective來設置的。我搜索了它,很多人都說這是OpenGL3.0的棄用場景,爲什麼它在我的4.4版本環境中工作?我是OpenGL的新手,這讓我很困惑> _ < – YanmingJIA

回答

2

glGetFloatv版本是三者中唯一正確的版本。

GLM版本預計角度爲弧度,因此您應該將fovy更正爲tau/360

第三個版本不完全是鏈接的答案。鏈接答案中的代碼寫入負數一到m[11]而您發佈了正數一。我們假設這是一個錯字,並看看其他數字。在這裏,代碼簡直是錯誤的:它乘以tan(fov/2)而不是除以它。這就是爲什麼它得到0.57735 = 1/1.73205

我不知道人們爲什麼難以實現它。剛剛從gluPerspective specification取式,並將其在代碼寫:

void gluPerspectivInRadians(double m[16], 
    double fovy, double aspect, double zNear, double zFar) 
{ 
    double f = 1/tan(fovy/2); 
    m[0] = f/aspect; m[1] = 0; m[2] = 0; m[3] = 0; 
    m[4] = 0; m[5] = f; m[6] = 0; m[7] = 0; 
    m[8] = 0; m[9] = 0; m[10] = (zFar+zNear)/(zNear-zFar); m[11] = -1; 
    m[12] = 0; m[13] = 0; m[14] = 2*zFar*zNear/(zNear-zFar); m[15] = 0; 
} 
+0

真的很感謝你的回答!我有這三個矩陣相同。另一個問題:哪個矩陣或矩陣操作被棄用?[link](http://stackoverflow.com/questions/4202456/how-do-you-get-the-modelview-and-projection-matrices-in-opengl)。請您花些時間解釋第一個答案這一頁? – YanmingJIA

+0

@ YanmingJIA:這四個字:不要使用傳統的OpenGL。 – ybungalobill