直到最近我一直这样转换我的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