2つの3Dベクトル間の3つのオイラー角をどのように見つけますか?ベクトルが1つあり、その回転を取得したい場合は、通常、このリンクを使用できます。 回転を計算して3Dポイントを確認しますか?
しかし、それらを相互に計算する場合、どうすればよいですか?
他の人がすでに指摘しているように、あなたの質問は修正されるべきです。ベクトルをa
とb
と呼びましょう。 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度の場合、縮退したケースを処理する必要があります。
私は個人的にオイラー角が好きではありません。それらはアプリの安定性を台無しにし、補間には適していません。こちらもご覧ください。
Android方向センサー での奇妙な動作
最初に、ベクトル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;
ノート: