2

ユーザーのマウス入力から作成された小さな変更でクォータニオンを伝播しています。ここでは、X 軸で追加された回転用のクォータニオンと Y 軸用のクォータニオンを作成し、これらの回転を 1 つのクォータニオンに結合します。これらの変更をカメラのクォータニオンに追加 (追加) し続け、グリンバルロックのないカメラを作成しました (これはまだ狂ったように回転しています :S)

カメラの回転を開始した瞬間、回転行列が拡大縮小し始め、制御不能になります。フレームごとにカメラのクォータニオンを正規化するとすべてが正常に機能しますが、すべてのフレームを正規化する必要はありませんよね? これが数値のずれだとすれば、すぐには見えないのではないでしょうか?

この質問では:四元数と正規化

David Hammen は次のコメントを投稿しました。

正規化は、クォータニオンをユニット 3 球体にドラッグして戻すための手間です。四元数が多様体からずれてしまう理由は、そのオイラー ステップが数学的にある意味で無効だからです。単位四元数は群であり、代数ではありません。単位四元数を使用しないことも無効です。これで、so(3) にチャートがなくなりました。それを正しく行うと (たとえば、リー群の積分法)、四元数はほとんど多様体にとどまります。時々正規化する必要があるかもしれません

オイラー回転から 2 つのクォータニオンを作成しているため、これが劇的な回転エラーの原因である可能性がありますか?

オイラー回転から生成されたクォータニオンは、使用前に常に正規化する必要がありますか?

4

1 に答える 1

0

まず、クォータニオンが NONunit になっているかどうかを調べますか? その中の問題の原因。

疑似コードで、非単位四元数の行列へのロバストな変換を使用することをお勧めします

inline void to_matrix( matrix33& m  )const  {
        float wx, wy, wz, xx, yy, yz, xy, xz, zz, x2, y2, z2;
        float s  = 2.0f/norm_2_sqr(); 
        x2 = x * s;    y2 = y * s;    z2 = z * s;
        xx = x * x2;   xy = x * y2;   xz = x * z2;
        yy = y * y2;   yz = y * z2;   zz = z * z2;
        wx = w * x2;   wy = w * y2;   wz = w * z2;

        m.m[0][0] = 1.0f - (yy + zz);
        m.m[0][1] = xy - wz;
        m.m[0][2] = xz + wy;

        m.m[1][0] = xy + wz;
        m.m[1][1] = 1.0f - (xx + zz);
        m.m[1][2] = yz - wx;

        m.m[2][0] = xz - wy;
        m.m[2][1] = yz + wx;
        m.m[2][2] = 1.0f - (xx + yy);

        //1 division    16 multiplications    15 addidtions    12 variables
    }
于 2014-03-17T11:40:50.227 に答える