モノトーンの伝説日記

Apex Legends, Splatoon, Programming, and so on...

同次変換行列をまとめる

 まとめておく。

概要

  1. 最初に
  2. 平行移動 (translation)
  3. 拡大縮小 (scaling)
  4. 任意軸周り回転 (rotation)
  5. せん断 (skew)
  6. まとめ

1. 最初に

 Direct3D で使われている“左手座標系”で記述。行ベクトルを用いる。つまり、

 \displaystyle
\left[ \begin{matrix} x' & y' & z' & 1 \end{matrix} \right]
=
\left[ \begin{matrix} x & y & z & 1 \end{matrix} \right]
\left[ \begin{matrix} P & A & B & 0 \\ C & Q & D & 0 \\ E & F & R & 0 \\ X & Y & Z & 1 \end{matrix} \right]

という式になる。ここにおける 4x4 行列を順に列挙していく。

2. 平行移動 (translation)

(X, Y, Z) 分平行移動

 \displaystyle
\left[ \begin{matrix}
1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 1 & 0 \\
X & Y & Z & 1
\end{matrix} \right]

3. 拡大縮小 (scaling)

(P, Q, R) 倍ずつ拡大

 \displaystyle
\left[ \begin{matrix}
P & 0 & 0 & 0 \\
0 & Q & 0 & 0 \\
0 & 0 & R & 0 \\
0 & 0 & 0 & 1
\end{matrix} \right]

3.1. (K, L, M) を中心に拡大縮小

(K, L, M) を中心に (P, Q, R) 倍ずつ拡大

 \displaystyle
\left[ \begin{matrix}
P & 0 & 0 & 0 \\
0 & Q & 0 & 0 \\
0 & 0 & R & 0 \\
K \left( 1 - P \right) & L \left( 1 - Q \right) & M \left( 1 - R \right) & 1
\end{matrix} \right]

なお、[(-K, -L, -M) 平行移動][拡大縮小][(K, L, M) 平行移動] で求められる。

4. 任意軸周り回転 (rotation)

単位ベクトル V=(X, Y, Z) を軸に R [rad] 回転

 \displaystyle
\left[ \begin{matrix}
X^2 \left( 1 - \cos{R} \right) + \cos{R} & XY \left( 1 - \cos{R} \right) + Z \sin{R} & XZ \left( 1 - \cos{R} \right) - Y \sin{R} & 0 \\
XY \left( 1 - \cos{R} \right) - Z \sin{R} & Y^2 \left( 1 - \cos{R} \right) + \cos{R} & YZ \left( 1 - \cos{R} \right) + X \sin{R} & 0 \\
XZ \left( 1 - \cos{R} \right) + Y \sin{R} & YZ \left( 1 - \cos{R} \right) - X \sin{R} & Z^2 \left( 1 - \cos{R} \right) + \cos{R} & 0 \\
0 & 0 & 0 & 1 \end{matrix} \right]

4.1. X 軸周り回転

V=(1, 0, 0) のとき、

 \displaystyle
\left[ \begin{matrix}
1 & 0 & 0 & 0 \\
0 & \cos{R} & \sin{R} & 0 \\
0 & - \sin{R} & \cos{R} & 0 \\
0 & 0 & 0 & 1
\end{matrix} \right]

4.1.1. X 軸対称

R=π のとき、

 \displaystyle
\left[ \begin{matrix}
1 & 0 & 0 & 0 \\
0 & -1 & 0 & 0 \\
0 & 0 & -1 & 0 \\
0 & 0 & 0 & 1
\end{matrix} \right]

4.2. Y 軸周り回転

V=(0, 1, 0) のとき、

 \displaystyle
\left[ \begin{matrix}
\cos{R} & 0 & \sin{R} & 0 \\
0 & 1 & 0 & 0 \\
 - \sin{R} & 0 & \cos{R} & 0 \\
0 & 0 & 0 & 1
\end{matrix} \right]

4.2.1. Y 軸対象

R=π のとき、

 \displaystyle
\left[ \begin{matrix}
 -1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & -1 & 0 \\
0 & 0 & 0 & 1
\end{matrix} \right]

4.3. Z 軸周り回転

V=(0, 0, 1) のとき、

 \displaystyle
\left[ \begin{matrix}
\cos{R} & \sin{R} & 0 & 0 \\
 - \sin{R} & \cos{R} & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1
\end{matrix} \right]

4.3.1. Z 軸対称

R=π のとき、

 \displaystyle
\left[ \begin{matrix}
 -1 & 0 & 0 & 0 \\
0 & -1 & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1
\end{matrix} \right]

4.4. 任意軸対称

R=π のとき、

 \displaystyle
\left[ \begin{matrix}
2X^2 - 1 & 2XY & 2XZ & 0 \\
2XY & 2Y^2 - 1 & 2YZ & 0 \\
2XZ & 2YZ & 2Z^2 - 1 & 0 \\
0 & 0 & 0 & 1 \end{matrix} \right]

4.5. (K, L, M) を中心に任意軸周り回転

(K, L, M) を中心に単位ベクトル V=(X, Y, Z) を軸に R [rad] 回転

 \displaystyle
\left[ \begin{matrix}
X^2 \left( 1 - \cos{R} \right) + \cos{R} & XY \left( 1 - \cos{R} \right) + Z \sin{R} & XZ \left( 1 - \cos{R} \right) - Y \sin{R} & 0 \\
XY \left( 1 - \cos{R} \right) - Z \sin{R} & Y^2 \left( 1 - \cos{R} \right) + \cos{R} & YZ \left( 1 - \cos{R} \right) + X \sin{R} & 0 \\
XZ \left( 1 - \cos{R} \right) + Y \sin{R} & YZ \left( 1 - \cos{R} \right) - X \sin{R} & Z^2 \left( 1 - \cos{R} \right) + \cos{R} & 0 \\
K \left( 1 - S_{11} \right) -LS_{21} -MS_{31} & -KS_{12} +L \left( 1 - S_{22} \right) -MS_{32} & -KS_{13} -LS_{23} +M \left( 1 - S_{33} \right) & 1 \end{matrix} \right]

ただし、 \displaystyle S_{mn} は自身の行列 m 行 n 列。

5. せん断 (skew)

次のようにせん断係数を定義する:

  •  xy_x: XY-plane における x-axis のせん断係数
  •  xy_y: XY-plane における y-axis のせん断係数
  •  yz_y: YZ-plane における y-axis のせん断係数
  •  yz_z: YZ-plane における z-axis のせん断係数
  •  zx_z: ZX-plane における z-axis のせん断係数
  •  zx_x: ZX-plane における x-axis のせん断係数

せん断係数の特徴として 1 のとき  \displaystyle \frac{\pi}{4} [rad] (45°) になる。

 \displaystyle
\left[ \begin{matrix}
1 & xy_y & zx_z & 0 \\
xy_x & 1 & yz_z & 0 \\
zx_x & yz_y & 1 & 0 \\
0 & 0 & 0 & 1
\end{matrix} \right]

6. まとめ

 ほかにも点対称 (平行移動と原点対称を組み合わせればすぐできる) や面対称なども考えられますね。主要な変換はこんな感じでいいと思います。逆にこれらを組み合わせてどんな変換ができるのか突き詰めると面白いかもしれません。