# オイラー（Euler）回転の弱点：ジンバルロック

ここまで学んできた回転方法は「オイラー」（Euler）回転といい、x, y, zの各軸ごとに別々に回転することにより、オブジェクトに連続に適用すると、自由に回転できる…

![image.png](https://class.illogic.games/uploads/images/gallery/2026-06/scaled-1680-/Uz4image.png)

設定しても、回転順番を決めないといけない。X→Y→Z / Y→Z→X / X→Z→Y などの様々な組み合わせがあり、それぞれの最終結果がことなるので、混乱する可能性がある。

 また、「ジンバルロック」という問題もある。次の装置を見てください。この装置は「X（赤）→ Y（緑）→ Z（青）」の順番で回転する装置。この状態で、物体が各軸の周りの回転を自由にできる。

<table border="1" id="bkmrk-x-%E8%BB%B8%E3%81%AE%E5%91%A8%E3%82%8A-y-%E8%BB%B8%E3%81%AE%E5%91%A8%E3%82%8A-z-%E8%BB%B8%E3%81%AE%E5%91%A8%E3%82%8A" style="border-collapse: collapse; width: 100%; height: 117.867px; border-width: 0px;"><colgroup><col style="width: 19.062%;"></col><col style="width: 7.50566%;"></col><col style="width: 53.3736%;"></col><col style="width: 20.1342%;"></col></colgroup><tbody><tr style="height: 29.4667px;"><td class="align-right" style="height: 29.4667px; border-width: 0px;">X 軸の周り</td><td colspan="3" style="height: 29.4667px; border-width: 0px;">![image116.gif](https://class.illogic.games/uploads/images/gallery/2026-06/1Ufimage116.gif)

</td></tr><tr style="height: 29.4667px;"><td class="align-right" colspan="3" style="height: 29.4667px; border-width: 0px;">![image158.gif](https://class.illogic.games/uploads/images/gallery/2026-06/image158.gif)

</td><td style="height: 29.4667px; border-width: 0px;">Y 軸の周り</td></tr><tr style="height: 29.4667px;"><td class="align-right" style="height: 29.4667px; border-width: 0px;">Z 軸の周り</td><td colspan="3" style="height: 29.4667px; border-width: 0px;">![image243.gif](https://class.illogic.games/uploads/images/gallery/2026-06/image243.gif)

</td></tr></tbody></table>

 ここで、Y軸の周りを90度回転してみると２つの回転軸が重なってしまうこの状態は「ジンバルロック」といい、１つの回転自由度が失ってしまった：

- 重なったXとZを回転しても、同じ回転になってしまう。
- 矢印の方向に回転したくても、できない

[![image154.gif](https://class.illogic.games/uploads/images/gallery/2026-06/image154.gif)](https://class.illogic.games/uploads/images/gallery/2026-06/image154.gif)

 この場合はうまく回転できなくなるので、何かの解決を実装しないといけない。

## 一時的な解決：Angle-Axis（度-軸）回転

 ジンバルロックになってしまった場合、一時的に新しい回転軸を作成し、その「仮想軸」の周りに回転ができる。この方法を使うと、定番のXYZだけではなく、お好みのベクトルの周りに回転ができる。

![image.png](https://class.illogic.games/uploads/images/gallery/2026-06/scaled-1680-/j7Pimage.png)

 式は、今までの回転と同じアイデアである。sinとcosを使うが、回転する面はあるベクトル「***v***」を直交する

 この場合は、回転行列は以下のようになる：

<table border="1" id="bkmrk--3" style="border-collapse: collapse; width: 100%; border-width: 1px; background-color: rgb(255, 255, 255);"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>![image.png](https://class.illogic.games/uploads/images/gallery/2026-06/scaled-1680-/xlVimage.png)

</td></tr></tbody></table>

<span class="c5">ここで、</span>

<table border="1" id="bkmrk-%CE%B8-%E3%81%AF%E5%9B%9E%E8%BB%A2%E8%A7%92%E5%BA%A6%E3%81%A7%E3%80%81-%C2%A0-v-%E3%81%AF%E5%9B%9E%E8%BB%A2%E8%BB%B8%E3%81%AB%E3%81%AA" style="border-collapse: collapse; width: 100%; border-width: 0px; border-color: rgb(224, 62, 45);"><colgroup><col style="width: 25.6151%;"></col><col style="width: 19.1864%;"></col><col style="width: 55.276%;"></col></colgroup><tbody><tr><td style="border-width: 0px; background-color: rgb(255, 255, 255); border-color: rgb(224, 62, 45);">![image.png](https://class.illogic.games/uploads/images/gallery/2026-06/scaled-1680-/4Cpimage.png)

</td><td rowspan="3" style="border-width: 0px; background-color: rgb(255, 255, 255); border-color: rgb(224, 62, 45);">![image.png](https://class.illogic.games/uploads/images/gallery/2026-06/scaled-1680-/tLSimage.png)

</td><td rowspan="3" style="border-width: 0px; border-color: rgb(224, 62, 45);">***θ*** は回転角度で、

***v*** は回転軸になる任意の3D単位ベクトルである

</td></tr><tr><td style="border-width: 0px; background-color: rgb(255, 255, 255); border-color: rgb(224, 62, 45);">![image.png](https://class.illogic.games/uploads/images/gallery/2026-06/scaled-1680-/hrPimage.png)

</td></tr><tr><td style="border-width: 0px; background-color: rgb(255, 255, 255); border-color: rgb(224, 62, 45);">![image.png](https://class.illogic.games/uploads/images/gallery/2026-06/scaled-1680-/v5uimage.png)

</td></tr></tbody></table>

これは今までの回転行列の一般な形である。例えば、回転軸は Z にすると：

<table border="1" id="bkmrk--4" style="border-collapse: collapse; width: 100%; border-width: 1px; background-color: rgb(255, 255, 255);"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>![image.png](https://class.illogic.games/uploads/images/gallery/2026-06/scaled-1680-/RLdimage.png)

</td></tr></tbody></table>

とすると、行列を更新すると：

<table border="1" id="bkmrk--5" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td style="background-color: rgb(255, 255, 255);">![image.png](https://class.illogic.games/uploads/images/gallery/2026-06/scaled-1680-/AdLimage.png)

</td></tr><tr><td class="align-center">[![image.png](https://class.illogic.games/uploads/images/gallery/2026-06/scaled-1680-/affimage.png)](https://class.illogic.games/uploads/images/gallery/2026-06/affimage.png)

</td></tr><tr><td style="background-color: rgb(255, 255, 255);">![image.png](https://class.illogic.games/uploads/images/gallery/2026-06/scaled-1680-/vQtimage.png)

</td></tr></tbody></table>

でも、![image.png](https://class.illogic.games/uploads/images/gallery/2026-06/scaled-1680-/UqCimage.png)、なので…

<table border="1" id="bkmrk--6" style="border-collapse: collapse; width: 100%; border-width: 1px; background-color: rgb(255, 255, 255);"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>![image.png](https://class.illogic.games/uploads/images/gallery/2026-06/scaled-1680-/mG8image.png)

</td></tr></tbody></table>

これで、Z 軸周りの回転行列に戻った！

#### Unityのサポート

Unityでは「`Quaternion.AngleAxis`」を使用し、任意の軸周りの回転ができる：

```c#
// 以下、X 軸周りに45度を回転する相当：
Vector3 axis = new Vector3(1, 0, 0); // 軸
float angle = 45; // 角度

transform.localRotation = Quaternion.AngleAxis(angle, axis);　// 度・軸の回転
```

#### 練習

惑星と月を真似しましょう。月が惑星の軸周りを従って回転させましょう：

- Moonスクリプトを作成し、 
    - 回転速度
    - 追跡する惑星
    - 惑星から離れる距離
- Inspectorで設定できるようにする
- `Quaternion.AngleAxis` を使用し、惑星の「上向きベクトル」(`transform.up`) の周りに回転する
- 実行し、Sceneビューで惑星を傾いて、回転を確認する。

## 汎用的な解決  
Quaternion（クォータニオン - 四元数）

「クォータニオン」は、回転を表す４次元の数値である。一般な形は

<table border="1" id="bkmrk--7" style="border-collapse: collapse; width: 100%; border-width: 1px; background-color: rgb(255, 255, 255);"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>![image.png](https://class.illogic.games/uploads/images/gallery/2026-06/scaled-1680-/Ijmimage.png)

</td></tr></tbody></table>

ここでは、「+」は加算ではなく、次元を表してる。ベクトルの表現にすると：

<table border="1" id="bkmrk--8" style="border-collapse: collapse; width: 100%; border-width: 1px; background-color: rgb(255, 255, 255);"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>![image.png](https://class.illogic.games/uploads/images/gallery/2026-06/scaled-1680-/Pq6image.png)

</td></tr></tbody></table>

 と等しいのである。４次元の数値であるため演算は多少ややこしいので、ゲームで使う目的だけに注目しましょう。

 **単位クォータニオン**の特徴は：

- <span style="color: rgb(224, 62, 45);">**ジンバルロックせず、どの回転でも表現ができる**</span>
- ２つのクォータニオンを乗算は、２つの回転を連続に適用すると同じものである
- 逆クォータニオン（共役）は、逆回転と同じである
- クォータニオン⇔回転行列の変換ができる

 クォータニオンがゲームの中で回転でよく使われるので、Unityがすでに実装されている。Unityは「`Quaternion`」というクラスがあり、すべての回転は「`Quaternion`」で行う。そもそも「`transform.rotation`」のデータ型は「`Quaternion`」だ！

```c#
// Unityの中で、すべての回転は「Quaternion型」である
Quaternion rot = transform.rotation; 
```

#### オイラー角度と Quaternion の変換

Unityではオイラー角度（XYZ回転）と Quaternion の変換メソッドが実装されている：

```c#
// 回転を Quaternion として表現されている
Quaternion rotA = transform.rotation;

// オイラー角度を知りたいなら：
Vector3 angles = rot.eulerAngles;

// 逆に、オイラー角度から Quaternion にしたいなら：
Quaternion rotB = Quaternion.Euler(x, y, z); // x, y, z は各軸の回転である

// このまま回転として利用できる
transform.rotation = rotB;
```

### 掛け算（乗算）

クォータニオンが重要なので簡単にクォータニオンの掛け算を理解していきましょう。なお、式を覚えるよりも、掛け算はどのような影響があるのかを覚えてください。

２つのクォータニオン「q」と「p」があり、それぞれは別の回転であるとしたら「p × q」は、連続に２つの回転を適用したことと同じである。

クォータニオン「p」による回転

<table border="1" id="bkmrk-%E3%82%AF%E3%82%A9%E3%83%BC%E3%82%BF%E3%83%8B%E3%82%AA%E3%83%B3%E3%80%8Cp%E3%80%8D%E3%81%AB%E3%82%88%E3%82%8B%E5%9B%9E%E8%BB%A2-%E3%82%AF%E3%82%A9%E3%83%BC%E3%82%BF" style="border-collapse: collapse; width: 100%; border-width: 0px; height: 666.383px;"><tbody><tr style="height: 241.983px;"><td style="border-width: 0px; height: 241.983px;">![image281.gif](https://class.illogic.games/uploads/images/gallery/2026-06/image281.gif)

<span class="c5">クォータニオン「p」による回転</span>

</td><td style="border-width: 0px; height: 241.983px;">![image137.gif](https://class.illogic.games/uploads/images/gallery/2026-06/image137.gif)

<span class="c5">クォータニオン「q」による回転</span>

</td></tr><tr style="height: 366.8px;"><td colspan="2" style="border-width: 0px; height: 366.8px;">![image54.gif](https://class.illogic.games/uploads/images/gallery/2026-06/image54.gif)q × p の結果

</td></tr></tbody></table>

式は教科書にある（泣きたくなるぐらい大変）が、Unity の Quaternion なら「\*」で計算できる：

```c#
// 「p」と「q」それぞれは「Quaternion」である
Quaternion qp = q * p; 
```

 注意：クォータニオンの積は可換でない。回転の順番により、最後の結果が変わるので、行列と同様に：

<table border="1" id="bkmrk-q-%C3%97-p-p-%C3%97-q" style="border-collapse: collapse; width: 100%; border-width: 0px;"><colgroup><col style="width: 50.0397%;"></col><col style="width: 50.0397%;"></col></colgroup><tbody><tr><td colspan="2" style="background-color: rgb(255, 255, 255); border-width: 0px;">![image.png](https://class.illogic.games/uploads/images/gallery/2026-06/scaled-1680-/SDrimage.png)

</td></tr><tr><td style="border-width: 0px;">[![image54.gif](https://class.illogic.games/uploads/images/gallery/2026-06/image54.gif)](https://class.illogic.games/uploads/images/gallery/2026-06/image54.gif)

q × p

</td><td style="border-width: 0px;">[![image177.gif](https://class.illogic.games/uploads/images/gallery/2026-06/image177.gif)](https://class.illogic.games/uploads/images/gallery/2026-06/image177.gif)

p × q

</td></tr></tbody></table>

### 回転行列との関係

任意の単位クォータニオンを今まで勉強してきた回転行列として表現ができるので、他の変換と組み合わせることができる。

<table border="1" id="bkmrk--9" style="border-collapse: collapse; width: 100%; border-width: 1px; background-color: rgb(255, 255, 255);"><colgroup><col style="width: 100%;"></col></colgroup><tbody><tr><td>![image.png](https://class.illogic.games/uploads/images/gallery/2026-06/scaled-1680-/C2Limage.png)

</td></tr></tbody></table>

「a, b, c, d」はクォータニオンの成分である。これで、<span style="color: rgb(224, 62, 45);">**クォータニオンを回転行列に変換でき、他の変換（移動、拡大縮小）との連結できるようになる。**</span>