すとーぶろぐ

主にUnity。実質備忘録。

【Unity】2点間の角度を取得する【2D】

 

「2点間の角度を取得する」よりも「点Aから見て点Bは何度の位置にあるのかを取得する」みたいな感じに言った方がピンとくるかもしれません。たぶん。

 

f:id:t_stove_k:20180827152755j:plain

 

スクリプトはこんな感じ。

GetAngle関数の部分を簡単に説明します。まず、2点(startとtarget)のx座標とy座標の差をそれぞれ求めます。その2つの差を引数としてMathf.Atan2に渡せば2点間の角度がラジアンで返ってくるので、Mathf.Rad2Degで度に変換しておしまい! 

ただし、求められる角度はtargetがstartの真右にあるときに0度となります。角度の範囲は-180°~180°です。 

 

 

f:id:t_stove_k:20180827031711g:plain

Textを使って2点間の角度をリアルタイムに表示してみました。 

 

 

Mathf.Atan2について

ここで、上のスクリプトにも登場しているMathf.Atan2について少しだけ説明します。

 

いきなり、数学の復習になりますが、tan(タンジェントとその逆関数Atan(アークタンジェントの関係を式で表すと

tanX=Y

X=AtanY

となります。ご覧の通り、tanXの値がわかれば角度Xを求めることができます

Unityにはtanの値を渡すと角度を返してくれるMathf.Atanという関数が備えられています。

ただし、Mathf.Atanが返してくれる角度は-π/2~π/2で、半周分だけです。

その理由は、Mathf.Atanの引数がtanの値だけだからです。

0°~360°の範囲で、例えば、tanの値が1のとき、角度は45°と225°の2つの場合が考えられます。このとき、sinとcosの値もわかれば、45°なのか225°なのかを判別することができるのですが、Mathf.Atanの引数はtanのみです。sinとcosの値はわからないので、判別できません。

 

じゃあ、一周分の角度を取得したい場合どうすればいいのでしょう?

そんな時はMathf.Atan2を使いましょう!

Mathf.Atan2もMathf.Atanと同様に角度を返してくれる関数です。

異なるのは、引数です。

Mathf.Atan2には引数としてx座標とy座標を渡します。この2つの引数からtanだけでなく、sinとcosの値も求められるので、一周分の角度を返すことができます

 

 

 

以下参考サイト。AtanとAtan2の違いについて本記事よりわかりやすく説明しています。

小ネタ atan2 | ++C++; // 未確認飛行 C ブログ

[C++] C ++のatanとatan2の違いは何ですか? math.h | CODE Q&A [日本語]