[ CG実習 >  図形の変換 ]

図形の変換

CGでは,物体をいろんな方向から見たり,一部を拡大して見たり,あるいは, アニメーションで物体を動いていくのを見たりすることができます. このとき,プログラムの内部では,たとえば,物体をいろいろな方向からみたデータを別々に用意しているわけではありません. 基準のモデルとなる図形データがあって,それを移動・変形して描画することで, さまざまに図形の表現を変えるようになっています. 図形の移動や変形は,図形に平行移動,拡大縮小,回転などの変換を施すことで実現されます. ここでは,二次元の図形に対して変換を行う方法について説明します.

もくじ

  1. 基本的な変換
  2. 同次座標と変換の行列表現
  3. アフィン変換

基本的な変換

基本的な変換としては,次の三つが挙げられます.

平行移動

平行移動は,図形をx,y方向に移動させる変換です. x方向にtx,y方向にty平行移動する場合, 図形の点(x,y)は,次のように点(x',y')に移動されます.

  x' = x + tx
  y' = y + ty

拡大縮小

拡大縮小は,図形の大きさを変える変換です. x,y方向の拡大縮小率を変えることで,変形に利用することもできます. sxとsyを それぞれx方向,y方向の拡大縮小率としたとき, 図形の点(x,y)は,次のように点(x',y')に移動されます.

  x' = sx・x 
  y' = sy・y

この変換が拡大縮小となるのは sxとsyがともに正の数の場合です. sxとsyが等しいときは, サイズの異なる相似な図形に変換することになります. またsxとsyが等しくない場合には, 横方向あるいは縦方向に押しつぶした形に変形されます. sx,あるいはsyが1より大きい場合は拡大, 1未満の正の数である場合は縮小となります. なお,sx,syが負の数である場合には, 図形を反転してから拡大縮小する変換となります.

回転

回転は,通常,図形の定義されている座標系の原点を中心として与えられます. 原点中心のθラジアン回転により,図形の点(x,y)は,次のように点(x',y')に移動されます.

  x' = x・cosθ - y・sinθ
  y' = x・sinθ + y・cosθ

同次座標と変換の行列表現

さて,平行移動,拡大縮小,回転のうち, 拡大縮小と回転は,2×2の行列を用いて表現することができます.

拡大縮小2x2拡大縮小変換行列
回転2x2回転変換行列

そこで, これらの行列の積によって,変換の組み合わせ,すなわち, 拡大縮小をしてから回転を行う, あるいは,回転を行ってから拡大縮小するなどの複合的に変換を行うことが可能になります. ところが,平行移動は2×2の行列で表すことができませんので, このままでは,平行移動も含めた複合的な変換を統一的に扱うことができません.

そこで,図形の変換を統一的に扱うために 変換する各点を同次座標で考え, 同次座標で変換を行うことにします. たとえば2次元の場合,(x,y)という点に関して, その同次座標は, (wx,wy,w)なる3次元の座標で与えられます.

  (x,y) <--> (wx,wy,w)

同次座標を一般に(ζ,η,ξ)と書くと, これが(ζ/ξ,η/ξ)に対応します. つまり同次座標では,任意のwに対して(wx,wy,w)は,全て(x,y)を表すことになります. (※w=0の場合は特別な約束をする必要がありますが,ここではそのような場合は考えないことにします). この同次座標で,変換が一般的に3×3の行列として表現できることをみてみましょう.

同次座標で,拡大縮小,回転,平行移動の変換行列は次のように与えることができます.

拡大縮小 回転 平行移動
3x3拡大縮小変換行列 3x3回転変換行列 3x3平行移動変換行列

これらがそれぞれの変換となっていることは,簡単に確かめることができます.

3x3の変換行列の検証

このような同次座標を導入することで,平行移動を含めて, 三種類の図形変換を全て3×3行列で統一的に表現して, 複合的な変換を行列の積で実現することができるようになります.

なお,実際にこのような変換を行う場合,同次座標としては, (x,y,1),つまり常にw=1で考えれば問題ありません. こうしておけば, 変換後の同次座標に対応する二次元座標を得るのもごく簡単になります.

アフィン変換

これまでにみてきた平行移動,拡大縮小,回転は,いずれも 一般にアフィン変換(affine transformation)といわれる変換の特殊な例になっています. 2次元のアフィン変換は,同次座標で,次のような行列で表現できます.

アフィン変換行列

平行移動,拡大縮小,回転の組み合せは,アフィン変換で表現できます. また,鏡像変換(図形を鏡に写す変換), 剪断変換(横ずれ変換;図形を斜めに押しつぶす変換)なども, アフィン変換の一種です.

アフィン変換は,直線を直線に写し,平行性を保存します. また2点の間の距離の比を保ちます.

[ CG実習 >  図形の変換 ]