Skip to main content

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. 合成変換の順番の違い

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

  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{pmatrix} x & y & 1 \end{pmatrix} $$

または、

$$ P = \begin{pmatrix} x & y & z & 1 \end{pmatrix} $$

点は左から行列に掛ける

$$ P' = P M $$

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

例えば、

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

なら、

$$ 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$

問い

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

$$ 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$ 倍

問い

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

$$ 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 $$

問い

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

$$ P' = P R $$

解答欄

$$ R = \begin{pmatrix} \quad & \quad & \quad \ \quad & \quad & \quad \ \quad & \quad & \quad \end{pmatrix} $$

変換後の座標:

$$ (\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{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

  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{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$

問い

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

$$ 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$ 倍

問い

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

$$ 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$ 回転する。

問い

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

$$ 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)$ に対して、次の順番で変換する。

  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{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

  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{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 $$

である。

そのため、変換順が

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

なら、

$$ M = S R T $$

になる。


よくある間違い

列ベクトル形式の感覚で、

$$ M = T R S $$

と書くと、DirectX11形式では変換順が逆になってしまう。

このプリントでは、常に

$$ P' = P M $$

として計算する。