2011-01-07 11 views
0

編集:私はこの特定の問題を解決しましたが、かなり似通った基本的な説明で新しいものを作成しました。カメラを何度も回転させた後、カメラが回転しないようにすると、ロールが始まります。私はヨーとピッチをマウスに縛っているので、ロールに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(); 
} 

答えて

1
+0

私はジンバルロックが利用可能な回転を減らし、変更しなかったと考えました。さらに、Quaternionsを使用しました。 – Puppy

+0

ああ、あなたがクォータニオンを使っているのを知らなかった。コードスニペットを投稿すると、問題がより明確になるでしょう。あなたは今までにおそらくそれを自分で解決したでしょう。 – ThePragmatist

0

どのように正確にあなたがあなたのローテーションを構成していますか?ヨーとピッチだけが必要な場合は、別の側からの回転を組み合わせることで、望ましくない回転を避けるのは簡単です。

たとえば、とyaw_diffクォータニオンを与える新しいマウス入力がある場合は、my_rotation = yaw_diff * my_rotation * pitch_diffを入力します。そうすれば、my_rotationの「左半分」は常にヨーとなり、「右半分」は常にピッチになります。そしてあなたは決してロールコンポーネントを手に入れません!

+0

私はマウスからラジアンの角度を取り、既存のカメラの回転を使ってX、Y、Z軸を既存のカメラ軸に変換し、与えられた角度だけ回転させてから、それらを既存の回転に掛けます。 – Puppy

+0

それで、あなたはロールコンポーネントを手に入れています。ヨーピッチのヨーイング回転は、通常、あなたに与えます。ヨーデルタ「yN」とピッチデルタ「pN」を持っているなら、 'y1 * y2 * ... * yN * p1 * p2 ... * pN'のような回転が必要です。 * y2 * p2 * ... * yN * pN'となる。基本的に、あなたはヨーヨーw.r.tをしたいです。グローバル座標系に、ピッチをカメラに合わせます。 – ltjax

関連する問題