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;
4

2 回答 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)

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

于 2013-03-05T19:58:33.253 回答
0

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

于 2013-03-05T20:01:29.647 回答