sin
では、何が何であるかについて簡単に復習しましょうasin
。下の図の直角三角形を見てください。

出典:ウィキペディア
このA
直角三角形の点を見ると、線分AC
との間に角度ができていることがわかりますAB
。この角度との関係sin
はsin
、斜辺に対する反対側の長さの比率です。言い換えると:
sin A = opposite / hypotenuse = a / h
これは、 をとった場合、これはにある角度の にa / h
等しいことを意味します。そのため、実際の角度を見つけるには、この方程式の両側に逆正弦演算子を適用する必要があります。そのような:sin
A
A = asin(a / h)
たとえば、三角形のa = 1
とh = 2
の場合、この直角三角形が と の間AC
で作る角度のサインAB
は次のとおりです。
sin A = 1 / 2
ここにある実際の角度を見つけるには、次のようにします。
A = asin(1 / 2)
これを電卓に入れると、30 度になります。ラジアンは角度を表す別の方法であり、次の関係が成り立ちます。
angle_in_radians = (angle_in_degrees) * (Math.PI / 180.0)
私は実際にあなたのコードと少し混乱していasin
ますsin
。asin
との間のプロパティsin
は次のとおりです。

arcsin
と同じasin
です。x >= -Math.PI / 2, x <= Math.PI / 2
上記の式は、または度である限りx >= -90, x <= 90
、この関係が成り立つことを示しています。コードでは、 内の引数sin
は間違いなく-1 から 1 の間になるため、これは実際には次のように単純化されます。
(fPosXBeforeMoved - sPosX) / Math.sqrt(Math.pow(fPosXBeforeMoved - sPosX, 2) +
Math.pow(fPosZBeforeMoved - sPosZ, 2));
移動するポイント間の角度を見つけたい場合は、三角形の右側を使用していません。これについては後で詳しく説明します。
さて、これはあなたの質問にどのように関係していますか? コード内の方程式を見てください。確認する必要がある 4 つのポイントがあります。
fPosXBeforeMoved
-X
移動前のポイントの位置
sPosX
-X
移動後のポイントの位置
fPosZBeforeMoved
-Z
移動前のポイントの位置
sPosZ
-Z
移動後のポイントの位置。
実際には、これを次のように直角三角形で表すことができます (下手な図ですみません)。

移動前の点を平面上に、(fPosXBeforeMoved,fPosZBeforeMoved)
移動後の点を表すことができます。この図では、 が水平成分で、が垂直成分です。目の前に写真を置いていると想像してください。 左から右に向かう軸、上下に向かう軸、あなたに向かって出て画像の内側に向かう軸になります。XZ
(sPosX,sPosZ)
X
Z
X
Z
Y
座標AC
間の差を取ることによって隣接する ( ) セグメントの長さを見つけることができ、座標間の差を取ることによって反対側の ( ) セグメントの長さを見つけることができます。あとは、斜辺の長さ ( ) を見つけるだけです。学校のことを思い出すと、これはピタゴラスの定理を使用して単純に行われます。X
AB
Z
h
h^2 = a^2 + b^2
h = sqrt(a^2 + b^2)
したがって、図を参照すると、斜辺は次のようになります (JavaScript で):
Math.sqrt(Math.pow(fPosXBeforeMoved - sPosX, 2) + Math.pow(fPosZBeforeMoved - sPosZ, 2));
これはコードの一部として認識されます。について説明しましsin
たが、 を見てみましょうcos
。 cos
斜辺上の隣接する辺の長さの比率です。言い換えると:
cos A = adjacent / hypotenuse = b / h
これはこの部分を説明します:
(sPosX - fPosXBeforeMoved) / Math.sqrt(Math.pow(sPosX - fPosXBeforeMoved, 2) +
Math.pow(sPosZ - fPosZBeforeMoved, 2));
以前のコードにあったものと比較して、 andの減算を交換したことに注意してください。その理由は、前の点と後の点を調べる場合、常に後の点が最初に来て、前の点が 2 番目になるからです。一番下の斜辺を計算している場合、これは問題ではありません。これは、値を減算する順序に関係なく、減算の 2 乗を取るため、順序に関係なく同じ数が得られるためです。一貫性を保つために、ここで斜辺の順序を入れ替えることにしました。注文はsPosX
fPosXBeforeMoved
減算するときに値が正または負になると、最終的に角度を見つけるときに違いが生じるためです。
この除算は常に-1 から 1 の間であることに注意してください。したがって、ここで逆三角関数を確実に使用できます。最後に、角度を求めたい場合は、逆余弦を適用します。言い換えると:
Math.acos((sPosX - fPosXBeforeMoved) / Math.sqrt(Math.pow(sPosX - fPosXBeforeMoved, 2)
+ Math.pow(sPosZ - fPosZBeforeMoved, 2)));
これこそが、あなたがプログラミングすべきだと私が信じていることです。これはラジアンで角度を返すことに注意してください。これを度数にしたい場合は、上で示した方程式を使用しますが、ラジアンではなく度数で解くように再配置してください。そのような:
angle_in_degrees = angle_in_radians * (180.0 / Math.PI)
あなたが今持っているものに関しては、隣接する斜辺と斜辺の比率を測定しているだけだと思います。これは、各軸をまたいでいる場所を検出したい場合はまったく問題ありません。実際の角度を見つけたい場合は、代わりに上記のコードを使用します。
頑張って楽しんでね!