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)

これらのベクトルは行列から取得できます。それらは最初の 3 つの列/行にあります。

于 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 に答える