3DCGにおける回転の計算手法の整理

## 3DCGにおける回転の計算

### 手法一覧 
3DCG（3次元コンピュータグラフィックス）の回転の計算には、さまざまな手法があります。それぞれの手法には一長一短があり、用途や必要とする精度、計算の効率性などに応じて使い分けられます。以下に主要な手法を挙げます。

1. **回転行列 (Rotation Matrices)**
   - 回転行列は、3x3の正方行列で、ベクトルの回転を行います。
   - 回転行列は、軸に対する回転角度に応じて構築されます。
   - 連続した回転の計算や複数の回転の合成が簡単に行えますが、数値的な安定性に課題があります。

2. **オイラー角 (Euler Angles)**
   - オイラー角は、回転を3つの角度（例えば、ロール、ピッチ、ヨー）で表現します。
   - 回転順序によって結果が異なるため、順序が重要です。
   - ジンバルロックと呼ばれる問題があり、ある特定の角度で自由度が失われることがあります。

3. **クォータニオン (Quaternions)**
   - クォータニオンは、4つの成分（1つのスカラー成分と3つのベクトル成分）で回転を表現します。
   - 回転の合成や補間が効率的に行え、ジンバルロックの問題も回避できます。
   - 直感的な理解が難しい場合がありますが、3Dグラフィックスでは広く使用されています。

4. **回転ベクトル (Rotation Vectors)**
   - 回転ベクトルは、回転軸をベクトルで表し、その長さを回転角度とします。
   - ロドリゲスの回転公式を用いて、回転行列に変換することができます。

5. **軸と角度による回転 (Axis-Angle Representation)**
   - 回転軸とその周りの回転角度で回転を表現します。
   - 回転行列やクォータニオンに変換することで、他の手法と併用されることが多いです。

6. **スクリューモーション (Screw Motion)**
   - スクリューモーションは、回転と平行移動を組み合わせた変換を表現します。
   - 空間変換の一つとして、ロボティクスやメカニカルエンジニアリングで使用されます。

これらの手法は、それぞれの特徴を理解し、目的に応じて使い分けることが重要です。例えば、キャラクターのアニメーションや物理シミュレーションではクォータニオンがよく使われますが、カメラの回転などではオイラー角が直感的に理解しやすいため使用されることが多いです。

## 1. 回転行列について
回転行列は、3次元空間での回転を行うために使用される3x3の行列です。これにより、ベクトルや点を特定の軸の周りで回転させることができます。具体的な例として、各軸（X軸、Y軸、Z軸）周りの回転行列を示します。

### X軸周りの回転

X軸周りに角度
```math
\theta
```
だけ回転させる回転行列は次のようになります

```math
R_x(\theta) = \begin{bmatrix}
1 & 0 & 0 \\
0 & \cos\theta & -\sin\theta \\
0 & \sin\theta & \cos\theta
\end{bmatrix}
```

### Y軸周りの回転

Y軸周りに角度
```math
\theta
```
だけ回転させる回転行列は次のようになります

```math
R_y(\theta) = \begin{bmatrix}
\cos\theta & 0 & \sin\theta \\
0 & 1 & 0 \\
-\sin\theta & 0 & \cos\theta
\end{bmatrix}
```

### Z軸周りの回転

Z軸周りに角度
```math
\theta
```
だけ回転させる回転行列は次のようになります

```math
R_z(\theta) = \begin{bmatrix}
\cos\theta & -\cos\theta & 0 \\
\sin\theta & \cos\theta & 0 \\
0 & 0 & 1
\end{bmatrix}
```

### 具体例

