content=”回転計算ゲーム,回転計算,オイラー角,行列,クォータニオン,3D回転,Unity” />
3Dオブジェクトを回転させたい。
でも、オイラー角、行列、クォータニオン、どれを使えばいいのか分からない。
実は、それぞれに特徴があり、使い分けることが重要です。
回転計算には、主に3つの方法があります。
オイラー角は直感的ですが、ジンバルロックの問題があります。
行列は数学的に正確ですが、補間が難しいです。
クォータニオンは補間が滑らかで、ジンバルロックも回避できます。
この記事では、回転計算をゲームで扱う考え方について、Unity実装例とともに解説します。
- 回転計算の方法が分からない…
- オイラー角、行列、クォータニオン、どれを使えばいいか分からない。
- それぞれの特徴を理解したい。
✨ この記事でわかること
- オイラー角、行列、クォータニオンの特徴
- それぞれの使い分け方
- Unityでの実装方法
- 補間の方法
- 初心者でも理解できる回転計算の考え方
Unity入門の森をチェック Unity初心者でも安心。動画解説+完成サンプル付きで実装まで進められます
回転計算とは何か(ゲーム制作目線)

回転計算は、3D空間での回転を、数学的に表現・計算する処理です。
3Dゲームでは、オブジェクトの向きを変更する際に必要です。
回転計算の方法には、オイラー角、行列、クォータニオンの3つがあります。
それぞれに特徴があり、使い分けることが重要です。
Unityでは、主にクォータニオンを使いますが、オイラー角や行列も扱えます。
ゲームでの具体的な使い道

回転計算が、ゲームでどう使われているか確認してみましょう。
オブジェクトの回転
3Dオブジェクトの向きを変更します。
キャラクターの向き、カメラの視点、武器の向きなど、様々な場面で使われます。
滑らかな回転補間
2つの回転の間を、滑らかに補間します。
カメラの動きや、アニメーションなどで使われます。
回転の合成
複数の回転を組み合わせます。
親オブジェクトの回転と、子オブジェクトの回転を合成します。
方向ベクトルの計算
回転から、方向ベクトルを計算します。
前方向、上方向、右方向などを取得します。
- オブジェクトの回転(向きの変更)
- 滑らかな回転補間(カメラ、アニメーション)
- 回転の合成(親子関係)
- 方向ベクトルの計算(前方向など)
作り方は分かった。
でも完成まで行けない人へ
当たり判定・移動・カメラ・AIまで、
実装しながら学べる「永久会員チケット」です。
※ まずは内容を見るだけでOK
考え方・仕組みを図解イメージで説明

回転計算は、「回転の表現方法を選択 → 回転の計算 → 補間・合成など」という流れで実現できます。
オイラー角
X軸、Y軸、Z軸での回転角度を、3つの値で表現します。
直感的で分かりやすいですが、ジンバルロックの問題があります。
回転行列
3×3または4×4行列で、回転を表現します。
数学的に正確で、変換行列として扱えます。
クォータニオン
4つの値で、回転を表現します。
補間が滑らかで、ジンバルロックも回避できます。
変換の方法
オイラー角、行列、クォータニオンは、相互に変換できます。
Unityでは、自動的に変換してくれます。
- 回転計算には、オイラー角、行列、クォータニオンの3つの方法がある
- それぞれに特徴があり、使い分けることが重要
- Unityでは主にクォータニオンを使う
- 補間が必要な場合は、クォータニオンが適している
Unityで実装する際の注意点(代表例)

