9

趣味のゲーム エンジンで回転に軸角度ベクトルを使用して実験しています。これは、ラジアン単位の回転の長さを持つ、回転軸に沿った 3 成分ベクトルです。私が好きな理由:

  • quats や回転行列とは異なり、実際に数字を見て、頭の中で回転を視覚化できます
  • それらは四元数や行列よりもメモリが少し少ないです。
  • -Pi から Pi の範囲外の値を表すことができます (これは、角速度を保存する場合に重要です)

ただし、角速度に基づいてすべてのオブジェクト (数万) の回転を更新するタイトなループがあります。現在、2 つの回転軸ベクトルを結合する唯一の方法は、それらをクォータニオンに変換し、乗算してから、結果を軸/角度に戻すことです。プロファイリングを通じて、これがボトルネックであることを特定しました。もっと簡単なアプローチを知っている人はいますか?

4

4 に答える 4

2

回転ベクトルが単位長である場合、表現はクォータニオン回転と同等です。固定されたクォータニオンデータ構造を使用したくない場合は、回転ベクトルが単位長であることを確認してから、同等のクォータニオン乗算/相互計算を実行して、総回転を決定する必要があります。掛け算や足し算の数を減らすことができるかもしれません。

角度が変化している唯一のものである場合(つまり、回転軸が一定である場合)、角度の線形スケーリングを使用するだけで、必要に応じて、[0、 2π)。したがって、時間t 0で初期回転角θ0から開始して、1秒あたりαライダンの回転速度がある場合、時間tでの最終回転角は次の式で与えられます

θ(t)=θ0 + α(tt0 mod2π

次に、その回転をベクトルのコレクションに適用します。

これらのいずれもパフォーマンスを向上させない場合は、缶詰のクォータニオンライブラリの使用を検討する必要があります。これは、そのようなものが、検討しているアプリケーションの種類に合わせてすでに最適化されているためです。

于 2010-11-30T21:54:04.267 に答える
2

それらを角度軸の値として保持できます。

(anti-symmetric)角度軸の値を使用して外積行列を作成し、(x,y,z)この行列の要素に角度の値を掛けて重み付けします。これらの外積行列をすべて合計し(one for each angle axis value)、行列指数を使用して最終的な回転行列を見つけます。

行列 A がこの外積行列 (角度軸の値から作成) を表す場合、

exp(A)は回転行列 に相当しR (i.e., equivalent to your quaternion in matrix form)ます。

したがって、

exp (A1 + A2) = R1 * R2

おそらく最終的にはより高価な計算になります...

于 2013-10-21T19:32:17.957 に答える
1

回転を表すには、スケーリングされたベクトルではなく、ユニットクォータニオンを使用する必要があります。3つのパラメーターを使用した回転の表現は、ある時点で問題が発生する(つまり、特異である)ことを(私ではなく)示すことができます。あなたの場合、あなたのベクトルの長さが0(つまりアイデンティティ)で、長さが2pi、4piなどの場合に発生します。これらの場合、表現は特異になります。ユニットクォータニオンと回転行列にはこの問題はありません。

あなたの説明から、あなたは数値積分の結果としてあなたの回転状態を更新しているように聞こえます。この場合、回転速度(\ omega)をクォータニオン速度(q_dot)に変換することにより、回転状態を更新できます。クォータニオンをq=[q0 q1 q2 q3]として表すと、q0はスカラー部分になります。

q_dot = E*\omega

どこ

    [ -q1 -q2 -q3 ]
E = [  q0 -q3  q2 ]
    [  q3  q0 -q1 ]
    [ -q2  q1  q0 ]

次に、更新は次のようになります

q(k + 1)= q(k)+ q_dot * dt

簡単な統合のため。必要に応じて、別の積分器を選択できます。

于 2010-12-01T04:39:17.273 に答える