例えば、Z軸周りに45度
```math
\theta = 45^\circ
```
回転させる場合を考えます。45度はラジアンで
```math
\frac{\pi}{4}
```
なので、これを用いて回転行列を作ります。
```math
R_z\left(\frac{\pi}{4}\right) = \begin{bmatrix}
\cos\left(\frac{\pi}{4}\right) & -\sin\left(\frac{\pi}{4}\right) & 0 \\
\sin\left(\frac{\pi}{4}\right) & \cos\left(\frac{\pi}{4}\right) & 0 \\
0 & 0 & 1
\end{bmatrix}
= \begin{bmatrix}
\frac{\sqrt{2}}{2} & -\frac{\sqrt{2}}{2} & 0 \\
\frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} & 0 \\
0 & 0 & 1
\end{bmatrix}
```

この回転行列を使って、任意のベクトル
```math
\mathbf{v} = \begin{bmatrix} x \\ y \\ z \end{bmatrix}
```
を回転させます。例えば、ベクトル
```math
\mathbf{v} = \begin{bmatrix} 1 \\ 0 \\ 0 \end{bmatrix}
```
を回転させると

```math
R_z\left(\frac{\pi}{4}\right) \begin{bmatrix} 1 \\ 0 \\ 0 \end{bmatrix}
= \begin{bmatrix}
\frac{\sqrt{2}}{2} & -\frac{\sqrt{2}}{2} & 0 \\
\frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} & 0 \\
0 & 0 & 1
\end{bmatrix}
\begin{bmatrix} 1 \\ 0 \\ 0 \end{bmatrix}
= \begin{bmatrix}
\frac{\sqrt{2}}{2} \\
\frac{\sqrt{2}}{2} \\
0
\end{bmatrix}
```

これは、X軸上のベクトルがZ軸周りに45度回転して、XY平面上の
```math
\frac{\sqrt{2}}{2}
```
の長さのベクトルになることを示しています。

このように、回転行列は3次元空間での回転を簡単かつ効率的に計算するために使用されます。


## 3DCGにおけるオイラー角の説明

オイラー角は、物体の回転を3つの回転軸（通常は固定された座標系のX軸、Y軸、Z軸）に対する3つの連続した回転として表現する方法です。オイラー角は、任意の3次元回転を記述するために用いられ、3つの角度で構成されます。

オイラー角の回転は、以下の3つの回転行列の積として表現されます

1. Z軸周りの回転角を
    ```math
    \alpha
    ```
    とすると
     ```math
    R_z(\alpha)
    ```
    
2. Y軸周りの回転角を
    ```math
    \beta
    ```
    とすると
    ```math
    R_y(\beta)
    ```
3. X軸周りの回転角を
    ```math
    \gamma
    ```
    とすると
    ```math
    R_x(\gamma)
    ```

### 各軸周りの回転行列

#### Z軸周りの回転

Z軸周りに角度
```math
\alpha
```
だけ回転させる回転行列は次のようになります


```math
R_z(\alpha) = \begin{bmatrix}
\cos\alpha & -\sin\alpha & 0 \\
\sin\alpha & \cos\alpha & 0 \\
0 & 0 & 1
\end{bmatrix} 
```

#### Y軸周りの回転

Y軸周りに角度
```math
\beta
```
だけ回転させる回転行列は次のようになります

```math
R_y(\beta) = \begin{bmatrix}
\cos\beta & 0 & \sin\beta \\
0 & 1 & 0 \\
-\sin\beta & 0 & \cos\beta
\end{bmatrix} 
```

#### X軸周りの回転

X軸周りに角度
```math
\gamma
```
だけ回転させる回転行列は次のようになります

```math
R_x(\gamma) = \begin{bmatrix}
1 & 0 & 0 \\
0 & \cos\gamma & -\sin\gamma \\
0 & \sin\gamma & \cos\gamma
\end{bmatrix} 
```

### オイラー角による回転行列

オイラー角を用いて3次元空間での回転を表現する場合、全体の回転行列は3つの回転行列の積として表されます

```math
R = R_z(\alpha) R_y(\beta) R_x(\gamma)
```

### 具体例

例えば、以下のようなオイラー角
```math
\alpha = 30^\circ
```

