【Unity】2つのベクトルのなす角度を求める方法

Unityで2つのベクトルのなす角度を求める方法について説明しています。

2つのベクトル間の角度を知りたい

カメラやプレイヤーを特定の方向に向けたい場合必要になってくるのが2つのベクトル間の角度。

2つのベクトル間の角度を真面目に求めると高校数学のベクトルの知識が必要になるがUnityでは標準メソッドを使うことでベクトルの知識がなくても簡単に求めることができる。

単に角度だけ知りたい、片方のベクトルを基準に右/左回りで何度か知りたい、任意の平面に投影したベクトルとの角度を知りたい場合の3パターンがあるのでそれぞれについて以下で紹介。

角度だけ知りたい

2つのベクトル間の角度だけを知れば十分、という場合はVector3.Angle()を使用することで簡単に求める事ができる。メソッド形式は以下の通り。

public static float Angle(Vector3 from, Vector3 to);

fromとtoが2つのベクトル。戻り値はfromとtoのなす角で値の範囲は0°~180°。

向きも含めた角度の大きさを知りたい

単に角度だけでなく片方のベクトルを基準に右/左回りかも含めて何度か知りたい、という場合はVector3.SignedAngle()を使用することで簡単に求める事ができる。メソッド形式は以下の通り。

public static float SignedAngle(Vector3 from, Vector3 to, Vector3 axis);

fromが基準となるベクトル、toがもう片方のベクトル。axisは向きの基準を決める軸。

戻り値は軸(axis)に対して左回りなら正、右回りなら負のなす角度。

平面に投影したベクトルとの角度を知りたい

任意の平面に投影したベクトルとの角度を知りたい、という場合はまず平面に投影されたベクトルを求める必要がある。

平面に投影されたベクトルを求めるにはVector3.ProjectOnPlane()を使うと求めることができる。メソッド形式は以下の通り。

public static Vector3 ProjectOnPlane(Vector3 vector, Vector3 planeNormal);

vectorは平面に投影させるベクトル、planeNormalは投影面の法線ベクトル。戻り値は平面に投影されたベクトル。

平面に投影されたベクトルを求めたら先述のVector3.Angle()またはVector3.SignedAngle()で平面に投影したベクトルとの角度を求めることができる。

数学的にどうやって角度を求めている?

どうやって計算して求めているかざっと知りたい人向け。

高校の数学B(新課程だと数学C)で学ぶベクトルの内積の定義から角度を求めることができる(証明はしません)。

ただしこの式で求まるのはΘではなくcosΘの値なので三角関数表からΘを求める必要がある。プログラミングでは逆余弦関数(acos())を使ってΘの値を求めていく。この時Θの値はラジアン単位で0~πを取るので角度にしたい場合は 180/π をかけて角度にする。

コメント

タイトルとURLをコピーしました