同次変換・アフィン変換 練習問題

2D・3D / DirectX11形式


導入:右から掛けるルールと左から掛けるルール

3Dグラフィックスの行列計算では、資料やライブラリによって点と行列の掛け方が違う。

大きく分けると、次の2種類がある。

方式 点の書き方 掛け算の形 よく見る場面
列ベクトル方式 縦に書く \[ P' = M P \] 数学の教科書、OpenGL系の説明
行ベクトル方式 横に書く \[ P' = P M \] DirectX系の説明

このプリントでは、最終的にDirectX11でよく使う行ベクトル方式で練習する。 ただし、最初に2つの違いを確認しておく。


1. 列ベクトル方式

列ベクトル方式では、点を縦に書く。

2Dの点 \(P(x, y)\) は、同次座標で次のように表す。

\[ P = \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} \]

変換後の点は、行列を左から掛けて求める。

\[ P' = M P \]

つまり、行列が左、点が右にある。


2. 列ベクトル方式の平行移動

列ベクトル方式で、x方向に \(t_x\)、y方向に \(t_y\) 平行移動する行列は次の形になる。

\[ T = \begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{bmatrix} \]

点に掛けると、次のようになる。

\[ P' = T P \]

\[ \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} \]

実際に掛け算すると、

\[ 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{bmatrix} x & y & 1 \end{bmatrix} \]

変換後の点は、点を左から行列に掛けて求める。

\[ P' = P M \]

つまり、点が左、行列が右にある。


4. 行ベクトル方式の平行移動

行ベクトル方式で、x方向に \(t_x\)、y方向に \(t_y\) 平行移動する行列は次の形になる。

\[ T = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ t_x & t_y & 1 \end{bmatrix} \]

点に掛けると、次のようになる。

\[ P' = P T \]

\[ \begin{bmatrix} x' & y' & 1 \end{bmatrix} = \begin{bmatrix} x & y & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ t_x & t_y & 1 \end{bmatrix} \]

実際に掛け算すると、

\[ 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{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{bmatrix} \]

行ベクトル方式

\[ \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ t_x & t_y & 1 \end{bmatrix} \]

列ベクトル方式では、平行移動は右端の列に入る。 行ベクトル方式では、平行移動は下の行に入る。


6. 掛け算のやり方の違い

列ベクトル方式

列ベクトル方式では、

\[ P' = M P \]

である。

例えば、

\[ \begin{bmatrix} a & b & c \\ d & e & f \\ g & h & i \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} \]

を計算すると、

\[ x' = ax + by + c \]

\[ y' = dx + ey + f \]

\[ w' = gx + hy + i \]

になる。


行ベクトル方式

行ベクトル方式では、

\[ P' = P M \]

である。

例えば、

\[ \begin{bmatrix} x & y & 1 \end{bmatrix} \begin{bmatrix} a & b & c \\ d & e & f \\ g & h & i \end{bmatrix} \]

を計算すると、

\[ x' = xa + yd + 1g \]

\[ y' = xb + ye + 1h \]

\[ w' = xc + yf + 1i \]

になる。

同じ行列に見えても、どちら側から掛けるかで使われる成分が変わる


7. 合成変換の順番の違い

点に対して、次の順番で変換したいとする。

  1. 拡大縮小 \(S\)
  2. 回転 \(R\)
  3. 平行移動 \(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{bmatrix} x & y & 1 \end{bmatrix} \]

または、

\[ P = \begin{bmatrix} x & y & z & 1 \end{bmatrix} \]

点は左から行列に掛ける

\[ P' = P M \]

合成変換は、実行したい順番に行列を並べる

例えば、

  1. 拡大縮小
  2. 回転
  3. 平行移動

なら、

\[ M = S R T \]

である。


2Dの同次座標

2次元の点 \(P(x, y)\) は、同次座標では次のように表す。

\[ P = \begin{bmatrix} x & y & 1 \end{bmatrix} \]

2Dのアフィン変換行列は、DirectX11形式では次の形になる。

\[ M = \begin{bmatrix} a & b & 0 \\ c & d & 0 \\ t_x & t_y & 1 \end{bmatrix} \]


2Dの基本変換行列

平行移動

\[ T = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ t_x & t_y & 1 \end{bmatrix} \]

拡大縮小

\[ S = \begin{bmatrix} s_x & 0 & 0 \\ 0 & s_y & 0 \\ 0 & 0 & 1 \end{bmatrix} \]

原点中心の回転

このプリントでは、2D回転は反時計回りを正とする。

\[ R = \begin{bmatrix} \cos\theta & \sin\theta & 0 \\ -\sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix} \]


第1部:2D同次変換


問題1:2D平行移動

点 \(P(2, 3)\) を、次のように平行移動する。

問い

  1. 平行移動行列 \(T\) を書け。
  2. 次の計算を行い、変換後の座標を求めよ。

\[ P' = P T \]

問い

  1. 平行移動行列 \(T\) を書け。
  2. 次の計算を行い、変換後の座標を求めよ。

\[ P' = P T \]

解答欄

\[ T = \begin{bmatrix} \quad & \quad & \quad \\ \quad & \quad & \quad \\ \quad & \quad & \quad \end{bmatrix} \]

変換後の座標:

\[ (\quad,\quad) \]


問題2:2D拡大縮小

点 \(P(2, 3)\) を、次のように拡大縮小する。

問い

  1. 拡大縮小行列 \(S\) を書け。
  2. 次の計算を行い、変換後の座標を求めよ。

\[ P' = P S \]

解答欄

\[ S = \begin{bmatrix} \quad & \quad & \quad \\ \quad & \quad & \quad \\ \quad & \quad & \quad \end{bmatrix} \]

変換後の座標:

\[ (\quad,\quad) \]


問題3:2D回転

点 \(P(1, 0)\) を、原点を中心に反時計回りに \(90^\circ\) 回転する。

\[ \cos 90^\circ = 0 \]

\[ \sin 90^\circ = 1 \]

問い

  1. 回転行列 \(R\) を書け。
  2. 次の計算を行い、変換後の座標を求めよ。

\[ P' = P R \]

解答欄

\[ R = \begin{bmatrix} \quad & \quad & \quad \\ \quad & \quad & \quad \\ \quad & \quad & \quad \end{bmatrix} \]

変換後の座標:

\[ (\quad,\quad) \]


問題4:2D合成変換

点 \(P(1, 2)\) に対して、次の順番で変換する。

  1. x方向に \(2\) 倍、y方向に \(3\) 倍する
  2. x方向に \(+5\)、y方向に \(-1\) 平行移動する

DirectX11形式なので、合成行列は次の順番になる。

\[ M = S T \]

問い

  1. 拡大縮小行列 \(S\) を書け。
  2. 平行移動行列 \(T\) を書け。
  3. 合成行列 \(M = S T\) を求めよ。
  4. 点 \(P\) の変換後の座標を求めよ。

解答欄

\[ S = \begin{bmatrix} \quad & \quad & \quad \\ \quad & \quad & \quad \\ \quad & \quad & \quad \end{bmatrix} \]

\[ T = \begin{bmatrix} \quad & \quad & \quad \\ \quad & \quad & \quad \\ \quad & \quad & \quad \end{bmatrix} \]

\[ M = S T = \begin{bmatrix} \quad & \quad & \quad \\ \quad & \quad & \quad \\ \quad & \quad & \quad \end{bmatrix} \]

変換後の座標:

\[ (\quad,\quad) \]


問題5:2D合成変換と順番の違い

点 \(P(1, 1)\) に対して、次の2通りの変換を行う。

A

  1. x方向に \(+3\)、y方向に \(0\) 平行移動する
  2. 全体を \(2\) 倍に拡大する

B

  1. 全体を \(2\) 倍に拡大する
  2. x方向に \(+3\)、y方向に \(0\) 平行移動する

問い

  1. Aの合成行列 \(M_A\) を求めよ。
  2. Bの合成行列 \(M_B\) を求めよ。
  3. AとBそれぞれの変換後の座標を求めよ。
  4. 結果が違う理由を説明せよ。

解答欄

Aの合成行列:

\[ M_A = \begin{bmatrix} \quad & \quad & \quad \\ \quad & \quad & \quad \\ \quad & \quad & \quad \end{bmatrix} \]

Aの変換後:

\[ (\quad,\quad) \]

Bの合成行列:

\[ M_B = \begin{bmatrix} \quad & \quad & \quad \\ \quad & \quad & \quad \\ \quad & \quad & \quad \end{bmatrix} \]

Bの変換後:

\[ (\quad,\quad) \]

理由:


第2部:3D同次変換


3Dの同次座標

3次元の点 \(P(x, y, z)\) は、同次座標では次のように表す。

\[ P = \begin{bmatrix} x & y & z & 1 \end{bmatrix} \]

3Dのアフィン変換行列は、DirectX11形式では次の形になる。

\[ M = \begin{bmatrix} a & b & c & 0 \\ d & e & f & 0 \\ g & h & i & 0 \\ t_x & t_y & t_z & 1 \end{bmatrix} \]


3Dの基本変換行列

平行移動

\[ T = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ t_x & t_y & t_z & 1 \end{bmatrix} \]

拡大縮小

\[ S = \begin{bmatrix} s_x & 0 & 0 & 0 \\ 0 & s_y & 0 & 0 \\ 0 & 0 & s_z & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \]

Y軸回転

このプリントでは、DirectXの左手系を前提とする。

\[ R_y = \begin{bmatrix} \cos\theta & 0 & -\sin\theta & 0 \\ 0 & 1 & 0 & 0 \\ \sin\theta & 0 & \cos\theta & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \]

\(90^\circ\) の場合は次のようになる。

\[ R_y = \begin{bmatrix} 0 & 0 & -1 & 0 \\ 0 & 1 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \]


問題6:3D平行移動

点 \(P(1, 2, 3)\) を、次のように平行移動する。

問い

  1. 平行移動行列 \(T\) を書け。
  2. 次の計算を行い、変換後の座標を求めよ。

\[ P' = P T \]

解答欄

\[ T = \begin{bmatrix} \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \end{bmatrix} \]

変換後の座標:

\[ (\quad,\quad,\quad) \]


問題7:3D拡大縮小

点 \(P(1, 2, 3)\) を、次のように拡大縮小する。

問い

  1. 拡大縮小行列 \(S\) を書け。
  2. 次の計算を行い、変換後の座標を求めよ。

\[ P' = P S \]

解答欄

\[ S = \begin{bmatrix} \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \end{bmatrix} \]

変換後の座標:

\[ (\quad,\quad,\quad) \]


問題8:3D Y軸回転

点 \(P(1, 0, 0)\) を、Y軸まわりに \(90^\circ\) 回転する。

問い

  1. Y軸回転行列 \(R_y\) を書け。
  2. 次の計算を行い、変換後の座標を求めよ。

\[ P' = P R_y \]

解答欄

\[ R_y = \begin{bmatrix} \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \end{bmatrix} \]

変換後の座標:

\[ (\quad,\quad,\quad) \]


問題9:3D合成変換

点 \(P(1, 2, 3)\) に対して、次の順番で変換する。

  1. 全体を \(2\) 倍に拡大する
  2. Y軸まわりに \(90^\circ\) 回転する
  3. x方向に \(+3\)、y方向に \(+1\)、z方向に \(+2\) 平行移動する

DirectX11形式なので、合成行列は次の順番になる。

\[ M = S R_y T \]

問い

  1. 拡大縮小行列 \(S\) を書け。
  2. Y軸回転行列 \(R_y\) を書け。
  3. 平行移動行列 \(T\) を書け。
  4. 合成行列 \(M = S R_y T\) を求めよ。
  5. 点 \(P\) の変換後の座標を求めよ。

解答欄

\[ S = \begin{bmatrix} \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \end{bmatrix} \]

\[ R_y = \begin{bmatrix} \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \end{bmatrix} \]

\[ T = \begin{bmatrix} \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \end{bmatrix} \]

\[ M = S R_y T = \begin{bmatrix} \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \end{bmatrix} \]

変換後の座標:

\[ (\quad,\quad,\quad) \]


問題10:3D合成変換と順番の違い

点 \(P(1, 0, 0)\) に対して、次の2通りの変換を行う。

A

  1. x方向に \(+5\) 平行移動する
  2. Y軸まわりに \(90^\circ\) 回転する

B

  1. Y軸まわりに \(90^\circ\) 回転する
  2. x方向に \(+5\) 平行移動する

問い

  1. Aの合成行列 \(M_A\) を求めよ。
  2. Bの合成行列 \(M_B\) を求めよ。
  3. AとBそれぞれの変換後の座標を求めよ。
  4. 結果が違う理由を説明せよ。

解答欄

Aの合成行列:

\[ M_A = \begin{bmatrix} \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \end{bmatrix} \]

Aの変換後:

\[ (\quad,\quad,\quad) \]

Bの合成行列:

\[ M_B = \begin{bmatrix} \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad \end{bmatrix} \]

Bの変換後:

\[ (\quad,\quad,\quad) \]

理由: