2013-03-05 70 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