問題タブ [quaternions]

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.

0 投票する
3 に答える
4737 参照

math - クォータニオン ベースの 3D カメラは、クォータニオンまたはオイラー角を蓄積する必要がありますか?

そこで、新しいプログラマー向けに Quaternion ベースの 3D カメラを作成したので、統合して使用を開始するのは非常に簡単です。

開発中、最初はユーザー入力をオイラー角として受け取り、そのフレームの入力に基づいてクォータニオンを生成しました。次に、カメラのクォータニオンを入力用に生成したもので乗算します。理論的には、入力回転をカメラの回転の現在の状態に単純に追加するだけで、物事はすべて太くて幸せになります。クォータニオンのみを保存および追加しているため、これを「クォータニオンの蓄積」と呼びましょう。

しかし、この方法には問題があることに気づきました。使用すればするほど、たとえばヨーなどの 1 つのオイラー角だけで回転していたとしても、反復を繰り返すうちに別のオイラー角 (ピッチなど) で回転し始めます。それはわずかでしたが、かなり受け入れられませんでした。

そこで、さらに調査を行ったところ、オイラー角を蓄積する方がよいという記事を見つけたので、カメラは現在の回転をオイラー角として保存し、入力はフレームごとに単純に追加されます。次に、各フレームからクォータニオンを生成し、それを使用して回転行列を生成します。これにより、不適切な軸への回転ブリーディングの問題が修正されました。

では、Stackoverflow のメンバーはこの問題について洞察を持っていますか? それは物事を行うための適切な方法ですか?

0 投票する
8 に答える
38254 参照

c++ - C /C++のクォータニオンライブラリ

C / C ++でのクォータニオン計算に適したライブラリはありますか?

補足:良いチュートリアル/例はありますか?私はそれをグーグルで検索して最初の数ページに行きましたが、おそらくあなたはあなたが共有できる/共有するであろう計算機科学または数学コースからのいくつかのデモ/ラボを持っていますか?

ありがとう

0 投票する
3 に答える
2344 参照

math - 剛体の物理学/変換を手伝ってください

ボディがポイントAとポイントBの間をスライドできるようにするスライダーコンストレイントをインスタンス化します。コンストレイントをインスタンス化するために、2つのボディをコンストレイントに割り当てます。この場合、1つのダイナミックボディを静的な世界にコンストレイントします。スライディングドアを考えてください。 。3番目と4番目のパラメーターは、変換、参照フレームAおよび参照フレームBです。変換を作成および操作するために、ライブラリはクォータニオン、行列、オイラー角をサポートしています。

デフォルトのスライダー制約は、ボディをx軸に沿ってスライドさせます。私の質問は 、2つの変換を設定して、ボディBがそれ自体の原点と空間内の追加の点によって指定された軸に沿ってスライドするようにするにはどうすればよいですか?

素朴に私は試しました:

ただし、クォータニオンは期待どおりに機能していないようです。それらについての私の数学的知識はよくないので、誰かがこれがうまくいかない理由について私に記入してくれるなら、私は感謝するでしょう。何が起こるかというと、体はその方向に直交する軸に沿ってスライドします。Quaternionコンストラクターで回転部分を変更すると、ボディはそのスライド方向を中心に回転します。

編集: フレームワークは弾丸物理学です。2つの変換は、各ボディのローカル座標系に関して、スライダージョイントが各ボディにどのように取り付けられるかです。

Edit2 直交基底を介して変換の回転部分を設定することもできますが、その場合、単一のベクトルから直交基底を確実に構築する必要があります。クォータニオンがこれを防ぐことを望みました。

Edit3 私は次の手順でいくつかの限られた成功を収めています:

ただし、GramSchmidtは常にtrafoBマトリックスの一部の軸を反転し、ドアは上下逆または右から左に表示されます。私はこれを解決するためのよりエレガントな方法を望んでいました。 Edit4 解決策を見つけましたが、上部のベクトルがスライド方向と一致している場合、これによって制約ソルバーに特異点が生じるかどうかはわかりません。