```math
\beta = 45^\circ
```
```math
\gamma = 60^\circ
```
の場合を考えます。これらの角度はそれぞれラジアンで
```math
\frac{\pi}{6}
```
```math
\frac{\pi}{4}
```
```math
\frac{\pi}{3}
```
となります。

1. Z軸周りの回転
    ```math
    \alpha = 30^\circ
    ```

```math 
R_z\left(\frac{\pi}{6}\right) = \begin{bmatrix}
\cos\left(\frac{\pi}{6}\right) & -\sin\left(\frac{\pi}{6}\right) & 0 \\
\sin\left(\frac{\pi}{6}\right) & \cos\left(\frac{\pi}{6}\right) & 0 \\
0 & 0 & 1
\end{bmatrix}
= \begin{bmatrix}
\frac{\sqrt{3}}{2} & -\frac{1}{2} & 0 \\
\frac{1}{2} & \frac{\sqrt{3}}{2} & 0 \\
0 & 0 & 1
\end{bmatrix}
```

2. Y軸周りの回転
    ```math
    \beta = 45^\circ
    ```

```math 
R_y\left(\frac{\pi}{4}\right) = \begin{bmatrix}
\cos\left(\frac{\pi}{4}\right) & 0 & \sin\left(\frac{\pi}{4}\right) \\
0 & 1 & 0 \\
-\sin\left(\frac{\pi}{4}\right) & 0 & \cos\left(\frac{\pi}{4}\right)
\end{bmatrix}
= \begin{bmatrix}
\frac{\sqrt{2}}{2} & 0 & \frac{\sqrt{2}}{2} \\
0 & 1 & 0 \\
-\\frac{\sqrt{2}}{2} & 0 & \frac{\sqrt{2}}{2}
\end{bmatrix}
```

3. X軸周りの回転
    ```math
    \gamma = 60^\circ
    ```
    

```math 
R_x\left(\frac{\pi}{3}\right) = \begin{bmatrix}
1 & 0 & 0 \\
0 & \cos\left(\frac{\pi}{3}\right) & -\sin\left(\frac{\pi}{3}\right) \\
0 & \sin\left(\frac{\pi}{3}\right) & \cos\left(\frac{\pi}{3}\right)
\end{bmatrix}
= \begin{bmatrix}
1 & 0 & 0 \\
0 & \frac{1}{2} & -\frac{\sqrt{3}}{2} \\
0 & \frac{\sqrt{3}}{2} & \frac{1}{2}
\end{bmatrix}
```

これらを掛け合わせて全体の回転行列を得ます

```math 
R = R_z\left(\frac{\pi}{6}\right) R_y\left(\frac{\pi}{4}\right) R_x\left(\frac{\pi}{3}\right)
```

このように、オイラー角を用いることで、3次元空間での回転を理解しやすく、また計算しやすく表現することができます。


## 3DCGにおけるクォータニオンの説明

クォータニオンは、3次元空間における回転を表現するための数学的な手法です。回転行列やオイラー角と比べて、クォータニオンは計算の効率や数値安定性の面で優れています。

### クォータニオンの基本

クォータニオンは、実数部
```math
w
```
と虚数部
```math
x, y, z
```
の4つの成分から構成される複素数の一般化です。
クォータニオン
```math
q
```
は次のように表されます

```math
q = w + xi + yj + zk
```

ここで、
```math
i, j, k
```
は虚数単位で、以下の性質を持ちます

```math
i^2 = j^2 = k^2 = ijk = -1 
```

### 単位クォータニオン

回転を表現するクォータニオンは、単位クォータニオン（ノルムが1のクォータニオン）です。単位クォータニオン
```math
q
```
のノルムは次のように定義されます

```math
\|q\| = \sqrt{w^2 + x^2 + y^2 + z^2} = 1
```

### クォータニオンによる回転

クォータニオンを使って回転を表現するには、回転軸
```math
\mathbf{v} = (x, y, z)
```
と回転角
```math
\theta
```
を用います。回転クォータニオン
```math
q
```
は次のように表されます

