4

このコメントでは、オイラー角を決して使用してはならないことが強く示唆されました。オイラー角、特にジンバル ロックにいくつかの制限があることは理解していますが、オイラー角がない場合に一般的に使用される最適なテクニックまたは一連のテクニックを知りたいですか?

このトピックに関するほとんどの議論には、オイラー角から四元数への変換が含まれますが、それは簡単なことです。しかし、オイラー角をまったく使用せずに回転を行うことについて私が読んだ唯一の方法は、「Game Programming Gems」の Stan Melax による記事「The Shortest Arc Quaternion」で説明されているように、次の手法を使用して 2 つのベクトルから四元数を作成することです。

template <typename T>
inline QuaternionT<T> QuaternionT<T>::CreateFromVectors(const Vector3<T>& v0, const Vector3<T>& v1)
{

    Vector3<T> c = v0.Cross(v1);
    T d = v0.Dot(v1);
    T s = std::sqrt((1 + d) * 2);

    QuaternionT<T> q;
    q.x = c.x / s;
    q.y = c.y / s;
    q.z = c.z / s;
    q.w = s / 2.0f;
    return q;
}

これは、リンクされたコメントで言及されている方法ですか?

4

3 に答える 3

4

オリエンテーション

方向は、変換が座標系内でオブジェクトを方向付ける方法です。方向は、位置やスカラーのような絶対量です。向きは概念的には値です。また、表現に応じて、向きに適用できる操作があります。

ベクトルやスカラーとは異なり、方向はさまざまな方法で表すことができます。

「オイラー角を使用する」とはどういう意味ですか?

オイラー角は、3 つの固定された直交軸を中心とした一連の 3 つの回転です。これらが適用される順序は重要であり、一般に慣例によって確立されています。

「オイラー角を使用する」とは、コードがオブジェクトの向きを格納および操作する方法がオイラー角であることを意味します。これらの角度を最終的に構成して行列を生成する方法は重要ではありません。重要なのは、コードが向きを 3 つの角度として扱うことです。たとえば、方向に回転オフセットを適用すると、それは回転角度のオフセットとして提供され、これらのオフセットは保存されているオイラー角度に直接適用されます。

「マトリックスを使用する」とはどういう意味ですか?

誰もそんなことを言っていないことは知っていますが、ここで言いたいことがあります。

「行列を使用する」とは、コードがオブジェクトの向きを格納および操作する方法が回転行列であることを意味します。コードの一部がオブジェクトを回転させたい場合、左側または右側にマトリックスを適用します。その行列が軸回転によって計算されたとしても、コードは角度ではなく、行列に対して基本的な操作を実行しています。

「クォータニオンを使用する」とはどういう意味ですか?

この議論の目的のために、「クォータニオン」は、方向をエンコードするために使用される 4 要素の単位ベクトルです。クォータニオンには、合成や反転などの行列のような操作を実行できます。向きを適切にエンコードするには、クォータニオンを正規化したままにする必要があります。

「クォータニオンを使用する」とは、オブジェクトの方向と操作をクォータニオンとして保存していることを意味します。オリエンテーションに関するすべての操作は、最も基本的なレベルで、四元数の計算を扱っています。

向きの調整方法

オイラー角は、(理論的には) 直観的に調整できるため、よく使用されます。角度を増減するだけです。オブジェクトを X 方向に -10 度回転させたい場合は、X 軸の回転から 10 を引くだけです。しかし、それらはひどいので使いたくないので、他の方向表現を見てみましょう。

方向をマトリックスとして調整するには、2 つのことを行う必要があります。現在の向きにオフセット回転行列を乗算する必要があります (X 軸で -10 度回転する場合は、そのための角度/軸行列を作成し、それを右乗算します)。次に、コンピューターの精度は有限であるため、行列を再度直交正規化する必要があります。2 番目のステップを実行しないと、行列は最終的に正規直交でなくなり、方向性もなくなります。

行列の直交正規化は困難です。これが、代わりにクォータニオンを使用する理由 (の一部) です。四元数の正規化は簡単です。それは単なる 4 要素ベクトルの正規化です。また、クォータニオンと行列には類似の操作があるため、同じ数学が両方で機能します。したがって、それらはほとんど同じように見えます。

于 2013-06-11T17:29:08.593 に答える
1

3D のオブジェクトの回転を記述する数学的モデルがいくつかあります。オイラー角モデルはその 1 つにすぎません。通常、人々がオイラー角について話すとき、実際にはテイト ブライアン角について話しますが、オイラーは、たとえば ZXZ 回転など、最初の角度が複製されるモードのみを提案しました。意図したように、つまり静的な表現のためにヘムを使用する場合、オイラー角に特に問題はありません。または、実際にジンバルのように機能する機械的な回転数には問題ありません。

オイラー角には主に 2 つの欠点があります。1 つ目は、オイラーの角度による数値表現をよく理解していると人々が考えることが多いということです。実際には、特殊な 3 軸の回転が 2 つと非常に少ない場合にのみ真であり、限られたケース以外では少し疑問があります。2 つ目は、オイラー モデルが回転空間を均一に満たしていないため、意味のある補間を行うことができないことです。これは、数値空間の一部の領域のサイズが異なることを意味します。長方形の地図が球体上でどのように歪むか想像してみてください。

今日私たちの多くは、グラフィック用のアニメーションや、この補間が最も重要なシミュレーションのエンジニアリングを行っています。つまり、オイラー モデルはほとんどのタスクにはあまり適していません。オイラー モデル空間で補間を考えようとして人々が頭に浮かぶ奇妙なことの 1 つは、実際には一度に 3 方向を中心に回転できるということです。しかし、これは物理的に不可能で、3D 空間で 1 回の回転しかありません。

現在、使用できる他のモデルはほとんどありません。アフィン行列をボーナスとして使用して、すべての座標系を定義することができます。しかし、他のすべてのモデルの中で、これは最悪の解決策であり、1 つの軸だけでも意味のある数値で補間されません。次に、結果を格納するための優れたモデルです。ベクトルと回転に基づく軸角度を使用できます。これは、回転を表す物理的に非常に正気な方法ですが、最短経路を解決する際に特定の問題があります。現在、補間に最適なモデルは、一種の軸角度でエンコードされた変な四元数である可能性があります。これには、考えられるすべての回転の正確に 2 倍のスペースがあるなど、いくつかの興味深い特性があり、2 つのポーズ間の最短回転と最長回転を解決するために使用できます。

それで、あなたはそれを持っています。回転を記述するオイラー モデルに問題はありません。非常に小さなサブセットを除いて、数値補間を行う必要がない限り。これはたまたま空中で飛行機が使用するものです。または、均一なスペースが必要ない場合、回転のランダムな生成などは必要ありません。

あるモデルで値を設定し、別のモデルで補間できないということはありません。

于 2013-06-11T17:02:37.677 に答える
0

ところで、理想的には、元のコメンター @NicolBolas のような権威ある専門家からの回答を期待しています。しかし、彼は今のところあなたのコメントの質問に答えていないので、私はそれを突き刺します.

ここでの混乱は、「オイラー」角とその他の角の意味をめぐるものなのだろうか。

「このトピックに関するほとんどの議論には、オイラー角から四元数への変換が含まれます」とあなたは言います。しかし、それらは本当にオイラー角から変換されているのでしょうか?

そのコメントの作者は明らかにこのチュートリアルの作者です。チュートリアルの例 8.1 で、彼は軸と角度からの四元数の式を示しています。これは、「オイラー角から四元数への変換」と言っているようなものですか? 明らかに、角度からクォータニオンを作成してはならないという意味ではありませんでした。

ウィキペディアのオイラー角の定義から、それらは 3 になります。言い換えれば、角度をオイラー角にするのは、それらを組み合わせて向きを表す方法です。コメントが言及したのは、オイラー角であるpitchAccumとyawAccumで回転を累積し、それらの角度をそれぞれクォータニオンに変換してから、クォータニオン乗算を使用して組み合わせるという事実だったと思います。

代わりに、方向を表すために最初にクォータニオンを作成した場合。次に、オイラー角のpitchAccumとyawAccumではなく、クォータニオン自体に方向状態を蓄積すると、@NicolBolas(Jason)が提唱していることを行うことになります。

于 2013-06-11T15:24:44.963 に答える