変換の合成と順序
平行移動、拡大・縮小、回転 は、同次座標を使った一つの行列のかけ算として表すことができます。
このように変換が同じ形の式に揃うと、複数の変換を続けて行う操作も、対応する行列を順にかけ合わせるだけで表せるようになります。
ここでは、こうした変換の組み合わせ方と、その順序によって結果がどう変わるのかを見ていきます。
変換の合成
図形に対して、ある変換を行い、続けて別の変換を行う、というように複数の変換を順番に適用したい場面はよくあります。このように複数の変換を続けて適用することを合成変換といいます。
たとえば、点 にまず変換 を適用し、その結果にさらに変換 を適用する合成変換を考えてみます。
このとき、1つめの変換後の点は であり、これにさらに をかけることで、最終的な点が得られます。
ここで、行列のかけ算には結合法則が成り立ちます。つまり、かける順序を保ったまま、どこから先に計算してもよいので、上の式は次のように書き換えられます。
右辺の は、2つの変換行列をあらかじめかけ合わせて作った、1つの新しい行列です。
この行列を点 にかけるだけで、 と を続けて適用した場合と同じ結果が得られます。
点 の左にある行列ほど、後から適用される変換にあたります。 では、点に一番近い が先に効き、その外側の が後に効きます。適用したい順に左から並べるのではなく、後から適用する変換を左に書く、という向きに注意してください。
合成変換行列
このように、複数の変換行列をかけ合わせて作った1つの行列を合成変換行列といいます。
それぞれの変換行列がすべて同じ大きさの正方行列なので、それらの積もまた同じ大きさの行列になり、1回の変換として扱えます。
合成変換行列を使う利点は、複数の変換を1つの操作にまとめられることです。
たとえば、平行移動の行列 、回転の行列 、拡大縮小の行列 を続けて適用したいとき、あらかじめ次の積を計算しておけば、点 に対する変換は という1回のかけ算で済みます。
この利点は、特に図形が多数の点から構成されているときに効果を発揮します。
図形を構成する点の数は、複雑なモデルでは数万から数百万にのぼります。それらの点1つ1つに対して を順にかけるよりも、先に合成変換行列 を事前に計算しておき、各点には を1回かける方が、計算の手間を大きく減らせます。
合成の順序と非可換性
合成変換行列を作るときに、決して見落としてはならないことがあります。
それは、変換を適用する順序を変えると、結果も変わってしまうということです。
ふだん使う数のかけ算では、3 × 5と5 × 3が等しいように、かける順序を入れ替えても答えは変わりません。
ところが行列のかけ算では、一般に順序を入れ替えると結果が変わります。つまり、2つの行列 、 について、 と は必ずしも等しくありません。
このような、かける順序によって結果である積が変わる性質を非可換性といいます。
合成変換行列は変換行列の積なので、この性質をそのまま受け継ぎます。
そのため、同じ変換を組み合わせても、どちらを先に適用するかによって、図形の最終的な位置や向きが変わってしまうのです。
例:平行移動と回転の順序
このことを、 方向への平行移動 と、原点まわりの回転 を例に確かめてみます。移動量を 方向に とし、回転角を とすると、それぞれの変換行列は次の通りです。
「先に 方向へ平行移動し、その後で原点まわりに回転する」場合、合成変換行列は です。実際に積を計算すると、次のようになります。
による変換では、図形はまず 方向へ平行移動して原点から離れ、その離れた位置のまま原点を中心に回されます。
原点から距離 だけ離れた点を回すので、これは時計の針のような回転の動きになり、図形は原点を中心とした半径 の大きな円弧を描くように回されます。最初に 軸上の へ置かれた図形は、回転後には 軸から大きく離れた場所まで移ります。
一方、「先に原点まわりに回転し、その後で 方向へ平行移動する」場合、合成変換行列は です。同じ2つの行列を逆の順序でかけると、結果は次のようになります。
による変換では、図形はまだ原点にいるうちに回転するので、その場で向きだけを変え、位置は原点から動きません。向きを変え終えてから 方向へ平行移動するため、回転後の図形がまっすぐ横へ だけ滑り、 軸上の に接している状態は維持されます。
2つの合成変換行列を見比べると、左上の回転を表す部分は同じですが、平行移動を表す右端の列が違っています。 では移動量が と回転の影響を受けているのに対し、 では のまま元の移動量が残ります。
このように、同じ と を使っても と は一致せず、図形の行き着く先はまったく異なります。
合成変換を扱うときは、適用したい順序と、行列を並べる順序を常に意識する必要があります。
原点以外を中心とした変換
基本的な変換 で見た拡大・縮小や回転は、いずれも原点を中心とする変換でした。
しかし実際には、図形上の好きな点を中心に回したり、拡大縮小したりしたい場面が多くあります。この「原点以外の点を中心とした変換」も、変換の合成を使えば実現できます。
この場合、中心にしたい点を一旦原点へ平行移動して持ってくれば、あとは原点を中心とする変換をそのまま適用できます。変換を終えたら、最初に動かした分だけ平行移動して元の位置へ戻します。
つまり、次の3つの変換を順に組み合わせます。
- 中心にしたい点が原点に重なるように、図形全体を平行移動する(行列 )
- 原点を中心とする回転や拡大縮小を行う(行列 )
- 最初の平行移動を打ち消すように、逆向きに平行移動して元の位置へ戻す(行列 )
これらをまとめた合成変換行列は、後から適用する変換を左に書く規則に従って、次のようになります。
は の逆行列で、 による平行移動をちょうど打ち消す変換です。
中心にしたい点を とすると、 はこの点を原点へ運ぶ平行移動なので、移動量は になります。逆に は、それを元へ戻す移動量 による平行移動です。
点(2, 3)を中心に、図形を原点まわりの90度回転と同じように90度回転させることを考えます。
まず、中心の点(2, 3)が原点に重なるように、図形全体を 方向へ-2、 方向へ-3だけ平行移動します。
次に、原点を中心に90度回転させます。90度ではcosθが0、sinθが1になります。
最後に、最初の平行移動を打ち消すように、 方向へ2、 方向へ3だけ戻します。
これらを の順にかけ合わせた合成変換行列を作れば、点(2, 3)を中心とする90度回転が1つの行列で表せます。
原点以外を中心とする拡大・縮小も、同様の手順で表すことができます。中心を原点へ運び、原点を中心とする拡大・縮小を行い、元の位置へ戻す、という3段階の合成です。
このように、原点まわりという制約のある基本変換も、平行移動と組み合わせることで、空間内の任意の点を中心とした変換へと拡張できます。