```math
q = \cos\left(\frac{\theta}{2}\right) + (xi + yj + zk)\sin\left(\frac{\theta}{2}\right)
```

ここで、
```math
(x, y, z)
```
は回転軸の単位ベクトルです。

### クォータニオンの積

2つのクォータニオン
```math
q_1 = w_1 + x_1i + y_1j + z_1k
```
と
```math
q_2 = w_2 + x_2i + y_2j + z_2k
```
の積は次のように計算されます

```math
q_1 q_2 = (w_1w_2 - x_1x_2 - y_1y_2 - z_1z_2) + (w_1x_2 + x_1w_2 + y_1z_2 - z_1y_2)i + (w_1y_2 - x_1z_2 + y_1w_2 + z_1x_2)j + (w_1z_2 + x_1y_2 - y_1x_2 + z_1w_2)k
```

### ベクトルの回転

任意のベクトル
```math
\mathbf{v} = (v_x, v_y, v_z)
```
を回転させるには、以下の手順を行います

1. ベクトルをクォータニオンとして表現
    ```math
    \mathbf{v} \rightarrow q_v = 0 + v_xi + v_yj + v_zk
    ```
2. 回転クォータニオン
    ```math
    q
    ```
    とその共役
    ```math
    q^* = \cos\left(\frac{\theta}{2}\right) - (xi + yj + zk)\sin\left(\frac{\theta}{2}\right)
    ```
    を用いて回転を適用

    ```math
    q' = qq_vq^*
    ```

3. 結果のクォータニオン
    ```math
    q'
    ```
    の虚数部が回転後のベクトルを表します。


### クォータニオンによる3軸の回転の具体例

ここでは、ベクトル
```math
\mathbf{v} = (1, 0, 0)
```
を次の順番で回転させる例を示します
1. X軸周りに90度回転
2. Y軸周りに90度回転
3. Z軸周りに90度回転

これらの回転をクォータニオンを使って順番に適用します。

#### 1. X軸周りに90度回転

まず、X軸周りに90度
```math
\theta = 90^\circ = \frac{\pi}{2}
```
回転させるクォータニオンを求めます。

```math
q_x = \cos\left(\frac{\pi}{4}\right) + (\sin\left(\frac{\pi}{4}\right) \cdot i)
= \frac{\sqrt{2}}{2} + \frac{\sqrt{2}}{2}i
```

#### 2. Y軸周りに90度回転

次に、Y軸周りに90度
```math
\theta = 90^\circ = \frac{\pi}{2}
```
回転させるクォータニオンを求めます。

```math
q_y = \cos\left(\frac{\pi}{4}\right) + (\sin\left(\frac{\pi}{4}\right) \cdot j)
= \frac{\sqrt{2}}{2} + \frac{\sqrt{2}}{2}j
```

#### 3. Z軸周りに90度回転

最後に、Z軸周りに90度
```math
\theta = 90^\circ = \frac{\pi}{2}
```
回転させるクォータニオンを求めます。

```math
q_z = \cos\left(\frac{\pi}{4}\right) + (\sin\left(\frac{\pi}{4}\right) \cdot k)
= \frac{\sqrt{2}}{2} + \frac{\sqrt{2}}{2}k
```

#### ベクトルをクォータニオンとして表現

任意のベクトル
```math
\mathbf{v} = (1, 0, 0)
```
をクォータニオン
```math
q_v
```
として表現します

```math
q_v = 0 + 1i + 0j + 0k = i
```

#### クォータニオンの共役

各クォータニオンの共役は以下の通りです

```math
q_x^* = \frac{\sqrt{2}}{2} - \frac{\sqrt{2}}{2}i
```
```math
q_y^* = \frac{\sqrt{2}}{2} - \frac{\sqrt{2}}{2}j
```
```math
q_z^* = \frac{\sqrt{2}}{2} - \frac{\sqrt{2}}{2}k
```

#### 回転の適用

順番に回転を適用していきます。

1. X軸周りの回転

