四元数とワールド軸を中心とした回転


11

免責事項:私はプロのゲームプログラマーであり、ほとんどの場合、四元数を使用しますが、黒魔術に近いです。私は数学に比較的慣れていますが、虚数はいつも私を混乱させました。私はクアットを有用なものとして扱い、乗算を2回以上逆転させる傾向があります。限られた成功を収めているマトリックスと同じように、それらについて推理しようとします。

とにかく...。

私を困惑させるのは次のとおりです。ローカル軸を中心にオブジェクトを回転させたい場合、適用したい回転を表すクォータニオンをその回転に掛けます。したがって、ローカル空間での回転です。

ワールドスペースの軸を中心に回転させたい場合、私の推論は次のとおりです。ワールドスペースでの回転をクォータニオンとして考えます。オブジェクトの回転の逆数をこの四元数で乗算します。これにより、ローカルスペースでの世界ローテーションが実現します。この新しいクォータニオンで回転を乗算します。すなわち:newRot = oldRot *(oldRot * worldRotの逆)

しかし、私がする必要があるのは、newRot = oldRot *(inverse oldRot * worldRot)* oldRotです。

なぜ逆クアットと乗算した後、それを適用する前に自分のクアットと乗算する必要があるのですか?完全に正当な理由があるに違いないが、私はそれから抜け出す方法を推論することはできず、それは私にとって一体でイライラしている。私はさまざまなFAQを試しましたが、ほとんどは数学の奥深くに行き、わかりにくくしました。

5歳のように説明してくれる人はいますか?


それは少し行列の翻訳とroatationsようにされていません(つまりあなたは、中央にあなたのオブジェクトを移動、回転して、あなたはその周りに自己アイテムを回転するときに戻って移動する必要があります。Minv_transl * Mrot * Mtranslは)
Valmond

I try to reason about them like I would with matrices-その後、あなたは正しい軌道に乗っています。行列を使用してオブジェクトの軸と世界の軸を中心に回転する方法を理解している場合は、クォータニオンを使用して同じことを行うことができます。乗算の順序は、行列と四元数の両方で同じです。
Maik Semder、2011

回答:


11

四元数は関連付けられています。

あなたの解決策は次のとおりです:

newRot = oldRot * (inverse oldRot * worldRot) * oldRot

これは次と同じです:

newRot = oldRot * inverse oldRot * worldRot * oldRot

これは次と同じです:

newRot = identity * worldRot * oldRot
newRot = worldRot * oldRot

これにより、実際に起こっていることに戻ることができます。

localTransformed = oldRot * rot
worldTransformed = rot * oldRot

申し込みの順番が変わりました、それだけです。行列に戻って、オブジェクト行列を変換行列に適用し、それを新しいオブジェクト行列として保存すると、それがローカル空間変換になります。変換行列をオブジェクト行列に適用して保存すると、それが世界変換になります。それはすべてアプリケーションの順序に関するものであり、それ以上のものではありません。


1
最初の部分の+1、2番目の部分は少し誤解を招くものです。「localRot」や「worldRot」ではなく、「rot」だけを最後のコードサンプルで使用すると、例がより明確になります。それ以外の場合は、腐敗自体がとにかく異なることを意味します。ただし、違いは、異なる四元数(「localRot」と「worldRot」)ではなく、乗算順序にのみあります。'localTransformed'および 'worldTransformed'は、 'rotatedAroundLocalAxis'および 'rotatedAroundWorldAxis'のほうが適切です。それ自体が方程式を説明し、いくつかの欠陥がある最後の段落を時代遅れにするでしょう。
Maik Semder、2011

最後の段落の欠陥:マトリックスと変換の違い(どちらも同じであり、互換性があるため、混乱を防ぐためにマトリックスだけを使用する方が良い)と「ローカル空間変換」と「世界変換」という用語:つまり、最初の方程式はオブジェクトのローカル軸を中心に回転した後の「ローカルから世界への行列」を与え、2番目の方程式はワールド軸を中心に回転させた後の「ローカルから世界への行列」を与えます。どちらの場合でも、得られるのは単に「ローカルから世界への行列」です。ただし、最初の部分には、分析のためにとにかく+1があります。
Maik Semder、2011

+1 @Maikおそらく、回転と乗算の順序の問題との間の無関心をさらに明確にするために、別の答えを書くことができますか?いずれにせよコメントをありがとう!
Max Dohme 2011

ああ、今は理にかなっています。クォータニオンの乗算が連想的であることを知りませんでした(たぶん、FAQにあります)。実際、回転とそれは逆に相互に打ち消し合い、必要な洞察を与えてくれました。左は基本的に「親空間で回転を適用」または「ローカル空間で回転を適用」と言います...マトリックスと違いはありません。あなたがそれを見るとかなり小学校!ありがとう!
Kaj 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.