web-dev-qa-db-ja.com

2つの3Dベクトル間のオイラー角

2つの3Dベクトル間の3つのオイラー角をどのように見つけますか?ベクトルが1つあり、その回転を取得したい場合は、通常、このリンクを使用できます。 回転を計算して3Dポイントを確認しますか?

しかし、それらを相互に計算する場合、どうすればよいですか?

7
tomyake

他の人がすでに指摘しているように、あなたの質問は修正されるべきです。ベクトルをabと呼びましょう。 length(a)==length(b) > 0でなければ、質問に答えられないと思います。


ベクトルの 外積 を計算します_v = a x b_; vは、回転のを示します。 内積 を計算することにより、cos(angle)=dot(a,b)/(length(a)length(b))で回転する必要があるangleのコサインを取得できます。 、およびacosを使用すると、角度を一意に決定できます(@Archieは、以前の間違いを指摘してくれてありがとう)。この時点で、回転の軸角度表現が得られます。

残りの作業は、この表現を探している表現に変換することです:オイラー角。 変換軸-角度からオイラー は、あなたが見つけたように、それを行う方法です。 _v = [ 0, 0, 0]_の場合、つまり角度が0度または180度の場合、縮退したケースを処理する必要があります。


私は個人的にオイラー角が好きではありません。それらはアプリの安定性を台無しにし、補間には適していません。こちらもご覧ください。

10
Ali

最初に、ベクトル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に設定します。
  • ベクトルの長さが失われ、元に戻すことはできません。
  • オイラーでは、軸の順序が重要です。それらを混ぜると、異なる結果が得られます。
1
Vectasus