6

AとBという2つの3Dベクトルがあり、どちらも3D位置しかありません。次のようにして、atan2関数を使用して0〜360度の範囲の単位円に沿った角度を見つける方法を知っています。

編集:(私のatan2関数は意味がありませんでしたが、2つのベクトル間の「y-angle」が見つかるはずです):

toDegrees(atan2(A.x-B.x,A.z-B.z))+180

しかし、それは私に2つのベクトル間のY角度を与えます。それらの間のX角度を見つける必要があります。これは、x、y、zの位置の値を使用することと関係があります。xとzだけではありません。これは、2つのベクトル間のY角度を与えるためです。X角度が必要です。漠然と聞こえますが、説明する方法がわかりません。たとえば、x軸を回転させるよりも上または下を見た場合、3D空間にカメラがあります。しかし今、私は2つのベクトル間の「上/下」の角度を取得する必要があります。その3Dカメラをy軸に沿って回転させても、x軸は変化しません。したがって、2つのベクトルでは、それらの間に「y角度」が何であっても、カマラのように「上/下」の角度であるため、y角度が変化しても、2つのベクトル間のx角度は同じままです。 。

助けてください?数学/擬似コードの行、または説明が必要です。:)

4

3 に答える 3

7
atan2(crossproduct.length,scalarproduct)

arccosまたはarcsinの代わりにatan2を使用する理由は、精度です。arccosは、0度に非常に近い動作をします。引数の小さな計算エラーは、結果として不釣り合いに大きなエラーにつながります。アークサインは90度近くで同じ問題を抱えています。

于 2012-09-02T19:46:35.603 に答える
6

高度角の計算

OK、 y角度に依存しない結果と、それが2つのベクトルにどのように関連するかについて、以下のコメントを最終的に理解したかもしれません。2つのベクトルと、これら2つの間の角度にはあまり関心がないようですが、代わりに、差分ベクトルと、水平面に対して1つが形成する角度に関心があります。水平座標系(天文学でよく使用されます)、その角度は、(編集された)質問の式で計算する「方位角」とは対照的に、「高度」または「高度」と呼ばれます。「高度」はカメラの「<ahref="http://en.wikipedia.org/wiki/Tilt_%28camera%29" rel = "noreferrer">傾き」と密接に関連していますが、「方位角」は「 <ahref="http://en.wikipedia.org/wiki/Panning_%28camera%29"rel="noreferrer">パン"。

まだ2Dの問題があります。2Dベクトルの1つの座標は、差分ベクトルのy座標です。もう1つの座標は、水平面に投影した後のベクトルの長さですsqrt(x*x + z*z)。最終的な解決策は

x = A.x - B.x
y = A.y - B.y
z = A.z - B.z
alt = toDegrees(atan2(y, sqrt(x*x + z*z)))
az = toDegrees(atan2(-x, -z))

以下のコメントに従って、 (A - Bではなく)順序B - Aは、「AがBより上」が正の高度、したがって正の高度になるように選択されました。y上記の方位角計算のマイナス記号は、+ 180質問のコードのinを置き換える必要があります。ただし、範囲が[0、360]ではなく[-180、180]になっている点が異なります。代わりを提供するために、お好みの方を選択してください。実際には、どちらかの方法の方位角を計算しますB - A。これらの2つの角度に異なる順序を使用するという事実は、多少混乱する可能性があるため、これが本当に必要なものなのか、高度の符号を逆にするのか、方位角を180°変更するのかを考えてください。


正射影

参考までに、元の質問が示唆したように、固定されたx軸の周りの回転角を実際に探している人のために、以下に私の元の回答を含めます。

カメラの例が示すように、質問で言及したこのx角度が、実際にx軸を中心とした回転角である場合は、次のように考えることができます。x座標をゼロに設定すると、次のようになります。yz平面の2Dベクトル。これは、上記の平野への正射影と考えることができます。これで2Dの問題に戻り、そこで取り組むことができます。

atan2個人的には、ベクトルごとに1回ずつ、2回呼び出すだけで、結果の角度を減算します。

toDegrees(atan2(A.z, A.y) - atan2(B.z, B.y))

x=0だけを操作するという理由だけで、上記の式には暗黙的に含まれています。yz

私はあなたの単一の呼び出しの背後にある論理をまだ完全には理解していatan2ませんが、私がそれについてこれほど長く考えなければならないという事実は、少なくとも良い説明コメントなしでは、それを維持したくないことを示しています。

私はあなたの質問を正しく理解したことを願っています、そしてこれはあなたが探しているものです。

于 2012-09-02T21:40:37.277 に答える
4

2Dベクトルと同様に、内積のcosを解くことによって角度を計算します。

3Dベクトルの内積
atan は必要ありません。ベクトルの基本的な演算であるため、常にドット積を選択し、次にacosを使用して角度を取得します。

double angleInDegrees = acos ( cos(theta) ) * 180.0 / PI;
于 2012-09-01T18:01:23.307 に答える