2つの3Dベクトル間の3つのオイラー角をどのように見つけますか?ベクトルが1つあり、その回転を取得したい場合は、通常、このリンクを使用できます。回転を計算して3Dポイントを確認しますか?
しかし、お互いに応じてそれらを計算するとき、どうすればそれを行うことができますか?
4 に答える
他の人がすでに指摘しているように、あなたの質問は修正する必要があります。a
ベクトルを と と呼びましょうb
。そうしlength(a)==length(b) > 0
ないと質問に答えられないと思います。
ベクトルの外積を計算しますv = a x b
。回転軸v
を与える.内積を計算することにより、で回転する角度の余弦を得ることができ、 で角度を一意に決定できます (@Archie、私の以前の間違いを指摘してくれてありがとう)。この時点で、回転の軸角度表現が得られます。cos(angle)=dot(a,b)/(length(a)length(b))
acos
残りの作業は、この表現を探している表現 (オイラー角) に変換することです。あなたが見つけたように、軸角度からオイラーへの変換はそれを行う方法です。v = [ 0, 0, 0]
の場合、つまり角度が 0 度または 180 度の場合は、退化したケースを処理する必要があります。
私は個人的にオイラー角が好きではありません。アプリの安定性を台無しにし、補間には適していません。
まず、ベクトル 1 に対するベクトル 2 を得るために、ベクトル 2 からベクトル 1 を減算する必要があります。これらの値を使用して、オイラー角を計算できます。
ベクトルからオイラーへの計算を直感的に理解するために、半径が 1 で中心が原点の球を想像してみましょう。ベクトルは、3D 座標でその表面上の点を表します。この点は、球状の 2D 座標 (それぞれ緯度と経度、ピッチとヨー) で定義することもできます。
「ロール <- ピッチ <- ヨー」の順序で、次のように計算できます。
ヨーを計算するには、象限を考慮して 2 つの平面軸 (x と z) のタンジェントを計算します。
yaw = atan2(x, z) *180.0/PI;
ピッチはまったく同じですが、その平面がヨーとともに回転するため、「隣接」は 2 つの軸上にあります。その長さを見つけるには、ピタゴラスの定理を使用する必要があります。
float padj = sqrt(pow(x, 2) + pow(z, 2));
pitch = atan2(padj, y) *180.0/PI;
ノート:
- ベクトルには自身の軸を中心とした回転がないため、ロールは計算できません。通常は 0 に設定します。
- ベクトルの長さは失われ、元に戻すことはできません。
- オイラーでは、軸の順序が重要です。それらを混同すると、異なる結果が得られます。