所以直到最近我一直在像这样转换我的 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;