Unityで回転計算を行う場合の注意点を見ていきましょう。
オイラー角を使った回転
オイラー角は直感的ですが、ジンバルロックに注意が必要です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class EulerRotation : MonoBehaviour { public float rotationSpeed = 90f; void Update() { // オイラー角で回転 Vector3 euler = transform.eulerAngles; euler.y += rotationSpeed * Time.deltaTime; transform.eulerAngles = euler; } } |
クォータニオンを使った回転
クォータニオンを使うと、ジンバルロックを回避できます。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
public class QuaternionRotation : MonoBehaviour { public float rotationSpeed = 90f; void Update() { // クォータニオンで回転 Quaternion rotation = Quaternion.Euler(0, rotationSpeed * Time.time, 0); transform.rotation = rotation; } } |
回転の補間(Slerp)
クォータニオンを使った、滑らかな回転補間です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public class RotationInterpolation : MonoBehaviour { public Transform startPosition; public Transform endPosition; void Start() { Quaternion startRot = startPosition.rotation; Quaternion endRot = endPosition.rotation; StartCoroutine(InterpolateRotation(startRot, endRot)); } IEnumerator InterpolateRotation(Quaternion start, Quaternion end) { float t = 0f; while (t < 1f) { t += Time.deltaTime; // Slerpで滑らかに補間 transform.rotation = Quaternion.Slerp(start, end, t); yield return null; } } } |
回転の合成
複数の回転を組み合わせます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class RotationComposition : MonoBehaviour { public Transform parent; public Transform child; void Update() { // 親の回転 Quaternion parentRotation = parent.rotation; // 子のローカル回転 Quaternion childLocalRotation = Quaternion.Euler(0, 45, 0); // 回転を合成 child.rotation = parentRotation * childLocalRotation; } } |
方向ベクトルの取得
回転から、方向ベクトルを取得します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class DirectionVector : MonoBehaviour { void Update() { // 前方向ベクトル Vector3 forward = transform.forward; // 上方向ベクトル Vector3 up = transform.up; // 右方向ベクトル Vector3 right = transform.right; // 方向ベクトルで移動 if (Input.GetKey(KeyCode.W)) { transform.position += forward * Time.deltaTime * 5f; } } } |
オイラー角とクォータニオンの変換
オイラー角とクォータニオンを相互に変換します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class RotationConversion : MonoBehaviour { void Start() { // オイラー角からクォータニオンに変換 Vector3 euler = new Vector3(30, 45, 60); Quaternion quaternion = Quaternion.Euler(euler); // クォータニオンからオイラー角に変換 Vector3 eulerFromQuaternion = quaternion.eulerAngles; Debug.Log($"オイラー角: {euler}, クォータニオン: {quaternion}, 変換後: {eulerFromQuaternion}"); } } |
回転の向きの計算
目標の方向に向けて回転します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class LookAtRotation : MonoBehaviour { public Transform target; void Update() { // 目標の方向を計算 Vector3 direction = (target.position - transform.position).normalized; // LookRotationで回転を計算 Quaternion targetRotation = Quaternion.LookRotation(direction); // 滑らかに回転 transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * 2f); } } |
使い分けの目安
それぞれの使い分けの目安です。
|
1 2 3 4 5 6 7 8 9 |
// オイラー角: 簡単な回転、デバッグ時 transform.eulerAngles = new Vector3(0, 45, 0); // クォータニオン: 補間が必要な場合、回転の合成 Quaternion rotation = Quaternion.Slerp(startRot, endRot, t); // 行列: 座標変換など、変換行列として扱う場合 Matrix4x4 rotationMatrix = Matrix4x4.Rotate(rotation); |

まとめ

この記事では、回転計算をゲームで扱う考え方について見てきました。
重要なポイントをおさらいします。
- 回転計算には、オイラー角、行列、クォータニオンの3つの方法がある
- オイラー角は直感的だが、ジンバルロックの問題がある
- クォータニオンは補間が滑らかで、ジンバルロックを回避できる
- Unityでは主にクォータニオンを使う
- 用途に応じて、使い分けることが重要
回転計算は、3Dゲーム開発で重要な技術です。
オイラー角、行列、クォータニオンそれぞれに特徴があるため、用途に応じて使い分けることが大切です。
補間が必要な場合や、ジンバルロックを回避したい場合は、クォータニオンが適しています。
実際のゲーム実装とセットで学ぶことで、理解が深まるはずです。
Unity入門の森では、回転計算を含むクォータニオンを、実際のゲーム実装とともに体系的に学べます。
ぜひチェックしてみてください。
Unity入門の森をチェック Unity初心者でも安心。動画解説+完成サンプル付きで実装まで進められます





コメント