ベクトル・行列

主に3DCG関係で自分がよく使用する数式の自分用メモです。
が、折角なので他人が見ても役に立てられるようやや冗長に書いておきます。

#ベクトル・行列の表記
```math
x =
\begin{pmatrix}
x_{0}\\
x_{1}\\
x_{2}
\end{pmatrix}\\
M =
\begin{pmatrix}
M_{00} & M_{01} & M_{02}\\
M_{10} & M_{11} & M_{12}\\
M_{20} & M_{21} & M_{22}\\
\end{pmatrix}
```


#行列式
```math
\begin{align}
detM &=
\begin{vmatrix}
M_{00} & M_{01} & M_{02}\\
M_{10} & M_{11} & M_{12}\\
M_{20} & M_{21} & M_{22}\\
\end{vmatrix}\\
&= M_{00}(M_{11}M_{22}-M_{12}M_{21})+M_{01}(M_{12}M_{20}-M_{10}M_{22})+M_{02}(M_{10}M_{21}-M_{11}M_{20})
\end{align}
```

#ベクトルの積
```math
x \cdot y=\sum{x_i y_i}\\
x \times y =
\begin{vmatrix}
e_0 & e_1 & e_2\\
x_0 & x_1 & x_2\\
y_0 & y_1 & y_2\\
\end{vmatrix}\\
e_0 =
\begin{pmatrix}
1\\
0\\
0
\end{pmatrix}, \quad
e_1 =
\begin{pmatrix}
0\\
1\\
0
\end{pmatrix},  \quad
e_2 =
\begin{pmatrix}
0\\
0\\
1
\end{pmatrix}
```


#行列の積
```math
(M \cdot N)_{ij} = \sum_{k}{M_{ik}N_{kj}}
```

#転置行列
```math
M^T =
\begin{pmatrix}
M_{00} & M_{10} & M_{20}\\
M_{01} & M_{11} & M_{21}\\
M_{02} & M_{12} & M_{22}\\
\end{pmatrix}
```

#余因子行列
※各行列要素の列と行を除いて出来る行列の行列式に (-1)^(i+j) を乗じて転置した行列

```math
\tilde{M} =
\begin{pmatrix}
\begin{vmatrix}
M_{11} & M_{21}\\
M_{12} & M_{22}\\
\end{vmatrix} &
-\begin{vmatrix}
M_{01} & M_{21}\\
M_{02} & M_{22}
\end{vmatrix} &
\begin{vmatrix}
M_{01} & M_{11}\\
M_{02} & M_{12}\\
\end{vmatrix} &\\

-\begin{vmatrix}
M_{10} & M_{20}\\
M_{12} & M_{22}
\end{vmatrix} &
\begin{vmatrix}
M_{00} & M_{20}\\
M_{02} & M_{22}
\end{vmatrix} &
-\begin{vmatrix}
M_{00} & M_{10}\\
M_{02} & M_{12}
\end{vmatrix}\\

\begin{vmatrix}
M_{10} & M_{20}\\
M_{11} & M_{21}
\end{vmatrix} &
-\begin{vmatrix}
M_{00} & M_{20}\\
M_{01} & M_{21}
\end{vmatrix} &
\begin{vmatrix}
M_{00} & M_{10}\\
M_{01} & M_{11}
\end{vmatrix}
\end{pmatrix}^T
```

#逆行列
※3次元行列でも4次元行列でも同じ

```math
\begin{align}
M^{-1}M &= MM^{-1} = I\\
M^{-1} &= \frac{1}{detM}\tilde{M}\\
I_{ij} &= \left\{
\begin{array}{ll}
1 & (i=j) \\
0 & (i \neq j)
\end{array}
\right.
\end{align}
```

#軸周り回転行列
各xyz軸を回転軸とする行列
※但し回転方向は私の俺々エンジンの座標系で、軸の延びる方向（＋∞）に向かって半時計回りに定義。
　x右、y下、z奥という世間的には変な座標系を採用しているので、利用する座標系によっては回転方向が逆になるので注意。

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

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

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

#任意ベクトルａをｚ軸と平行にする回転
※カメラ空間へ変換する行列を作るときなど

```math
b = \sqrt{a_0^2 + a_2^2}\\
c = \begin{vmatrix} a \end{vmatrix} =  \sqrt{a_0^2 + a_1^2 + a_2^2}\\
Cam(a) =
\frac{1}{c}
\begin{pmatrix}
1 & 0 & 0\\
0 & b & -a_1\\
0 & a_1 & b\\
\end{pmatrix}
\frac{1}{b}
\begin{pmatrix}
a_2 & 0 & -a_0\\
0 & 1 & 0\\
a_0 & 0 & a_2\\
\end{pmatrix}\\
Cam(a) \cdot a = \begin{pmatrix} 0\\ 0\\ c \end{pmatrix}
```
※b=0 の時は 1/b 以降は無視する


#ｚ軸ベクトルを任意ベクトルａと平行にする回転
※さっきと逆の操作。

```math
b = \sqrt{a_0^2 + a_2^2}\\
c = \begin{vmatrix} a \end{vmatrix} =  \sqrt{a_0^2 + a_1^2 + a_2^2}\\
Angle(a) =
\frac{1}{b}
\begin{pmatrix}
a_2 & 0 & a_0\\
0 & 1 & 0\\
-a_0 & 0 & a_2\\
\end{pmatrix}
\frac{1}{c}
\begin{pmatrix}
1 & 0 & 0\\
0 & b & a_1\\
0 & -a_1 & b\\
\end{pmatrix}\\

Angle(a) \begin{pmatrix} 0\\ 0\\ 1 \end{pmatrix} = \frac{a}{c}
```

#任意のベクトルａを回転軸として回転する行列
※回転方向はベクトル a の向きに向かって反時計回り
　これまで定義した式を使って

```math
Rot(a,\theta) = Cam(a)^{-1} \cdot R_z(\theta)  \cdot Cam(a)
```

#任意のベクトルａを回転して任意のベクトルｂと平行にする回転行列
※さらに応用編

```math
\begin{align}
c &= a \times b\\
\acute{a} &= Cam(c) \cdot \frac{a}{\begin{vmatrix} a \end{vmatrix}} \\
\acute{b} &= Cam(c) \cdot \frac{b}{\begin{vmatrix} b \end{vmatrix}} \\
x &= \acute{a}_0 \acute{b}_0 + \acute{a}_1 \acute{b}_1\\
y &= \acute{a}_0 \acute{b}_1 - \acute{a}_1 \acute{b}_0\\
R(a,b) &= Cam(c)^{-1} \cdot \begin{pmatrix}
x & -y & 0\\
y & x & 0\\
0 & 0 & 1\\
\end{pmatrix} \cdot Cam(c)
\end{align}
```


#少しリッチなカメラ行列
カメラの向き：a、カメラの天頂方向：b として

```math
\begin{align}
g &= Cam(a) \cdot b\\
x &= \frac{g_0}{\sqrt{g_0^2 + g_1^2}}\\
y &= \frac{g_1}{\sqrt{g_0^2 + g_1^2}}\\
RCam(a,b) &=
\begin{pmatrix}
-y & x & 0\\
-x & -y & 0\\
0 & 0 & 1
\end{pmatrix}
\cdot Cam(a)
\end{align}
```

#任意のベクトル方向へ拡大縮小
拡大縮小の軸：a、拡大率：s として

```math
Mag(a,s) = Cam(a)^{-1}
\begin{pmatrix} 
1 & 0 & 0\\
0 & 1 & 0\\
0 & 0 & s
\end{pmatrix}
Cam(a)
```