クォータニオンで、回転を逆にしたい。
2つの回転の相対的な関係を知りたい。
そんな場面で使われるのが、共役クォータニオンです。
共役クォータニオンは、回転の逆を表す重要な概念です。
クォータニオンqの共役は、回転を打ち消す回転を表します。
相対回転の計算など、様々な場面で使われます。
この記事では、共役クォータニオンの仕組みについて、Unity実装例とともに解説します。
- 共役クォータニオンとは何か、よく分からない…
- 回転を逆にする方法が理解できていない。
- 相対回転の計算で困っている。
✨ この記事でわかること
- 共役クォータニオンの基本概念
- 回転の逆を求める方法
- 相対回転の計算
- Unityでの実装方法
- 初心者でも理解できる共役クォータニオンの考え方
Unity入門の森をチェック Unity初心者でも安心。動画解説+完成サンプル付きで実装まで進められます
共役クォータニオンとは何か(ゲーム制作目線)

共役クォータニオンは、クォータニオンの回転を打ち消す回転です。
クォータニオンq = (w, x, y, z)の共役q*は、q* = (w, -x, -y, -z)で表されます。
共役クォータニオンの特徴は、元の回転と合成すると、回転が打ち消されることです。
つまり、q * q* = 1(単位クォータニオン)になります。
共役クォータニオンは、回転の逆を表すため、相対回転の計算などに使われます。
Unityでは、Quaternion.Inverseや、共役の計算で簡単に扱えます。
ゲームでの具体的な使い道

共役クォータニオンが、ゲームでどう使われているか確認してみましょう。
回転の逆変換
ある回転qで回転させた後、元に戻したい場合、共役q*を使います。
qで回転 → q*で逆回転 → 元の状態に戻る
相対回転の計算
2つの回転q1とq2の相対回転を計算します。
相対回転 = q2 * q1*(q1の共役をq2に掛ける)
ローカル座標系での回転
オブジェクトのローカル座標系で、回転を計算する際に使われます。
ワールド座標系の回転を、ローカル座標系に変換する場合などに使われます。
回転の補間での使用
Slerpなどの回転補間で、正しい方向の補間を行う際に使われます。
最短経路での補間を実現するために、共役を使うことがあります。
- 回転の逆変換(元の状態に戻す)
- 相対回転の計算(2つの回転の関係)
- ローカル座標系での回転計算
- 回転の補間(最短経路での補間)
作り方は分かった。
でも完成まで行けない人へ
当たり判定・移動・カメラ・AIまで、
実装しながら学べる「永久会員チケット」です。
※ まずは内容を見るだけでOK
考え方・仕組みを図解イメージで説明

共役クォータニオンは、「クォータニオンの虚数部の符号を反転 → 回転の逆を表現」という流れで実現できます。
クォータニオンの表現
クォータニオンq = (w, x, y, z)は、wが実部、x, y, zが虚部です。
回転を表すクォータニオンでは、|q| = 1(単位クォータニオン)です。
共役の計算
共役q* = (w, -x, -y, -z)は、虚数部の符号を反転させます。
これにより、回転方向が逆になります。
回転の打ち消し
q * q* = 1(単位クォータニオン)になります。
つまり、qで回転させてから、q*で回転させると、元の状態に戻ります。
相対回転の計算
q1からq2への相対回転は、q2 * q1*で計算できますね。
これにより、2つの回転の関係を表せます。
- 共役クォータニオンは、回転の逆を表す
- 共役の計算は、虚数部の符号を反転させる
- q * q* = 1で、回転が打ち消される
- 相対回転の計算などに活用できる
Unityで実装する際の注意点(代表例)

