甘いものが好きです

iOS App開発時に感じた疑問や課題、その他の雑感などを書いていきます。

Current Transformation Matrixとは

Quartz 2Dの関数、CGContextTransformCTM, CGContextRotateCTM, CGContextScaleCTMなどに含まれる「CTM」とは一体何なのだろうか。調べてみると、Quartz 2Dで描画する上で前提となる2つの座標系(デバイス空間/ユーザ空間)やユーザ空間の変換の話に行き着く。

2つの座標系(デバイス空間/ユーザ空間)

「Quartz 2D Programming Guide」のTransformの章にあるとおり、Quartz 2Dの描画モデルは2つ全く異なる座標系を定義している。ひとつは「デバイス空間(Device Space)」*1、もうひとつは「ユーザ空間(User Space)」*2である。

  • デバイス空間(Device Space)
    • デバイスのネイティブ解像度で表示できる座標系。
    • デバイスにより決定される。
  • ユーザ空間(User Space)
    • デバイスの解像度によらず、ユーザが任意に平行移動、回転、拡大・縮小等をして変更できる座標系。

デバイス空間とユーザ空間の関係の説明ではキャンバスの比喩がよく用いられる。絵の具と筆を使ってキャンバスに絵を描くときのことを考えてみると、キャンバスを前後左右に移動させたり、回転させたりして、絵を描きやすい状態にしてから絵を描くことができるのは想像に難くない。キャンバスに描かれたもののキャンバスに対する相対的な位置や大きさを表すのがユーザ空間であり、絶対的な位置や大きさを表すのがデバイス空間である。この比喩でキャンバスと言われているものが、グラフィックス・コンテキスト(Graphics Context)に相当する。

現在の変換行列(CTM: Current Transformation Matrix)

ユーザ空間の移動、回転、拡大縮小による変化は、数学的には線形変換の一種であるアフィン変換として表現される。ユーザ空間に加えられた移動、回転、拡大縮小による変化は変換行列(Transformation Matrix)によって表される。

Quartz accomplishes device independence with a separate coordinate system―user space―mapping it to the coordinate system of the output device―device space―using the current transformation matrix, or CTM. A matrix is a mathematical construct used to efficiently describe a set of related equations. The current transformation matrix is a particular type of matrix called an affine transform, which maps points from one coordinate space to another by applying translation, rotation, and scaling operations (calculations that move, rotate, and resize a coordinate system).

「Quartz 2D Programming Guide」内の「Quartz 2D Coordinate Systems」より

Current Transformation Matrix(CTM)とは現在の変換行列、つまり、その時点でのユーザ空間の、デフォルト状態からの変化状況を示すものである。CGContextTransformCTM, CGContextRotateCTM, CGContextScaleCTMといった関数は、それぞれCTMに平行移動、回転、拡大縮小の変更を加えるものである。

CGAffineTransformでより柔軟に変換行列を操作する

Quartz 2Dには変換行列をより柔軟に操作する方法として。CGAffineTransformという構造体と、それを操作する関数が用意されている。CGAffineTransformの利用は直接CTMに変更を加えることと比較して次のような特徴がある。

  • 現在の状態にかかわらず変換行列を作成することができる。
  • 変換行列の作成と適用のタイミングをずらすことができる。
  • 逆変換を簡単に実現することができる。
  • 2つの変換の比較を行うことができる。

CGAffineTransformの使用法は、『Beginning iPhone Games Development』の第4章で説明されているのが参考になる。

Beginning iPhone Games Development

Beginning iPhone Games Development

*1:デバイス座標系(Device Coordinate System)と同義。

*2:ユーザ座標系(User Coordinate System)と同義。