3次元のアフィン変換の説明と定義

3次元のアフィン変換について簡単に説明と定義をまとめています。変換結果を見られるツールもあります。アフィン変換の行列である、回転、拡大縮小、平行移動、せん断の定義を記載しています。

アフィン変換とは

アフィン変換とは、回転、拡大縮小、せん断、平行移動の組み合わせからなる変換のことです。 3Dグラフィックスで使われるワールド変換やビュー変換はアフィン変換です。

簡単な定義としては、線形変換(回転、拡大縮小、せん断)と平行移動の組み合わせです。

線形変換とは次のような変換のことを言います。

  • 直線は直線のまま保たれる
  • 任意の直線上にある点の距離の比率が保たれる
  • 原点が移動しない

つまり、透視変換は含まれません。

ツールで変換してみる

ツールでアフィン変換のパラメータを変えながら変換されたモデルを見ることができます。

数式を編集して行列を掛ける順番を変更したり任意の行列を定義することも可能です。 アフィン変換行列の定義については次節も参照してください。

クリックするとツールが展開します。

アフィン変換行列の定義

列優先の場合のアフィン変換行列の定義です。行優先の場合は転置して読み替えてください。

変換行列全般に言える性質ですが、行列同士の積で変換を合成できます。 変換順序も反映されるため、任意の組み合わせと順番で合成した変換行列を求めることができます。 アフィン変換のみを合成した結果はアフィン変換になります。

回転(Rotation)

X軸まわりの回転:

(10000cosθsinθ00sinθcosθ00001)\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & \cosθ & -\sinθ & 0 \\ 0 & \sinθ & \cosθ & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}
  • θθ : 回転角度

Y軸まわりの回転:

(cosθ0sinθ00100sinθ0cosθ00001)\begin{pmatrix} \cosθ & 0 & \sinθ & 0 \\ 0 & 1 & 0 & 0 \\ -\sinθ & 0 & \cosθ & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}
  • θθ : 回転角度

Z軸まわりの回転:

(cosθsinθ00sinθcosθ0000100001)\begin{pmatrix} \cosθ & -\sinθ & 0 & 0 \\ \sinθ & \cosθ & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}
  • θθ : 回転角度

拡大縮小(Scaling)

(Sx0000Sy0000Sz00001)\begin{pmatrix} S_\mathrm{x} & 0 & 0 & 0 \\ 0 & S_\mathrm{y} & 0 & 0 \\ 0 & 0 & S_\mathrm{z} & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}
  • SxS_\mathrm{x} : X軸方向の倍率
  • SyS_\mathrm{y} : Y軸方向の倍率
  • SzS_\mathrm{z} : Z軸方向の倍率

平行移動(Translation)

(100Tx010Ty001Tz0001)\begin{pmatrix} 1 & 0 & 0 & T_\mathrm{x} \\ 0 & 1 & 0 & T_\mathrm{y} \\ 0 & 0 & 1 & T_\mathrm{z} \\ 0 & 0 & 0 & 1 \end{pmatrix}
  • TxT_\mathrm{x} : X軸方向の移動量
  • TyT_\mathrm{y} : Y軸方向の移動量
  • TzT_\mathrm{z} : Z軸方向の移動量

せん断(Shear)

(1HyxHzx0Hxy1Hzy0HxzHyz100001)\begin{pmatrix} 1 & H_\mathrm{yx} & H_\mathrm{zx} & 0 \\ H_\mathrm{xy} & 1 & H_\mathrm{zy} & 0 \\ H_\mathrm{xz} & H_\mathrm{yz} & 1 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}
  • HxyH_\mathrm{xy} : XY平面でのX軸方向の係数
  • HyxH_\mathrm{yx} : XY平面でのY軸方向の係数
  • HxzH_\mathrm{xz} : XZ平面でのX軸方向の係数
  • HzxH_\mathrm{zx} : XZ平面でのZ軸方向の係数
  • HyzH_\mathrm{yz} : YZ平面でのY軸方向の係数
  • HzyH_\mathrm{zy} : YZ平面でのZ軸方向の係数

せん断の行列を HH とするとき、次の変換において

(xyzw)=H(xyzw)\begin{pmatrix}x' \\ y' \\ z' \\ w'\end{pmatrix} = H \cdot \begin{pmatrix}x \\ y \\ z \\ w\end{pmatrix}

各係数は次のようにベクトルを変形します:

x=x+yHyx+zHzxy=xHxy+y+zHzyz=xHxz+yHyz+zx' = x + y H_\mathrm{yx} + z H_\mathrm{zx} \\ y' = x H_\mathrm{xy} + y + z H_\mathrm{zy} \\ z' = x H_\mathrm{xz} + y H_\mathrm{yz} + z

この形のまま係数を指定するのは難しいでしょうから、この式をベースに目的のせん断を実現する係数を求めることになると思います。

アフィン変換の特徴

アフィン変換の特徴に関連する次の記事を書いています。