問題タブ [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.
c++ - クォータニオン -> オイラー角 -> 回転行列の問題 (GLM)
シーンの説明を含むファイルをロードし、OpenGL を使用して表示するプログラムを作成しています。私はすべての数学演算に GLM を使用しています。シーン ファイル内の回転は、クォータニオン形式で保存されます。私のシーン管理システムはオブジェクトの回転をオイラー角の形式で取得し、これらの角度は後で描画時に回転マトリックスに変換されます。
したがって、ロード プロセスはクォータニオン回転を取得し、それらをオブジェクト クラスに格納するためにオイラー角に変換し、次にこれらのオイラー角を描画用の回転行列に変換します。glm::eulerAngles と glm::eulerAngleYXZ 関数を (それぞれ) 使用して、これら 2 つの操作を実行しています。
ただし、間違った結果が得られます。たとえば、クォータニオン {0.500 -0.500 0.500 0.500} (これは WXYZ) を正しく理解していれば、+Z 軸から +Y 軸への矢印の回転を表す必要があります。しかし、プログラムを実行すると、+X 軸に沿った矢印が表示されます。
四元数の理解に何らかの欠陥があると思いますが、中間のオイラー角形式をスキップすることで、期待どおりの結果を得ることができます。glm::toMat4 を使用してクォータニオンを回転行列に直接変換することで、+Z 矢印が +Y を指す回転が得られます。
どちらの方法も単純で正しいように見えるため、これら 2 つの異なる出力を調整するのに苦労しています。私の質問を簡単にするために、これらの 2 つの一見同等の方法が異なる結果をもたらすのはなぜですか。
c# - Unity3d エンジンのような Euler <=> Quaternion 間の変換
私は 2 つの例を使用しました (こちらのサイトからも) が、結果は Unity と言ったものと同じではありません。
Quaternion.Euler と .eulerAngles は Unity 関数です。FromQ は特異点チェックを実行しませんが、FromQ2 は実行します。
結果:
コードはこちら: http://pastebin.ru/eAlTHdYf
誰でもこのコードを修正できますか? Unity 関数が返す値と同じ値を返すコードが必要です。
アップデート
ここに固定コードがあります: http://pastebin.com/riRLRvch . 両方の機能 (FromQ と ToQ) はうまく機能します。しかし、私は特異点に問題があります。特異点を正しく検出できません。
FromQ は正しい結果を計算できないため、ここに特異点があります。(90, 50, 0) - (0.6, 0.3, -0.3, 0.6) も同様です。
解決策は 1 つだけです。"test" を xw-yz として計算します。しかし、これが正しいかどうかはわかりません。
修正方法は?
rotation - ローカル Y 軸に沿った 2 つのオイラー角の間のスピンを計算します
2 つの回転オブジェクトがあるとします。オイラー角は次のとおりです。
どちらも回転順序を使用しますXYZ
。回転がゼロのとき、ローカルY-axis
は上を向いています。
私は彼らの地元の周りのスピンの違いを得ようとしていますY-axis
。すべての方向が である場合、 と の底部の間にひもがあるかのように接続さObject 1
れます。ひもは何回ぐるぐる回ったり、ねじれたりしますか?Object 2
0,0,0
いくつかの例:
1回ひねる
1/2ツイスト
1ツイスト。(それに取り付けられていた弦について考えてみてください。これも弦のねじれとしてカウントされます)
--
私は向き/回転を調べてきましたが、Quaternions、Euler-Angles、Axis-Angle など、それらを使用するさまざまな方法です。それぞれが一般的にどのように機能するかを知っているように感じますが、これを解決するためのスキルが欠けています。
これを解決する方法についてのアイデアはありますか?
matrix - 変換マトリックスから 3D オブジェクトの回転角度を取得する方法
x、y、z 軸に沿って自由に回転できる 3D オブジェクトがあり、変換行列として保存されます。回転の順序が不明で、オブジェクトが 3 回以上回転する場合 (例: オブジェクトを x-60 度、y-30 度、z-45 度回転し、次に x->30 度回転する場合) )、変換行列から回転した角度を抽出することは可能ですか?.回転のシーケンスがわかっている場合、角度を取得できることは知っていますが、最終的な変換行列だけを持っていれば、他には何もありませんか?変換行列から回転角度 (x、y、および z) を取得できますか?
matlab - 2x2 ZYZ回転行列からのオイラー角?
ランダムな 2x2 ZYZ 回転行列からオイラー角を見つけるにはどうすればよいですか? すべての SU(2) 行列は、ZYZ 分解を使用して、オイラー角に基づく 3 つの行列の積として分解できることがわかっています。ウィキペディアでオイラー角について:
「同様の 3 角度分解が、複雑な 2D 空間における回転の特別なユニタリ グループである SU(2) に適用されますが、β の範囲が 0 から 2π であるという違いがあります。これらはオイラー角とも呼ばれます。」
私はmatlabで方程式系を試してみましたが、場合によっては解決策が見つかりました(パウリ行列)が、他の多くの場合はそうではありませんでした。ランダムな SU(2) 行列を見つけることはありません。
誰でも一般的なアプローチを知っていますか?私はすでに 3x3 マトリックスを実行する方法を見つけましたが、2x2 ZYZ については知りませんでした。
よろしくお願いします!
c++ - 回転行列から角度を計算する方法
私は、オブジェクトが最初の画像からある程度回転している単一のオブジェクトの2つの画像を使用しています。
各画像のPOSEを計算し、Rodergues()を使用して回転ベクトルをMatrixに変換しました。では、最初の位置からどれだけ回転したかを計算して確認するにはどうすればよいですか?
私は多くの方法を試しましたが、答えは近くありませんでした
編集:私のカメラは固定されており、オブジェクトだけが動いています。
math - 2つの3Dベクトル間のオイラー角
2つの3Dベクトル間の3つのオイラー角をどのように見つけますか?ベクトルが1つあり、その回転を取得したい場合は、通常、このリンクを使用できます。回転を計算して3Dポイントを確認しますか?
しかし、お互いに応じてそれらを計算するとき、どうすればそれを行うことができますか?
rotation - Panda3D:X軸が空間内の位置を指すようにオブジェクトを回転させる方法は?
fromObj
3D ポイントの場所 (たとえば ) で NodePath に格納されたオブジェクト (たとえば) がありますfromPoint
。そのヘディング ピッチ ロール (HPR) は(0,0,0)
です。toPoint
X軸が空間の別の点を指すように回転させたいです。この回転を実現する HPR を計算し、それを他の目的に使用したいだけです。
を試してみfromObj.lookAt(toPoint)
ましたが、これは Y 軸を に向けていtoPoint
ます。その X 軸が を指すようにしtoPoint
ます。
X 軸が空間内 の特定の位置を指すようにオブジェクトを回転させるHPRを計算するにはどうすればよいですか?
注: 私は StackOverflow に関するこの質問を認識しています: 回転を計算して 3D ポイントを見てください? ただし、既存の Panda3D API を使用するソリューションを探しており、その結果を Panda3D HPR 形式で取得したいと考えています。
quaternions - 試行錯誤して思いついたのですが、その理由を教えてください。
まず、この質問がここでいいのか分からず、よくある質問を確認したところ、「他の人に説明してほしい」という質問があることがわかりました。
主な問題は、アプリケーションですべてのオブジェクトの回転を 2 回保存する必要があることです。これは一方で、私がBullet Physicsを使用する物理シミュレーションがその表現を保存するためです。一方、光やクエスト ターゲットなど、物理シミュレーションに含まれているかどうかに関係なく、すべてのオブジェクトに共通する回転を独自に保存します。物理ライブラリに加えて、GLM数学ライブラリを利用しています。
両方の表現を同期する必要があります。ちなみに、位置とスケールは問題ありません。難しいのは、物理シミュレーションは自分の表現が異なるため、単に値をコピーすることはできません。これらの違いをすべて見つけたわけではありませんが、左手と右手の座標系、度とラジアン、および Y 座標のアップと Z アップに関連している可能性があります。
私自身の表現では、オイラー角をglm::vec3
ベクトルに格納するだけです。私は描画に OpenGL を使用しているので、スペースは右利きだと思います。オイラー角の場合、順序が重要です。回転行列を計算するために私がすることは、最初に各成分の行列を作成し、次にそれらをX * Y * Z
順番に乗算することです。さらに、私自身の表現では、正の Y 座標は上向きです。
物理シミュレーションでは、クォータニオンを使用して回転を保存します。いくつかの調査の後、このライブラリではスペースが左利きであるという仮定を読みました。どの座標が上であるか、どの順序でオイラー角が返されるかについての情報はありません。
回転を物理シミュレーションから独自の表現に、またはその逆に変換するコードがここにあります。
試行錯誤でこの汚いコードを見つけましたが、動作します。しかし、ご覧のとおり、否定、コンポーネントのスウィズリング、およびさまざまな四元数型による型変換が見られます。それらの多くは不要であり、タスクははるかに簡単に実行できると思います。
私の変換が機能する理由と、それらを単純化する方法を説明していただけますか? ところで、変換がうまくいかなかった場合にどのように表示されるかを確認したいので、スクリーンショットを示します...