メインコンテンツまでスキップ

角度の求め方の例

1. ベクトルの内積を使った角度計算 (Vector2.Angle / Vector3.Angle)

Unityでは、Vector2Vector3クラスに、2つのベクトル間の角度を直接計算する便利な関数があります。

Vector2.Angle (2Dベクトルの場合)

float angle = Vector2.Angle(Vector2 from, Vector2 to);
  • 説明: 2D空間におけるfromベクトルとtoベクトルの間の角度を計算します。
  • 戻り値: 0から180度の範囲で、2つのベクトルが形成する角度(度数法)。

Vector3.Angle (3Dベクトルの場合)

float angle = Vector3.Angle(Vector3 from, Vector3 to);
  • 説明: 3D空間におけるfromベクトルとtoベクトルの間の角度を計算します。
  • 戻り値: 0から180度の範囲で、2つのベクトルが形成する角度(度数法)。

:

Vector3 from = new Vector3(1, 0, 0);  // X軸方向のベクトル
Vector3 to = new Vector3(0, 1, 0); // Y軸方向のベクトル

float angle = Vector3.Angle(from, to); // 結果は90度

Vector3.AngleVector2.Angleは内積を使って角度を計算しており、コードがシンプルで、計算精度も高いです。





2. 内積を使って角度を手動で計算する方法

ベクトルの内積を使って、2つのベクトル間の角度を求めることもできます。内積を使った計算は、次の式を使用します:

cos(\theta) = \frac{A \cdot B}{|A| |B|} \

ここで、ABは2つのベクトル、A·Bは内積、|A||B|はそれぞれベクトルの長さ(ノルム)です。

この式を使って、角度をラジアンで求め、Mathf.Rad2Degで度数法に変換できます。

float angleInRadians = Mathf.Acos(Vector3.Dot(from.normalized, to.normalized));
float angleInDegrees = angleInRadians * Mathf.Rad2Deg;

:

Vector3 from = new Vector3(1, 0, 0);  // X軸方向のベクトル
Vector3 to = new Vector3(0, 1, 0); // Y軸方向のベクトル

float angleInRadians = Mathf.Acos(Vector3.Dot(from.normalized, to.normalized));
float angleInDegrees = angleInRadians * Mathf.Rad2Deg; // 結果は90度




3. 回転行列を使って角度を計算する方法

回転行列を使って角度を求める方法もあります。特に3D空間で、オブジェクトがどれくらい回転したかを求める際に有効です。Unityでは、Quaternionを使って回転を表現できます。

例えば、オブジェクトの回転を角度に変換する場合:

Quaternion rotation = transform.rotation;
float angle = rotation.eulerAngles.y; // Y軸の回転角度(度数法)




4. 三角関数を使って角度を求める方法(Mathf.Atan

Mathf.Atanは、与えられたyxの比(すなわち、傾き)から角度を求める関数です。

  • Mathf.Atan(y / x): 与えられたx軸、y軸の比を使って、角度をラジアンで返します。

これは、Mathf.Atan2と似ていますが、Mathf.Atan2は座標の正負を考慮するため、より広い範囲(-180度から180度)を返します。一方、Mathf.Atanは-π/2からπ/2の範囲に限定されます。

float angleInRadians = Mathf.Atan(y / x);
float angleInDegrees = angleInRadians * Mathf.Rad2Deg;

:

float x = 1.0f;
float y = 1.0f;
float angleInRadians = Mathf.Atan(y / x);
float angleInDegrees = angleInRadians * Mathf.Rad2Deg; // 結果は45度





5. Vector3.SignedAngle(3D空間での角度)

Vector3.SignedAngleは、2つの3Dベクトル間の角度を求める際に、回転方向(符号付き)も考慮して計算する関数です。

float angle = Vector3.SignedAngle(from, to, axis);
  • from: 最初のベクトル
  • to: 目標のベクトル
  • axis: 角度の回転軸(例えばVector3.upでY軸回転)

Vector3.SignedAngleは、回転方向も含めた角度を計算するため、-180度から180度の範囲で角度を返します。

:

Vector3 from = new Vector3(1, 0, 0);
Vector3 to = new Vector3(0, 1, 0);
Vector3 axis = Vector3.up;

float angle = Vector3.SignedAngle(from, to, axis); // 結果は90度









まとめ

角度を求める方法は用途に応じてさまざまです。代表的なものは次の通りです:

  • Mathf.Atan2: 座標から角度を計算する標準的な方法。
  • Vector2.Angle / Vector3.Angle: 2つのベクトル間の角度を直接計算。
  • 内積を使った方法: ベクトル間の角度を数学的に求める。
  • Vector3.SignedAngle: 3D空間で、符号付きで角度を求める方法。

目的に応じて適切な方法を選んで使うことができます。例えば、オブジェクト間の回転を計算したいときはVector3.AngleVector3.SignedAngleが便利で、ターゲット方向を求める場合はMathf.Atan2がよく使われます。