Unityで共役クォータニオンを扱う場合の注意点を見ていきましょう。
Quaternion.Inverseを使った実装
UnityのQuaternion.Inverseは、共役クォータニオンを返します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class QuaternionConjugateExample : MonoBehaviour { public Transform target; void Start() { // 回転qを取得 Quaternion q = target.rotation; // 共役(逆回転)を計算 Quaternion qConjugate = Quaternion.Inverse(q); // q * q* = 1(単位クォータニオン) Quaternion result = q * qConjugate; Debug.Log($"結果: {result}"); // (0, 0, 0, 1) に近い値 } } |
回転の逆変換
ある回転で回転させた後、元に戻します。
|
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 27 28 29 30 31 |
public class RotationInverse : MonoBehaviour { public Transform objectToRotate; public float rotationSpeed = 90f; private Quaternion originalRotation; private Quaternion appliedRotation; void Start() { originalRotation = objectToRotate.rotation; } void Update() { if (Input.GetKeyDown(KeyCode.Space)) { // 回転を適用 appliedRotation = Quaternion.Euler(0, rotationSpeed, 0); objectToRotate.rotation = originalRotation * appliedRotation; } if (Input.GetKeyDown(KeyCode.R)) { // 共役を使って元に戻す Quaternion inverseRotation = Quaternion.Inverse(appliedRotation); objectToRotate.rotation = originalRotation * inverseRotation; } } } |
相対回転の計算
2つの回転の相対回転を計算します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public class RelativeRotation : MonoBehaviour { public Transform object1; public Transform object2; void Update() { // 2つのオブジェクトの回転 Quaternion q1 = object1.rotation; Quaternion q2 = object2.rotation; // q1からq2への相対回転 Quaternion relativeRotation = q2 * Quaternion.Inverse(q1); // 相対回転の角度を取得 float angle; Vector3 axis; relativeRotation.ToAngleAxis(out angle, out axis); Debug.Log($"相対回転角度: {angle}度, 軸: {axis}"); } } |
ローカル座標系での回転
オブジェクトのローカル座標系で、回転を計算します。
|
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 |
public class LocalRotation : MonoBehaviour { public Transform parent; public Transform child; void Update() { // 親の回転を取得 Quaternion parentRotation = parent.rotation; // 子のワールド座標系での回転 Quaternion childWorldRotation = child.rotation; // 子のローカル座標系での回転 Quaternion childLocalRotation = Quaternion.Inverse(parentRotation) * childWorldRotation; // ローカル座標系での回転角度を取得 float localAngle; Vector3 localAxis; childLocalRotation.ToAngleAxis(out localAngle, out localAxis); Debug.Log($"ローカル回転角度: {localAngle}度"); } } |
回転の補間での使用
最短経路での回転補間を実現します。
|
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 27 28 29 30 31 32 33 34 35 36 |
public class QuaternionInterpolation : MonoBehaviour { public Transform target; public Transform startPosition; public Transform endPosition; void Start() { Quaternion startRot = startPosition.rotation; Quaternion endRot = endPosition.rotation; // 内積を計算して、最短経路を選択 float dot = Quaternion.Dot(startRot, endRot); // 内積が負の場合は、共役を使う if (dot < 0f) { endRot = Quaternion.Inverse(endRot); } // Slerpで補間 StartCoroutine(InterpolateRotation(startRot, endRot)); } IEnumerator InterpolateRotation(Quaternion start, Quaternion end) { float t = 0f; while (t < 1f) { t += Time.deltaTime; target.rotation = Quaternion.Slerp(start, end, t); yield return null; } } } |
共役の手動計算
共役を手動で計算する場合の実装です。
|
1 2 3 4 5 6 |
public static Quaternion Conjugate(Quaternion q) { // 共役 = (w, -x, -y, -z) return new Quaternion(-q.x, -q.y, -q.z, q.w); } |

まとめ

この記事では、共役クォータニオンの仕組みについて見てきました。
重要なポイントをおさらいします。
- 共役クォータニオンは、回転の逆を表す
- 共役の計算は、虚数部の符号を反転させる
- UnityのQuaternion.Inverseが共役を返す
- q * q* = 1で、回転が打ち消される
- 相対回転の計算や、ローカル座標系での回転計算に活用できる
共役クォータニオンは、3D回転処理で重要な概念です。
回転の逆を求めることで、様々な回転計算が可能になります。
相対回転の計算など、実用的な場面で活用できますね。
実際のゲーム実装とセットで学ぶことで、理解が深まるはずです。
Unity入門の森では、クォータニオンを含む回転処理を、実際のゲーム実装とともに体系的に学べます。
ぜひチェックしてみてください。
Unity入門の森をチェック Unity初心者でも安心。動画解説+完成サンプル付きで実装まで進められます





コメント