2010-11-30 10 views
7

私は趣味ゲームエンジンの回転に軸角度ベクトルを使用して実験しています。これは、回転軸に沿った3成分ベクトルで、回転の長さはラジアンです。クアットまたは回転行列とは違って、私は実際に数字を見ることができますし、彼らは四元または行列よりも少し小さいメモリです 回転軸ベクトルを結合する

  • 私の心の中で回転を視覚化

    • :ので、私は彼らが好き。
    • 私はパイの-Piの範囲外の値を表すことができます(私は角速度を保存する場合、これは重要です)

    しかし、私は(私のオブジェクトのすべての回転を更新タイトなループを持っている数十数千分の1)の角速度に基づいている。現在、2つの回転軸ベクトルを結合するために私が知っている唯一の方法は、それらを四元数に変換し、乗算し、結果を軸/角度に変換することです。プロファイリングを通じて、私はこれをボトルネックと認識しました。誰かがもっと簡単なアプローチを知っていますか?

  • +0

    を意味するのでしょうか?基本的には、[φ、psi、θ]が「RX(φ)* RY(psi)* RZ(θ)」を表すようなオイラー角である。その場合は、3x3回転行列を作成する方法を見つけてそこから軸の角度を引く必要があります。 – ja72

    +0

    いいえ、私はオイラー角を使用していません。これは、ベクトルの長さが角度である軸の角度です。 – Dwayne

    答えて

    2

    あなたの回転ベクトルが単位長であれば、表現はquaternion rotationに相当します。缶詰の四元数データ構造を使用したくない場合は、回転ベクトルの単位長さを確認して、それに相当するquaternion multiplications/reciprocal computationを計算して、集計ローテーションを決定してください。乗算や加算の回数を減らすことができます。

    角度が変化している唯一のもの(つまり、回転軸が一定)の場合、角度の線形スケーリングを使用して、希望する場合はmodを範囲[0,2,)。あなたは毎秒α raidansの回転速度を持っているのであれば、時間t でθ の初期角度から始め、その後、時刻tで、最終的な回転角度は次式で与えられます。

    θ(トン)= θ + α(TT )2 π

    MODそれからちょうどベクトルのあなたのコレクションにその回転を適用します。

    パフォーマンスが向上しない場合は、使用しているアプリケーションの種類に合わせて最適化されているので、缶入り四元数ライブラリの使用を検討する必要があります。

    +0

    1.私のベクトルは単位長ではありません。それらの長さは、回転角度をラジアンで表したものです。私は四元数データ構造を使用します。 3.多くの場合、私のアングルだけが変わるわけではありませんが、これは良い最適化チェックになります。 – Dwayne

    +0

    "等価四元数乗算/逆数計算を実行して総計回転を決定する"これは軸角度から四元数への変換と同じですか?私の現在の実装はMatrix and Quaternion FAQ(http://www.j3d.org/matrix_faq/matrfaq_latest.html)からのものです。 – Dwayne

    1

    回転を表すには、スケールされたベクトルではなく、単位四元数を使用する必要があります。 3つのパラメータを使用する回転の表現は、ある時点で問題に遭遇する(すなわち単数である)ことを(私自身ではなく)示すことができる。あなたの場合、ベクトルの長さが0(つまり同一性)で長さが2pi、4piなどの場合に発生します。これらの場合、表現は特異になります。単位四元数および回転行列にはこの問題はありません。

    あなたの説明から、数値積分の結果としてローテーション状態を更新しているようです。この場合、回転率(\ omega)を四元数(q_dot)に変換することで、回転状態を更新することができます。

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

    次に、あなたの更新が

    Q(K + 1となる

    q_dot = E*\omega 
    

    :我々はQ0次いでスカラー部分であるQ = Q0とQ1とQ2はQ3]として自分の四元数を表している場合)= q(k)+ q_dot * dt

    単純な統合のため。あなたが選んだ場合は、別のインテグレータを選ぶことができます。

    +0

    回転が特異になることは何を意味し、どのような問題が起こりますか? – Dwayne

    +1

    問題が発生する場合もあります。そのような場所では、自由度を失うことになります。これはつまり、表現と別の表現(四元数)間のレートを変換する場合、変換行列(つまりヤコビ行列)が特異である(逆変換できない)ことを意味します。 – Commodore63

    2

    角度軸の値として保持できます。

    角度軸の値(x,y,z)を使用して外積の(anti-symmetric)行列を構築し、この行列の要素に角度の値を掛けて重み付けします。ここで、これらの交差積行列(one for each angle axis value)を合計し、指数行列を使用して最終回転行列を求める。

    行列Aは(角度軸値から構築された)は、このクロス積行列を表すならば、

    exp(A)は回転行列R(i.e., equivalent to your quaternion in matrix form)と等価です。それは3つの値は、3つの直交軸の周りで順次ローテーションを表すことが

    、おそらく

    exp (A1 + A2) = R1 * R2 
    

    最後には、より高価なcalucation ...