在OpenGL中翻译相机矩阵

时间:2013-03-05 19:26:59

标签: c++ math opengl matrix 3d

所以直到最近我一直在改造我的OpenGL对象(Rotation_Matrix是GLfloat [16],我从存储对象方向的四元数中得到它,效果很好):

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;

2 个答案:

答案 0 :(得分:3)

相机的模型转换将是

M = T * R

由于View转换是反向的,因此

V = R^-1 * T^-1

这意味着整体旋转包含旋转的平移向量。你必须从点积计算它:

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

您可以从矩阵中检索这些向量。它们位于前三列/行中。

答案 1 :(得分:0)

你可能正在翻译世界空间。您希望在视图/相机空间中进行翻译。请务必阅读您最喜欢的参考文献或http://http.developer.nvidia.com/CgTutorial/cg_tutorial_chapter04.html。展望未来,不依赖opengl进行矩阵数学(弃用)可能是一个好主意。考虑使用glm。