```math
q_{v1} = q_x q_v q_x^* 
= \left( \frac{\sqrt{2}}{2} + \frac{\sqrt{2}}{2}i \right) i \left( \frac{\sqrt{2}}{2} - \frac{\sqrt{2}}{2}i \right)
= j
```

2. Y軸周りの回転

```math
q_{v2} = q_y q_{v1} q_y^* 
= \left( \frac{\sqrt{2}}{2} + \frac{\sqrt{2}}{2}j \right) j \left( \frac{\sqrt{2}}{2} - \frac{\sqrt{2}}{2}j \right)
= k
```

3. Z軸周りの回転

```math
q_{v3} = q_z q_{v2} q_z^* 
= \left( \frac{\sqrt{2}}{2} + \frac{\sqrt{2}}{2}k \right) k \left( \frac{\sqrt{2}}{2} - \frac{\sqrt{2}}{2}k \right)
= i
```

結果として、ベクトル
```math
(1, 0, 0)
```
は順番にX軸、Y軸、Z軸周りに90度回転され、最終的に元の位置に戻ることが示されました。

クォータニオンを用いることで、このように3次元空間での複数の回転を効率的かつ正確に計算することができます。




## 3DCGにおける回転ベクトルの説明

回転ベクトル（または回転軸-角度表現）は、3次元空間での回転を表現する方法の一つです。回転ベクトルは、回転軸と回転角度を直接使って回転を表現します。回転軸は単位ベクトルであり、回転角度はその軸周りの回転角を示します。

### 回転ベクトルの基本

- **回転軸** 単位ベクトル
    ```math
    \mathbf{u} = (u_x, u_y, u_z)
    ```
- **回転角度**ラジアン
    ```math
    \theta
    ```

回転ベクトル
```math
\mathbf{r}
```
は、回転軸
```math
\mathbf{u}
```
に回転角度
```math
\theta
```
を掛けたものです

```math 
\mathbf{r} = \theta \mathbf{u} 
= \theta (u_x, u_y, u_z)
```

### 回転行列への変換

回転ベクトルから回転行列を得るには、以下のロドリゲスの回転公式を使用します

```math 
R = I + \sin\theta K + (1 - \cos\theta) K^2 
```

ここで、Iは単位行列、Kは次のようなクロス積行列です

```math 
K = \begin{bmatrix}
0 & -u_z & u_y \\
u_z & 0 & -u_x \\
-u_y & u_x & 0
\end{bmatrix}
```


### 回転ベクトルによる具体例

次の順番でベクトルを回転させます

1. X軸周りに90度
2. Y軸周りに90度
3. Z軸周りに90度

初期のベクトルは
```math
\mathbf{v} = (1, 0, 0)
```
です。各回転を順番に適用していきます。

#### 1. X軸周りに90度回転

回転軸は
```math
(1, 0, 0)
```
で、回転角度
```math
\theta
```
は90度
```math
\frac{\pi}{2}
```
です。

回転ベクトルは

```math 
\mathbf{r}_x = \frac{\pi}{2} (1, 0, 0) = \left( \frac{\pi}{2}, 0, 0 \right) 
```

ロドリゲスの回転公式を使って回転行列を計算します

```math 
K_x = \begin{bmatrix}
0 & 0 & 0 \\
0 & 0 & -1 \\
0 & 1 & 0
\end{bmatrix}
```

```math 
R_x = I + \sin\left(\frac{\pi}{2}\right) K_x + (1 - \cos\left(\frac{\pi}{2}\right)) K_x^2 
```

ここで
```math
\sin\left(\frac{\pi}{2}\right) = 1
```
および
```math
\cos\left(\frac{\pi}{2}\right) = 0
```
なので、

```math 
R_x = I + K_x = \begin{bmatrix}
1 & 0 & 0 \\
0 & 0 & -1 \\
0 & 1 & 0
\end{bmatrix}
```

初期ベクトル
```math
\mathbf{v} = (1, 0, 0)
```
を回転させます


