読者です 読者をやめる 読者になる 読者になる

CGAffineTransformとCATransform3D(後編:CATransform3D)

iOS 基礎技術 数学

前回の続きです。 幾何学的変換については一次元追加しただけなので、式を眺める程度に説明します。

三次元における幾何学的変換

移動

三次元上の任意の点A(x,y,z)と、 点Aをx方向にtx、y方向にty、z方向にtzだけ移動した点A'の座標(x', y', z')の関係は

{ \displaystyle
  \left[
    \begin{array}{cc}
      x'\\
      y'\\
      z'\\
    \end{array}
  \right] = \left[
    \begin{array}{cc}
      x\\
      y\\
      z\\
    \end{array}
  \right] + \left[
    \begin{array}{ccc}
      t_{\ x}\\
      t_{\ y}\\
      t_{\ z}\\
    \end{array}
  \right]
}

となります。

拡縮

平面上の任意の点A(x,y,z)とそれをx方向にsx倍、y方向にsy倍、z方向にszだけ
拡大(縮小)した点A''の座標(x''、y'', z'')は

{ \displaystyle
  \left[
    \begin{array}{ccc}
      x''\\
      y''\\
      z''\\
    \end{array}
  \right] = \left[
    \begin{array}{cc}
      s_{\ x} \ \ \ \ 0 \ \ \ \ 0\\
      0 \ \ \ \ s_{\ y} \ \ \ \ 0\\
      0 \ \ \ \ 0 \ \ \ \ s_{\ z}\\
    \end{array}
  \right]
  \left[
    \begin{array}{cc}
      x\\
      y\\
      z\\
    \end{array}
  \right] = \left[
    \begin{array}{cc}
      s_{\ x}x\\
      s_{\ y}y\\
      s_{\ z}z\\
    \end{array}
  \right]
}

となります。

回転

平面上の任意の点A(x,y)を原点を中心としてγだけ回転させ、A'''(x''',y''')を得る、という
処理は、三次元においてはZ軸を回転軸としてxy平面をの回転処理と考えることが
できます。したがって、Z軸を回転軸としてγだけ回転させる処理は、
三次元においては次のように表記することができます。

{ \displaystyle
  \left[
    \begin{array}{ccc}
      x'''\\
      y'''\\
      z\\\
    \end{array}
  \right] = \left[
    \begin{array}{ccc}
      cosγ \ \ \ \ \ \ -sinγ \ \ \ \ \ \ 0\\
      cosγ \ \ \ \ \ \ \ \ \ sinγ \ \ \ \ \ \ \ 0\\
      0 \ \ \ \ \ \ \ \ \ \ \ 0 \ \ \ \ \ \ \ \ \ \ \ 1
    \end{array}
  \right]
   \left[
    \begin{array}{ccc}
      x\\
      y\\
      z\\
    \end{array}
  \right]
}

したがって、点A(x,y,z)をX軸を回転軸としてα、Y軸を回転軸としてβ、Z軸を回転軸としてγだけ 回転して点Ab(xb, yb, zb)を得る処理は以下のように書くことができます。

{ \displaystyle
  \left[
    \begin{array}{ccc}
      x^{\ b}\\
      y^{\ b}\\
      z^{\ b}\\
    \end{array}
  \right] = \\
 \left[
    \begin{array}{ccc}
      cosγ \ \ \ sinγ \ \ \ 0\\
      -sinγ \ \ cosγ \ \ \  0\\
      0 \ \ \ \ \ \ \ \ \ 0 \ \ \ \ \ \ \ 1\\
    \end{array}
  \right]
    \left[
    \begin{array}{ccc}
      cosβ \ \ \ 0 \ \ -sinβ\\
      0 \ \ \ \ \ \ \ 1 \ \ \ \ \ \ \ 0\\
      sinβ \ \ \ 0 \ \ \ cosβ\\
    \end{array}
  \right]
    \left[
    \begin{array}{ccc}
      1 \ \ \ \ \ \ \ 0 \ \ \ \ \ \ \ 0\\
      0 \ \ \ \ cosα \ \ \ \ sinα\\
      0 \ \ -sinα \ \ \ cosα\\
    \end{array}
  \right]
    \left[
    \begin{array}{ccc}
      x\\
      y\\
      z\\
    \end{array}
  \right]
}

三次元におけるアフィン変換

以上より、三次元における平面図形の平行移動、拡縮、回転を行う変換は、 次の数式で定義することができます。

{ \displaystyle
  \left[
    \begin{array}{ccc}
      x'\\
      y'\\
      z'\\
    \end{array}
  \right] = \left[
    \begin{array}{cc}
      a \ \ \ \ b \ \ \ \ c\\
      d \ \ \ \ e \ \ \ \ f\\
      g \ \ \ \ h \ \ \ \ i\\
    \end{array}
  \right]
  \left[
    \begin{array}{cc}
      x\\
      y\\
      z\\
    \end{array}
  \right] + \left[
    \begin{array}{cc}
      t_{\ x}\\
      t_{\ y}\\
      t_{\ z}\\
    \end{array}
  \right ]
}

二次元から三次元へ拡張した際と同様に拡張すると、上記の式を以下のような式に
まとめることができます。

{ \displaystyle
  \left[
    \begin{array}{cccc}
      x'\\
      y'\\
      z'\\
      1 \\
    \end{array}
  \right] = \left[
    \begin{array}{ccc}
      a \ \ \ \ b \ \ \ \ c \ \ \ \ t_{\ x}\\
      d \ \ \ \ e \ \ \ \ f \ \ \ \ t_{\ y}\\
      g \ \ \ \ h \ \ \ \ i \ \ \ \ t_{\ z}\\
      0 \ \ \ \ 0 \ \ \ \ 0 \ \ \ \ 1\\
    \end{array}
  \right]
  \left[
    \begin{array}{ccc}
      x\\
      y\\
      z\\
      1\\
    \end{array}
  \right]
}

CATransform3Dの構造は以下の等式の左辺を意味しており、 回転をより立体的に見せるためのm34の値の変更は、 平面をz方向へ移動させると意味を持っていると説明することができます。

{ \displaystyle
\left[
    \begin{array}{ccc}
      m_{11} \ \ \ \ m_{12} \ \ \ \ m_{13} \ \ \ \ m_{14}\\
      m_{21} \ \ \ \ m_{22} \ \ \ \ m_{23} \ \ \ \ m_{24}\\
      m_{31} \ \ \ \ m_{32} \ \ \ \ m_{33} \ \ \ \ m_{34}\\
      m_{41} \ \ \ \ m_{42} \ \ \ \ m_{43} \ \ \ \ m_{44}\\
    \end{array}
  \right] = \left[
    \begin{array}{ccc}
      a \ \ \ \ b \ \ \ \ c \ \ \ \ t_{\ x}\\
      d \ \ \ \ e \ \ \ \ f \ \ \ \ t_{\ y}\\
      g \ \ \ \ h \ \ \ \ i \ \ \ \ t_{\ z}\\
      0 \ \ \ \ 0 \ \ \ \ 0 \ \ \ \ 1\\
    \end{array}
  \right]
}

よくサンプルコードとして紹介されているm34の値の変更にはこういう意味があると
わかれば、納得しながら安全な実装ができるかと思います( ・`ω・´)
何かあれば指摘をお願いしますm( )m
ちなみにTeXが崩れて見えるのは、hatenaがmarkdownでTeX記法に対応していないためですw