問題タブ [euler-angles]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
math - クォータニオン ベースの 3D カメラは、クォータニオンまたはオイラー角を蓄積する必要がありますか?
そこで、新しいプログラマー向けに Quaternion ベースの 3D カメラを作成したので、統合して使用を開始するのは非常に簡単です。
開発中、最初はユーザー入力をオイラー角として受け取り、そのフレームの入力に基づいてクォータニオンを生成しました。次に、カメラのクォータニオンを入力用に生成したもので乗算します。理論的には、入力回転をカメラの回転の現在の状態に単純に追加するだけで、物事はすべて太くて幸せになります。クォータニオンのみを保存および追加しているため、これを「クォータニオンの蓄積」と呼びましょう。
しかし、この方法には問題があることに気づきました。使用すればするほど、たとえばヨーなどの 1 つのオイラー角だけで回転していたとしても、反復を繰り返すうちに別のオイラー角 (ピッチなど) で回転し始めます。それはわずかでしたが、かなり受け入れられませんでした。
そこで、さらに調査を行ったところ、オイラー角を蓄積する方がよいという記事を見つけたので、カメラは現在の回転をオイラー角として保存し、入力はフレームごとに単純に追加されます。次に、各フレームからクォータニオンを生成し、それを使用して回転行列を生成します。これにより、不適切な軸への回転ブリーディングの問題が修正されました。
では、Stackoverflow のメンバーはこの問題について洞察を持っていますか? それは物事を行うための適切な方法ですか?
language-agnostic - クォータニオン回転をオイラー角回転に変換するアルゴリズムはありますか?
回転の四元数表現をオイラー角表現に変換するための既存のアルゴリズムはありますか? オイラー表現の回転順序は既知であり、6 つの順列 (xyz、xzy、yxz、yzx、zxy、zyx) のいずれかになります。固定の回転順序 (通常は NASA の見出し、バンク、ロール規則) のアルゴリズムを見てきましたが、任意の回転順序のアルゴリズムは見たことがありません。
さらに、1 つの方向に対して複数のオイラー角表現が存在するため、この結果はあいまいになります。これは許容されます (向きがまだ有効であるため、ユーザーが期待するものとは異なる可能性があります)。ただし、回転制限 (つまり、自由度の数と各自由度の制限) を考慮し、これらの制約を考慮して「最も賢明な」オイラー表現を生成しました。
この問題 (または類似の問題) が IK または剛体ダイナミクス ドメインに存在する可能性があると感じています。
明確にするために、四元数からいわゆる「テイト・ブライアン」表現に変換する方法を知っています。これを「NASA」規則と呼んでいました。これは、zxy の回転順序です (「Z」軸が上であるという慣例を想定しています)。すべての回転順序のアルゴリズムが必要です。
おそらく解決策は、zxy 順序変換を取得し、そこから他の回転順序の 5 つの変換を導出することです。もっと「包括的な」解決策があることを望んでいたと思います。いずれにせよ、既存のソリューションを見つけることができなかったことに驚いています。
さらに、これはおそらく完全に別の問題であるはずですが、変換 (もちろん既知の回転順序を前提として) は1 つのオイラー表現を選択しますが、実際には多くのオイラー表現があります。たとえば、回転順序が yxz の場合、(0,0,180) と (180,180,0) の 2 つの表現は同等です (同じ四元数が生成されます)。自由度の制限を使用して解を制約する方法はありますか? IK やリジッド ボディ ダイナミクスと同じように?つまり、上記の例で、Z 軸に関する自由度が 1 つしかない場合、2 番目の表現は無視できます。
このpdfのアルゴリズムである可能性のある1つの論文を追跡しましたが、論理と数学を理解するのが少し難しいと告白しなければなりません. 確かに他の解決策はありますか?任意の回転順序は本当に珍しいですか? 骨格アニメーションとクォータニオン補間を可能にする主要な 3D パッケージ (Maya、Max、Blender など) はすべて、この問題を正確に解決しているのでしょうか?
math - 3D ポイントを見るために回転を計算しますか?
3D オブジェクトが任意の 3D ポイントに面するように、2 つの角度 (ヨーとピッチ) を計算する必要があります。これらの回転は、最初の回転 (下の図に基づいて Z とします) の後、Y 軸もオブジェクトと共に回転するため、「オイラー」回転として知られています。
これは私が使用しているコードですが、完全には機能していません。地面 (Y = 0) にある場合、オブジェクトはポイントに面するように正しく回転しますが、ポイントを Y 方向に上に移動するとすぐに、回転が正しく見えません。
点から 2 つのオイラー角を計算する方法を知っていますか?
下の写真は、私が回転する方法を示しています。これらは私が計算する必要がある角度です。(唯一の違いは、Z、Y、X ではなく、X、Y、Z の順序でオブジェクトを回転させていることです)
これが私のシステムです。
- 座標系は、x = 右、y = 下、z = さらに奥です。
- オブジェクトはデフォルトで (0,0,1) にあり、後ろ向きです
- 回転は X、Y、Z の順で、X の回転はピッチ、Y はヨー、Z はロールです。
math - オイラー角とクォータニオンの向き
wintracker II デバイスのクォータニオン方向出力をオイラー角出力のみに変換する方法。Wintracker II デバイスがオイラー角とクォータニオンの向きを出力するためです。オイラー角のみ出力したい。
math - どのオイラー回転を使用できますか?
私は2つのデカルト座標を持っています。xyzとBIG XYZがあります。これらを互いに平行にしたいのです。たとえば、x は X に平行、y は Y に平行、z は Z に平行です。私は回転行列を使用していますが、多くの異なる回転行列があります。たとえば、xyzデカルト座標に3Dポイントがあり、それはAと呼ばれ、デカルト座標をBIG XYZに変更し、この座標でBと呼ばれる同じ3Dポイントを見つけたいとします。今までは大丈夫です。しかし、別の回転行列を使用すると、ポイントが変更されました。私に何ができる?どのオイラー回転を使用できますか?
math - 座標の利き手を変更するには?
オイラー座標 E1 = (x1, y1, z1, yaw1, ピッチ 1, ロール 1) から E2 = (x2, y2, z2, ヨー 2, ピッチ 2, ロール 2) に変換する方法 x, y, z は点の座標であり、 yaw、pitch、roll 原点が点であるベクトルの方向/向き。yaw は y 周り、pitch は x 周り、roll は z 周りです。それらはその順序で実行されます。ヨー 0 は平面 xy に垂直です (E1 では z と反対で、E2 では z に等しい)。
E1 は右手のスペースを使用し、E2 は左手のスペースを使用します。どちらも原点が同じで、y (上) と z (画面内) の方向が同じです。それらは、E1 では左に、E2 では右にある x だけ異なります。また、正の回転方向も異なります。
スカラー表現を保持し、同等の WPF Matrix3d 表現との間で変換するカスタム型があります。
math - 3D Math: Look と Up の直交ベクトルからバンク (ロール) 角度を計算する
これがこの質問をするのに適切な場所であることを願っていますthis one と同じですが、グラフィックではなく純粋な数学として表現されています(少なくとも、問題を正しく数学に翻訳したことを願っています)。
考慮事項:
- 直交する 2 つのベクトル: Up (ux、uy、uz) と Look (lx、ly、lz)
- Look に垂直な平面 P (したがって Up を含む)
- Y1 は、ルックに沿った Y (垂直軸) の P への投影です。
質問: Y1 と Up の間の角度の値は?
数学者が同意するように、これは非常に基本的な質問ですが、Y を P に射影する方法を視覚化することができずに、少なくとも 2 週間頭を悩ませてきました。
行列を使用したソリューションではなく、三角関数のソリューションを探しています。ありがとう。
編集:ルックでなければならない回転軸に対して、角度の符号を決定する必要があることがわかりました。リンクされた質問に最終的なコードを投稿しました(上記のリンクを参照)。助けてくれた人に感謝します。お時間をいただきありがとうございます。