編集:私はこの特定の問題を解決しましたが、かなり似通った基本的な説明で新しいものを作成しました。カメラを何度も回転させた後、カメラが回転しないようにすると、ロールが始まります。私はヨーとピッチをマウスに縛っているので、ロールに0が渡されていることを知っています。問題は、実際に問題が解決したかどうかを知るためのアルゴリズム的な方法はありません。回転するカメラが1つの軸に沿って失敗する
これは私の既存のコードです:
あなたはジンバルロックに自分を持っているかもしれオイラー角を使用して回転の多くを行っている場合はD3DXMATRIX CameraRotationMatrix;
D3DXVECTOR3 CameraPosition;
//D3DXVECTOR3 CameraRotation;
inline D3DXMATRIX GetRotationMatrix() {
return CameraRotationMatrix;
}
inline void TranslateCamera(float x, float y, float z) {
D3DXVECTOR3 rvec, vec(x, y, z);
#pragma warning(disable : 4238)
D3DXVec3TransformNormal(&rvec, &vec, &GetRotationMatrix());
#pragma warning(default : 4238)
CameraPosition += rvec;
RecomputeVPMatrix();
}
inline void RotateCamera(float x, float y, float z) {
D3DXVECTOR3 RotationRequested(x, y, z);
D3DXVECTOR3 XAxis, YAxis, ZAxis;
D3DXMATRIX rotationx, rotationy, rotationz;
XAxis = D3DXVECTOR3(1, 0, 0);
YAxis = D3DXVECTOR3(0, 1, 0);
ZAxis = D3DXVECTOR3(0, 0, 1);
#pragma warning(disable : 4238)
D3DXVec3TransformNormal(&XAxis, &XAxis, &GetRotationMatrix());
D3DXVec3TransformNormal(&YAxis, &YAxis, &GetRotationMatrix());
D3DXVec3TransformNormal(&ZAxis, &ZAxis, &GetRotationMatrix());
#pragma warning(default : 4238)
D3DXMatrixIdentity(&rotationx);
D3DXMatrixIdentity(&rotationy);
D3DXMatrixIdentity(&rotationz);
D3DXMatrixRotationAxis(&rotationx, &XAxis, RotationRequested.x);
D3DXMatrixRotationAxis(&rotationy, &YAxis, RotationRequested.y);
D3DXMatrixRotationAxis(&rotationz, &ZAxis, RotationRequested.z);
CameraRotationMatrix *= rotationx;
CameraRotationMatrix *= rotationy;
CameraRotationMatrix *= rotationz;
RecomputeVPMatrix();
}
私はジンバルロックが利用可能な回転を減らし、変更しなかったと考えました。さらに、Quaternionsを使用しました。 – Puppy
ああ、あなたがクォータニオンを使っているのを知らなかった。コードスニペットを投稿すると、問題がより明確になるでしょう。あなたは今までにおそらくそれを自分で解決したでしょう。 – ThePragmatist