変換の合成と順序

CG画像処理

平行移動、拡大・縮小、回転 は、同次座標を使った一つの行列の掛け算として表すことができます。
このように変換が同じ形の式に揃うと、複数の変換を続けて行う操作も、対応する行列を順に掛け合わせるだけで表せるようになります。

ここでは、こうした変換の組み合わせ方と、その順序によって結果がどう変わるのかを見ていきます。

変換の合成
CG画像処理

図形に対して、ある変換を行い、続けて別の変換を行う、というように複数の変換を順番に適用したい場面はよくあります。このように複数の変換を続けて適用することを合成変換といいます。

たとえば、点にまず変換を適用し、その結果にさらに変換を適用する合成変換を考えてみます。
このとき、1つめの変換後の点はであり、これにさらにを掛けることで、最終的な点が得られます。

ここで、行列の掛け算には結合法則が成り立ちます。つまり、掛ける順序を保ったまま、どこから先に計算してもよいので、上の式は次のように書き換えられます。

右辺のは、2つの変換行列をあらかじめ掛け合わせて作った、1つの新しい行列です。
この行列を点に掛けるだけで、を続けて適用した場合と同じ結果が得られます。

にある行列ほど、後から適用される変換にあたります。では、点にいちばん近いが先に効き、その外側のが後に効きます。適用したい順に左から並べるのではなく、後から適用する変換を左に書く、という向きに注意してください。

合成変換行列
CG画像処理

このように、複数の変換行列を掛け合わせて作った1つの行列を合成変換行列といいます。
それぞれの変換行列がすべて同じ大きさの正方行列なので、それらの積もまた同じ大きさの行列になり、1回の変換として扱えます。

合成変換行列を使う利点は、複数の変換を1つの操作にまとめられることです。
たとえば、平行移動の行列T、回転の行列R、拡大縮小の行列Sを続けて適用したいとき、あらかじめ次の積を計算しておけば、点に対する変換はという1回の掛け算で済みます。

この利点は、特に図形が多数の点から構成されているときに効果を発揮します。
図形を構成する点の数は、複雑なモデルでは数万から数百万にのぼります。それらの点11つに対してを順に掛けるよりも、先に合成変換行列を事前に計算しておき、各点には1回掛けるほうが、計算の手間を大きく減らせます。

合成の順序と非可換性
CG画像処理

合成変換行列を作るときに、決して見落としてはならないことがあります。
それは、変換を適用する順序を変えると、結果も変わってしまうということです。

ふだん使う数の掛け算では、3 × 55 × 3が等しいように、掛ける順序を入れ替えても答えは変わりません。

ところが行列の掛け算では、一般に順序を入れ替えると結果が変わります。つまり、2つの行列について、は必ずしも等しくありません。
このような、掛ける順序によって結果である積が変わる性質を非可換性といいます。

合成変換行列は変換行列の積なので、この性質をそのまま受け継ぎます。
そのため、同じ変換を組み合わせても、どちらを先に適用するかによって、図形の最終的な位置や向きが変わってしまうのです。

例:平行移動と回転の順序

このことを、x方向への平行移動と、原点まわりの回転を例に確かめてみます。移動量をx方向にとし、回転角をとすると、それぞれの変換行列は次のとおりです。

「先にx方向へ平行移動し、その後で原点まわりに回転する」場合、合成変換行列はです。実際に積を計算すると、次のようになります。

による変換では、図形はまずx方向へ平行移動して原点から離れ、その離れた位置のまま原点を中心に回されます。
原点から距離だけ離れた点を回すので、これは時計の針のような回転の動きになり、図形は原点を中心とした半径の大きな円弧を描くように回されます。最初にx軸上のへ置かれた図形は、回転後にはx軸から大きく離れた場所まで移ります。

一方、「先に原点まわりに回転し、その後でx方向へ平行移動する」場合、合成変換行列はです。同じ2つの行列を逆の順序で掛けると、結果は次のようになります。

による変換では、図形はまだ原点にいるうちに回転するので、その場で向きだけを変え、位置は原点から動きません。向きを変え終えてからx方向へ平行移動するため、回転後の図形がまっすぐ横へだけ滑り、x軸上のに接している状態は維持されます。

2つの合成変換行列を見比べると、左上の回転を表す部分は同じですが、平行移動を表す右端の列が違っています。では移動量がと回転の影響を受けているのに対し、ではのまま元の移動量が残ります。
このように、同じを使ってもは一致せず、図形の行き着く先はまったく異なります。

合成変換を扱うときは、適用したい順序と、行列を並べる順序を常に意識する必要があります。

原点以外を中心とした変換
CG画像処理

基本的な変換 で見た拡大・縮小や回転は、いずれも原点を中心とする変換でした。
しかし実際には、図形上の好きな点を中心に回したり、拡大縮小したりしたい場面が多くあります。この「原点以外の点を中心とした変換」も、変換の合成を使えば実現できます。

この場合、中心にしたい点を一旦原点へ平行移動して持ってくれば、あとは原点を中心とする変換をそのまま適用できます。変換を終えたら、最初に動かした分だけ平行移動して元の位置へ戻します。
つまり、次の3つの変換を順に組み合わせます。

  1. 中心にしたい点が原点に重なるように、図形全体を平行移動する(行列
  2. 原点を中心とする回転や拡大縮小を行う(行列
  3. 最初の平行移動を打ち消すように、逆向きに平行移動して元の位置へ戻す(行列

これらをまとめた合成変換行列は、後から適用する変換をに書く規則に従って、次のようになります。

逆行列で、による平行移動をちょうど打ち消す変換です。
中心にしたい点をとすると、はこの点を原点へ運ぶ平行移動なので、移動量はになります。逆には、それを元へ戻す移動量による平行移動です。

(2, 3)を中心に、図形を原点まわりの90度回転と同じように90度回転させることを考えます。

まず、中心の点(2, 3)が原点に重なるように、図形全体をx方向へ-2y方向へ-3だけ平行移動します。

次に、原点を中心に90度回転させます。90度ではcosθ0sinθ1になります。

最後に、最初の平行移動を打ち消すように、x方向へ2y方向へ3だけ戻します。

これらをの順に掛け合わせた合成変換行列を作れば、点(2, 3)を中心とする90度回転が1つの行列で表せます。

原点以外を中心とする拡大・縮小も、同様の手順で表すことができます。中心を原点へ運び、原点を中心とする拡大・縮小を行い、元の位置へ戻す、という3段階の合成です。

このように、原点まわりという制約のある基本変換も、平行移動と組み合わせることで、空間内の任意の点を中心とした変換へと拡張できます。