```math 
\mathbf{v}' = R_x \mathbf{v} = \begin{bmatrix}
1 & 0 & 0 \\
0 & 0 & -1 \\
0 & 1 & 0
\end{bmatrix} \begin{bmatrix}
1 \\
0 \\
0
\end{bmatrix} = \begin{bmatrix}
1 \\
0 \\
0
\end{bmatrix}
```

回転後のベクトルは
```math
(1, 0, 0)
```
です。

#### 2. Y軸周りに90度回転

次に、回転軸
```math
(0, 1, 0)
```
で、回転角度
```math
\theta
```
は90度
```math
\frac{\pi}{2}
```
です。

回転ベクトルは

```math 
\mathbf{r}_y = \frac{\pi}{2} (0, 1, 0) = \left( 0, \frac{\pi}{2}, 0 \right)
```

ロドリゲスの回転公式を使って回転行列を計算します

```math 
K_y = \begin{bmatrix}
0 & 0 & 1 \\
0 & 0 & 0 \\
-1 & 0 & 0
\end{bmatrix}
```

```math 
R_y = I + \sin\left(\frac{\pi}{2}\right) K_y + (1 - \cos\left(\frac{\pi}{2}\right)) K_y^2 
```

ここでも
```math
\sin\left(\frac{\pi}{2}\right) = 1
```
および
```math
\cos\left(\frac{\pi}{2}\right) = 0
```
なので、

```math 
R_y = I + K_y = \begin{bmatrix}
0 & 0 & 1 \\
0 & 1 & 0 \\
-1 & 0 & 0
\end{bmatrix}
```

X軸周りに回転後のベクトル
```math
(1, 0, 0)
```
を回転させます


```math 
\mathbf{v}'' = R_y \mathbf{v}' = \begin{bmatrix}
0 & 0 & 1 \\
0 & 1 & 0 \\
-1 & 0 & 0
\end{bmatrix} \begin{bmatrix}
1 \\
0 \\
0
\end{bmatrix} = \begin{bmatrix}
0 \\
0 \\
-1
\end{bmatrix}
```

回転後のベクトルは
```math
(0, 0, -1)
```
です。

#### 3. Z軸周りに90度回転

最後に、回転軸
```math
(0, 0, 1)
```
で、回転角度
```math
\theta
```
は90度
```math
\frac{\pi}{2}
```
です。

回転ベクトルは

```math 
\mathbf{r}_z = \frac{\pi}{2} (0, 0, 1) = \left( 0, 0, \frac{\pi}{2} \right)
```

ロドリゲスの回転公式を使って回転行列を計算します

```math 
K_z = \begin{bmatrix}
0 & -1 & 0 \\
1 & 0 & 0 \\
0 & 0 & 0
\end{bmatrix}
```

```math 
R_z = I + \sin\left(\frac{\pi}{2}\right) K_z + (1 - \cos\left(\frac{\pi}{2}\right)) K_z^2 
```

ここでも 
```math
\sin\left(\frac{\pi}{2}\right) = 1
```
および
```math
\cos\left(\frac{\pi}{2}\right) = 0
```
なので、

```math 
R_z = I + K_z = \begin{bmatrix}
0 & -1 & 0 \\
1 & 0 & 0 \\
0 & 0 & 1
\end{bmatrix}
```

Y軸周りに回転後のベクトル
```math
(0, 0, -1)
```
を回転させます

```math 
\mathbf{v}''' = R_z \mathbf{v}'' = \begin{bmatrix}
0 & -1 & 0 \\
1 & 0 & 0 \\
0 & 0 & 1
\end{bmatrix} \begin{bmatrix}
0 \\
0 \\
-1
\end{bmatrix} = \begin{bmatrix}
0 \\
0 \\
-1
\end{bmatrix}
```

最終的な回転後のベクトルは
```math
(0, 0, -1)
```
です。

このように、回転ベクトルを用いて3軸周りに順番に回転を適用することで、初期ベクトルの最終位置を計算することができます。