在OpenGL中翻译相机矩阵

3

直到最近我一直这样转换我的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,相机就不会向右移动,有时向前走会使它侧向移动,反之亦然,而且我移动得越多,运动越不正确。

如何正确地向相机的变换矩阵中添加翻译?

解决方案:

不要使用普通位置,而应计算点积,如下所示(请记住这些是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;

你为什么不直接使用 glm 呢? :) - Bartek Banachewicz
2个回答

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)

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

谢谢兄弟!这确实有效,我会更新主贴以便为其他人展示解决方案。 - Narrastro

0

2
抱歉,但OpenGL的矩阵数学库如何成为过时的呢?矩阵代数已经几百年没有改变了。 - Blindy
1
那是因为矩阵代数不是这样的。你仍然会使用它,但像glTranslatef这样的调用已被弃用。它们不是核心规范的一部分,未来可能不受支持。 - El Marcel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接