0 投票する
3 に答える
4772 参照

opengl - 回転のためのクォータニオン数学?

gluDisk()シーンで使用してフラットディスクを描画しています。gluDisk()正のZ軸に面するディスクを描画しますが、私が持っている任意の法線に面するようにします。
明らかにglRotate()、ディスクを正しく向き付けるために使用する必要がありますが、回転はどうあるべきですか?これはクォータニオンを使用して計算できることを覚えていますが、数学を思い出せないようです。

0 投票する
4 に答える
2350 参照

opengl - Quanternionsを使用してマウスを使用してFPSのように見回す方法を誰かが説明できますか?

昨日私は尋ねました:ピッチとヨーを呼び出すだけでカメラが回転するのはどうしてですか?

基本的に、「ジンバルロック」のおかげで、ピッチ+ヨーをすると必然的にローリング効果が発生することがわかりました。詳細については、その質問を読むことができます。

私はこれが起こらないようにしようとしています。通常のFPSシューティングゲームで見回すと、カメラがいたるところに転がることはありません。

これが私の現在のパッシブマウス機能です:

これにより、(カーソルを中央に置いたまま)マウスの動きに基づいてカメラがピッチ/ヨーします。オリジナルのカメラクラスもここに投稿しました。

そのスレッドの誰かが、この影響が発生しないようにクォータニオンを使用することを提案しましたが、ウィキペディアのページを読んだ後は、単にそれらを理解していません。

OpenGL / Glutアプリでクォータニオンを作成して、不要なロールなしで「カメラ」を適切に見回せるようにするにはどうすればよいですか?

0 投票する
8 に答える
23189 参照

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 など) はすべて、この問題を正確に解決しているのでしょうか?

0 投票する
9 に答える
100981 参照

math - あるベクトルから別のベクトルへの回転を表す四元数を見つける

u と v の 2 つのベクトルがあります。u から v への回転を表す四元数を見つける方法はありますか?

0 投票する
1 に答える
3955 参照

rotation - Gmod Expression2 での空間回転

Garry の mod で動作をプログラムするために expression2 を使用しています。Expression2 (アーカイブ リンク)

さて、前例を設定します。Gmod にはブロックがあり、3 つの上下と右のベクトルの周りを回転させる方法が完全に失われています (これはローカルです。つまり、45 度ピッチすると、前方ベクトルは 0.707、0.707、 0)。基本的に、3 つのベクトルから、ローカルのピッチ/ロール/ヨーを取得できるようにしたいと考えています。ローカル ピッチ ロール ヨーとは、互いに完全に独立しており、真の 3D 回転が可能であることを意味します。たとえば、ノーズが床と平行になるようにクラフトを配置すると、X、Y、Z は 0、0、0 になります。床に平行に回転させると (World および Local Yaw) 90 度になり、0、0、90 になります。次にピッチ (World Roll、Local Pitch) すると、180 度になり、180、0、90 になります。すでにクォータニオンを調査しましたが、車輪を再発明していると思うので、ここにコードを投稿する必要はないと思います。

うまく説明できていないことは承知していますが、問題はかなり一般的なものだと思います。誰でも提供できるヘルプは大歓迎です。

あ、ジンブルロックも避けたい。

基本的に、上/前/右ベクトルを使用して、クラフトの上/前/右ベクトルの周りの回転を計算します。

簡単に言うと、Gmod 固有の実装ではなく、一般的な実装で問題ありません。

0 投票する
1 に答える
1983 参照

quaternions - 3D ベクトルとしての Wii リモコンの向き

Wiiリモコンには3つの加速度計があるので、加速度計の読み取り値を3Dベクトルに変換することは可能でしょうか.

ピッチ/ロールを抽出するトリックは知っていますが、X および Z 加速度計しか使用しておらず、ジンバル ロックの問題があります。

私が望むのは、クォータニオン回転表現に変換できる完全な 3D ベクトルです。