9月17日練習問題
同次変換・アフィン変換 練習問題
2D・3D / DirectX11形式
導入:右から掛けるルールと左から掛けるルール
3Dグラフィックスの行列計算では、資料やライブラリによって点と行列の掛け方が違う。
大きく分けると、次の2種類がある。
| 方式 | 点の書き方 | 掛け算の形 | よく見る場面 |
|---|---|---|---|
| 列ベクトル方式 | 縦に書く | $$P' = M P$$ | 数学の教科書、OpenGL系の説明 |
| 行ベクトル方式 | 横に書く | $$P' = P M$$ | DirectX系の説明 |
このプリントでは、最終的にDirectX11でよく使う行ベクトル方式で練習する。
ただし、最初に2つの違いを確認しておく。
1. 列ベクトル方式
列ベクトル方式では、点を縦に書く。
2Dの点 $P(x, y)$ は、同次座標で次のように表す。
$$ P = \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} $$
変換後の点は、行列を左から掛けて求める。
$$ P' = M P $$
つまり、行列が左、点が右にある。
2. 列ベクトル方式の平行移動
列ベクトル方式で、x方向に $t_x$、y方向に $t_y$ 平行移動する行列は次の形になる。
$$ T = \begin{pmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{pmatrix} $$
点に掛けると、次のようになる。
$$ P' = T P $$
$$ \begin{pmatrix} x' \\ y' \\ 1 \end{pmatrix}
\begin{pmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} $$
実際に掛け算すると、
$$ x' = 1 \times x + 0 \times y + t_x \times 1 $$
$$ y' = 0 \times x + 1 \times y + t_y \times 1 $$
したがって、
$$ x' = x + t_x $$
$$ y' = y + t_y $$
になる。
3. 行ベクトル方式
行ベクトル方式では、点を横に書く。
2Dの点 $P(x, y)$ は、同次座標で次のように表す。
$$ P = \begin{pmatrix} x & y & 1 \end{pmatrix} $$
変換後の点は、点を左から行列に掛けて求める。
$$ P' = P M $$
つまり、点が左、行列が右にある。
4. 行ベクトル方式の平行移動
行ベクトル方式で、x方向に $t_x$、y方向に $t_y$ 平行移動する行列は次の形になる。
$$ T = \begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ t_x & t_y & 1 \end{pmatrix} $$
点に掛けると、次のようになる。
$$ P' = P T $$
$$ \begin{pmatrix} x' & y' & 1 \end{pmatrix}
\begin{pmatrix} x & y & 1 \end{pmatrix} \begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ t_x & t_y & 1 \end{pmatrix} $$
実際に掛け算すると、
$$ x' = x \times 1 + y \times 0 + 1 \times t_x $$
$$ y' = x \times 0 + y \times 1 + 1 \times t_y $$
したがって、
$$ x' = x + t_x $$
$$ y' = y + t_y $$
になる。
5. 同じ変換でも行列の形が違う
同じ「x方向に $t_x$、y方向に $t_y$ 平行移動」でも、列ベクトル方式と行ベクトル方式では、行列の形が違う。
列ベクトル方式
$$ \begin{pmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{pmatrix} $$
行ベクトル方式
$$ \begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ t_x & t_y & 1 \end{pmatrix} $$
列ベクトル方式では、平行移動は右端の列に入る。
行ベクトル方式では、平行移動は下の行に入る。
6. 掛け算のやり方の違い
列ベクトル方式
列ベクトル方式では、
$$ P' = M P $$
である。
例えば、
$$ \begin{pmatrix} a & b & c \\ d & e & f \\ g & h & i \end{pmatrix} \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} $$
を計算すると、
$$ x' = ax + by + c $$
$$ y' = dx + ey + f $$
$$ w' = gx + hy + i $$
になる。
行ベクトル方式
行ベクトル方式では、
$$ P' = P M $$
である。
例えば、
$$ \begin{pmatrix} x & y & 1 \end{pmatrix} \begin{pmatrix} a & b & c \\ d & e & f \\ g & h & i \end{pmatrix} $$
を計算すると、
$$ x' = xa + yd + 1g $$
$$ y' = xb + ye + 1h $$
$$ w' = xc + yf + 1i $$
になる。
同じ行列に見えても、どちら側から掛けるかで使われる成分が変わる。
7. 合成変換の順番の違い
点に対して、次の順番で変換したいとする。
- 拡大縮小 $S$
- 回転 $R$
- 平行移動 $T$
列ベクトル方式の場合
列ベクトル方式では、
$$ P' = M P $$
である。
実際の計算は次のようになる。
$$ P' = T R S P $$
つまり、合成行列は、
$$ M = T R S $$
である。
行列の見た目としては、後に実行する変換ほど左側に来る。
行ベクトル方式の場合
行ベクトル方式では、
$$ P' = P M $$
である。
実際の計算は次のようになる。
$$ P' = P S R T $$
つまり、合成行列は、
$$ M = S R T $$
である。
行列の見た目としては、実行したい順番に左から右へ並べればよい。
8. このプリントで使うルール
このプリントでは、DirectX11形式として、次のルールで統一する。
点は行ベクトルで書く
$$ P = \begin{pmatrix} x & y & 1 \end{pmatrix} $$
または、
$$ P = \begin{pmatrix} x & y & z & 1 \end{pmatrix} $$
点は左から行列に掛ける
$$ P' = P M $$
合成変換は、実行したい順番に行列を並べる
例えば、
- 拡大縮小
- 回転
- 平行移動
なら、
$$ M = S R T $$
である。
2Dの同次座標
2次元の点 $P(x, y)$ は、同次座標では次のように表す。
$$ P = \begin{pmatrix} x & y & 1 \end{pmatrix} $$
2Dのアフィン変換行列は、DirectX11形式では次の形になる。
$$ M = \begin{pmatrix} a & b & 0 \\ c & d & 0 \\ t_x & t_y & 1 \end{pmatrix} $$
2Dの基本変換行列
平行移動
$$ T = \begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ t_x & t_y & 1 \end{pmatrix} $$
拡大縮小
$$ S = \begin{pmatrix} s_x & 0 & 0 \\ 0 & s_y & 0 \\ 0 & 0 & 1 \end{pmatrix} $$
原点中心の回転
このプリントでは、2D回転は反時計回りを正とする。
$$ R = \begin{pmatrix} \cos\theta & \sin\theta & 0 \\ -\sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{pmatrix} $$
第1部:2D同次変換
問題1:2D平行移動
点 $P(2, 3)$ を、次のように平行移動する。
- x方向に $+4$
- y方向に $-1$
問い
- 平行移動行列 $T$ を書け。
- 次の計算を行い、変換後の座標を求めよ。
$$ P' = P T $$
解答欄
$$ T = \begin{pmatrix} \quad & \quad & \quad \\ \quad & \quad & \quad \\ \quad & \quad & \quad \end{pmatrix} $$
変換後の座標:
$$ (\quad,\quad) $$
問題2:2D拡大縮小
点 $P(2, 3)$ を、次のように拡大縮小する。
- x方向に $3$ 倍
- y方向に $2$ 倍
問い
- 拡大縮小行列 $S$ を書け。
- 次の計算を行い、変換後の座標を求めよ。
$$ P' = P S $$
解答欄
$$ S = \begin{pmatrix} \quad & \quad & \quad \\ \quad & \quad & \quad \\ \quad & \quad & \quad \end{pmatrix} $$
変換後の座標:
$$ (\quad,\quad) $$
問題3:2D回転
点 $P(1, 0)$ を、原点を中心に反時計回りに $90^\circ$ 回転する。
$$ \cos 90^\circ = 0 $$
$$ \sin 90^\circ = 1 $$
問い
- 回転行列 $R$ を書け。
- 次の計算を行い、変換後の座標を求めよ。
$$ P' = P R $$
解答欄
$$ R = \begin{pmatrix} \quad & \quad & \quad \\ \quad & \quad & \quad \\ \quad & \quad & \quad \end{pmatrix} $$
変換後の座標:
$$ (\quad,\quad) $$
問題4:2D合成変換
点 $P(1, 2)$ に対して、次の順番で変換する。
- x方向に $2$ 倍、y方向に $3$ 倍する
- x方向に $+5$、y方向に $-1$ 平行移動する
DirectX11形式なので、合成行列は次の順番になる。
$$ M = S T $$
問い
- 拡大縮小行列 $S$ を書け。
- 平行移動行列 $T$ を書け。
- 合成行列 $M = S T$ を求めよ。
- 点 $P$ の変換後の座標を求めよ。
解答欄
$$ S = \begin{pmatrix} \quad & \quad & \quad \\ \quad & \quad & \quad \\ \quad & \quad & \quad \end{pmatrix} $$
$$ T = \begin{pmatrix} \quad & \quad & \quad \\ \quad & \quad & \quad \\ \quad & \quad & \quad \end{pmatrix} $$
$$ M = S T = \begin{pmatrix} \quad & \quad & \quad \\ \quad & \quad & \quad \\ \quad & \quad & \quad \end{pmatrix} $$
変換後の座標:
$$ (\quad,\quad) $$
問題5:2D合成変換と順番の違い
点 $P(1, 1)$ に対して、次の2通りの変換を行う。
A
- x方向に $+3$、y方向に $0$ 平行移動する
- 全体を $2$ 倍に拡大する
B
- 全体を $2$ 倍に拡大する
- x方向に $+3$、y方向に $0$ 平行移動する
問い
- Aの合成行列 $M_A$ を求めよ。
- Bの合成行列 $M_B$ を求めよ。
- AとBそれぞれの変換後の座標を求めよ。
- 結果が違う理由を説明せよ。
解答欄
Aの合成行列:
$$ M_A = \begin{pmatrix} \quad & \quad & \quad \\ \quad & \quad & \quad \\ \quad & \quad & \quad \end{pmatrix} $$
Aの変換後:
$$ (\quad,\quad) $$
Bの合成行列:
$$ M_B = \begin{pmatrix} \quad & \quad & \quad \\ \quad & \quad & \quad \\ \quad & \quad & \quad \end{pmatrix} $$
Bの変換後:
$$ (\quad,\quad) $$
理由:
第2部:3D同次変換
3Dの同次座標
3次元の点 $P(x, y, z)$ は、同次座標では次のように表す。
$$ P = \begin{pmatrix} x & y & z & 1 \end{pmatrix} $$
3Dのアフィン変換行列は、DirectX11形式では次の形になる。
$$ M = \begin{pmatrix} a & b & c & 0 \\ d & e & f & 0 \\ g & h & i & 0 \\ t_x & t_y & t_z & 1 \end{pmatrix} $$
3Dの基本変換行列
平行移動
$$ T = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ t_x & t_y & t_z & 1 \end{pmatrix} $$
拡大縮小
$$ S = \begin{pmatrix} s_x & 0 & 0 & 0 \\ 0 & s_y & 0 & 0 \\ 0 & 0 & s_z & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} $$
Y軸回転
このプリントでは、DirectXの左手系を前提とする。
$$ R_y = \begin{pmatrix} \cos\theta & 0 & -\sin\theta & 0 \\ 0 & 1 & 0 & 0 \\ \sin\theta & 0 & \cos\theta & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} $$
$90^\circ$ の場合は次のようになる。
$$ R_y = \begin{pmatrix} 0 & 0 & -1 & 0 \\ 0 & 1 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} $$
問題6:3D平行移動
点 $P(1, 2, 3)$ を、次のように平行移動する。
- x方向に $+4$
- y方向に $-2$
- z方向に $+1$
問い
- 平行移動行列 $T$ を書け。
- 次の計算を行い、変換後の座標を求めよ。
$$ P' = P T $$
解答欄
$$ T = \begin{pmatrix} \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \end{pmatrix} $$
変換後の座標:
$$ (\quad,\quad,\quad) $$
問題7:3D拡大縮小
点 $P(1, 2, 3)$ を、次のように拡大縮小する。
- x方向に $2$ 倍
- y方向に $3$ 倍
- z方向に $4$ 倍
問い
- 拡大縮小行列 $S$ を書け。
- 次の計算を行い、変換後の座標を求めよ。
$$ P' = P S $$
解答欄
$$ S = \begin{pmatrix} \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \end{pmatrix} $$
変換後の座標:
$$ (\quad,\quad,\quad) $$
問題8:3D Y軸回転
点 $P(1, 0, 0)$ を、Y軸まわりに $90^\circ$ 回転する。
問い
- Y軸回転行列 $R_y$ を書け。
- 次の計算を行い、変換後の座標を求めよ。
$$ P' = P R_y $$
解答欄
$$ R_y = \begin{pmatrix} \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \end{pmatrix} $$
変換後の座標:
$$ (\quad,\quad,\quad) $$
問題9:3D合成変換
点 $P(1, 2, 3)$ に対して、次の順番で変換する。
- 全体を $2$ 倍に拡大する
- Y軸まわりに $90^\circ$ 回転する
- x方向に $+3$、y方向に $+1$、z方向に $+2$ 平行移動する
DirectX11形式なので、合成行列は次の順番になる。
$$ M = S R_y T $$
問い
- 拡大縮小行列 $S$ を書け。
- Y軸回転行列 $R_y$ を書け。
- 平行移動行列 $T$ を書け。
- 合成行列 $M = S R_y T$ を求めよ。
- 点 $P$ の変換後の座標を求めよ。
解答欄
$$ S = \begin{pmatrix} \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \end{pmatrix} $$
$$ R_y = \begin{pmatrix} \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \end{pmatrix} $$
$$ T = \begin{pmatrix} \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \end{pmatrix} $$
$$ M = S R_y T = \begin{pmatrix} \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \end{pmatrix} $$
変換後の座標:
$$ (\quad,\quad,\quad) $$
問題10:3D合成変換と順番の違い
点 $P(1, 0, 0)$ に対して、次の2通りの変換を行う。
A
- x方向に $+5$ 平行移動する
- Y軸まわりに $90^\circ$ 回転する
B
- Y軸まわりに $90^\circ$ 回転する
- x方向に $+5$ 平行移動する
問い
- Aの合成行列 $M_A$ を求めよ。
- Bの合成行列 $M_B$ を求めよ。
- AとBそれぞれの変換後の座標を求めよ。
- 結果が違う理由を説明せよ。
解答欄
Aの合成行列:
$$ M_A = \begin{pmatrix} \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \end{pmatrix} $$
Aの変換後:
$$ (\quad,\quad,\quad) $$
Bの合成行列:
$$ M_B = \begin{pmatrix} \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \end{pmatrix} $$
Bの変換後:
$$ (\quad,\quad,\quad) $$
理由:
解答例
問題1
$$ T = \begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 4 & -1 & 1 \end{pmatrix} $$
答え:
$$ (6, 2) $$
問題2
$$ S = \begin{pmatrix} 3 & 0 & 0 \\ 0 & 2 & 0 \\ 0 & 0 & 1 \end{pmatrix} $$
答え:
$$ (6, 6) $$
問題3
$$ R = \begin{pmatrix} 0 & 1 & 0 \\ -1 & 0 & 0 \\ 0 & 0 & 1 \end{pmatrix} $$
答え:
$$ (0, 1) $$
問題4
$$ S = \begin{pmatrix} 2 & 0 & 0 \\ 0 & 3 & 0 \\ 0 & 0 & 1 \end{pmatrix} $$
$$ T = \begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 5 & -1 & 1 \end{pmatrix} $$
$$ M = S T = \begin{pmatrix} 2 & 0 & 0 \\ 0 & 3 & 0 \\ 5 & -1 & 1 \end{pmatrix} $$
答え:
$$ (7, 5) $$
問題5
Aは、平行移動してから拡大するので、
$$ M_A = T S $$
$$ M_A = \begin{pmatrix} 2 & 0 & 0 \\ 0 & 2 & 0 \\ 6 & 0 & 1 \end{pmatrix} $$
答え:
$$ (8, 2) $$
Bは、拡大してから平行移動するので、
$$ M_B = S T $$
$$ M_B = \begin{pmatrix} 2 & 0 & 0 \\ 0 & 2 & 0 \\ 3 & 0 & 1 \end{pmatrix} $$
答え:
$$ (5, 2) $$
平行移動の前に拡大するか、後に拡大するかで、移動量も拡大されるかどうかが変わる。
問題6
$$ T = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 4 & -2 & 1 & 1 \end{pmatrix} $$
答え:
$$ (5, 0, 4) $$
問題7
$$ S = \begin{pmatrix} 2 & 0 & 0 & 0 \\ 0 & 3 & 0 & 0 \\ 0 & 0 & 4 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} $$
答え:
$$ (2, 6, 12) $$
問題8
$$ R_y = \begin{pmatrix} 0 & 0 & -1 & 0 \\ 0 & 1 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} $$
答え:
$$ (0, 0, -1) $$
問題9
$$ S = \begin{pmatrix} 2 & 0 & 0 & 0 \\ 0 & 2 & 0 & 0 \\ 0 & 0 & 2 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} $$
$$ R_y = \begin{pmatrix} 0 & 0 & -1 & 0 \\ 0 & 1 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} $$
$$ T = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 3 & 1 & 2 & 1 \end{pmatrix} $$
$$ M = S R_y T = \begin{pmatrix} 0 & 0 & -2 & 0 \\ 0 & 2 & 0 & 0 \\ 2 & 0 & 0 & 0 \\ 3 & 1 & 2 & 1 \end{pmatrix} $$
答え:
$$ (9, 5, 0) $$
問題10
Aは、平行移動してから回転するので、
$$ M_A = T R_y $$
$$ M_A = \begin{pmatrix} 0 & 0 & -1 & 0 \\ 0 & 1 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ 0 & 0 & -5 & 1 \end{pmatrix} $$
答え:
$$ (0, 0, -6) $$
Bは、回転してから平行移動するので、
$$ M_B = R_y T $$
$$ M_B = \begin{pmatrix} 0 & 0 & -1 & 0 \\ 0 & 1 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ 5 & 0 & 0 & 1 \end{pmatrix} $$
答え:
$$ (5, 0, -1) $$
平行移動してから回転すると、移動後の位置全体が原点の周りを回転する。
回転してから平行移動すると、向きだけを変えてから指定方向に移動する。
確認ポイント
DirectX11形式の合成順
点を行ベクトルで扱う場合、
$$ P' = P M $$
である。
そのため、変換順が
- 拡大縮小
- 回転
- 平行移動
なら、
$$ M = S R T $$
になる。
よくある間違い
列ベクトル形式の感覚で、
$$ M = T R S $$
と書くと、DirectX11形式では変換順が逆になってしまう。
このプリントでは、常に
$$ P' = P M $$
として計算する。