そのため、最近まで 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;