2013-03-05 69 views
3

所以直到最近我一直在改造這樣我的OpenGL的對象(Rotation_Matrix是GLfloat [16],我把它從存儲對象的方向四元,效果很好):翻譯攝像頭矩陣在OpenGL

glTranslatef(Position.x, Position.y, Position.z); 
glMultMatrixf(Rotation_Matrix); 

但最近我發現我可以做glMultMatrixf()如果我這樣做第一:

Rotation_Matrix[12] = Position.x; 
Rotation_Matrix[13] = Position.y; 
Rotation_Matrix[14] = Position.z; 

這意味着一切都很好,我相信這是過渡到OpenGL的3.0+以後重要?因爲我們必須擁有自己的矩陣。

所以我切換到新系統,而無需glTranslatef()函數,和一切運作良好,除了我的相機。對於相機我得到Camera_Matrix從定向四元的,它曾經這樣精細的工作:

glMultMatrixf(Camera_Matrix); 
glTranslatef(-CameraPos.x, -CameraPos.y, -CameraPos.z); 

但如果我設置的值12,第13和14 -CameraPos,相機不向右移動,有時候往前走會使它橫向移動,反之亦然,而我移動得越多,移動就越錯誤。

如何正確添加翻譯到相機的轉換矩陣?

SOLUTION:

而不是使用正常的位置,你必須計算點產品本身(記住這些是OpenGL的矩陣!)的:

GLfloat xDot = Position.x * m_RotationMatrix[0] + 
       Position.y * m_RotationMatrix[4] + 
       Position.z * m_RotationMatrix[8]; 

GLfloat yDot = Position.x * m_RotationMatrix[1] + 
       Position.y * m_RotationMatrix[5] + 
       Position.z * m_RotationMatrix[9]; 

GLfloat zDot = Position.x * m_RotationMatrix[2] + 
       Position.y * m_RotationMatrix[6] + 
       Position.z * m_RotationMatrix[10]; 

m_RotationMatrix[12] = -xDot; 
m_RotationMatrix[13] = -yDot; 
m_RotationMatrix[14] = -zDot; 
+0

你爲什麼不使用'glm'? :) – 2013-03-05 19:41:44

回答

3

相機的模式轉型將是

M = T * R 

由於視圖變換是相反的,所以這是

V = R^-1 * T^-1 

這意味着整體旋轉包含旋轉平移向量。你必須從點積計算它:

translation.x = -dot(position, right vector) 
translation.y = -dot(position, up vector) 
translation.z = -dot(position, direction vector) 

您可以從矩陣中檢索這些向量。他們在前三列/行。

+0

謝謝兄弟!這確實有效,我會更新主帖以顯示其他人的解決方案。 – Narrastro 2013-03-05 20:10:56

0

您可能正在翻譯世界空間。您希望在視圖/相機空間中進行翻譯。請務必閱讀您最喜愛的參考文獻,或http://http.developer.nvidia.com/CgTutorial/cg_tutorial_chapter04.html。展望未來,不要依賴opengl進行矩陣數學(不建議使用)。考慮使用glm。

+2

對不起,但OpenGL的矩陣數學庫究竟會變得不贊成?矩陣代數在數百年內沒有改變。 – Blindy 2013-03-05 20:11:13

+1

這是因爲矩陣代數不是。您仍然使用它,但不贊成使用像glTranslatef這樣的調用。它們不是核心規範的一部分,未來可能不會得到支持。 – 2013-03-05 20:45:42