高度角の計算
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
だけを操作するという理由だけで、上記の式には暗黙的に含まれています。y
z
私はあなたの単一の呼び出しの背後にある論理をまだ完全には理解していatan2
ませんが、私がそれについてこれほど長く考えなければならないという事実は、少なくとも良い説明コメントなしでは、それを維持したくないことを示しています。
私はあなたの質問を正しく理解したことを願っています、そしてこれはあなたが探しているものです。