全般的な背景情報 2
平行移動
オブジェクトの平行移動とは、3D空間内のある位置から3D空間内の別の位置へオブジェクトを移動することです(その方法については、後述します)。オブジェクトの平行移動は、オブジェクトを定義するすべての点を平行移動することによって行われます。点を平行移動するには、点を定義するx、y、zの各座標値にオフセットを追加します。
たとえば、元の点の座標がx1、y1、z1で、オフセットがtx、ty、tzの場合、点の新しい位置の座標は、次で表されます。
x2 = x1 + tx y2 = y1 + ty z2 = z1 + tz
拡大縮小
オブジェクトの拡大縮小とは、オブジェクトを表すすべての点の位置を、非常に限定的な方法で変更することです。必ずというわけではありませんが、拡大縮小変換は一般にオブジェクトのサイズを変更するものであり、オブジェクトが大きくなったり、小さくなったりします(1または-1という係数による拡大縮小では、サイズが変わらないことに注意してください)。拡大縮小変換を行うには、オブジェクトを定義するすべての点のx、y、zの各座標値に、同じスケール係数または異なるスケール係数を乗算します。
座標値を乗算するのに使用するスケール係数が同一の場合、オブジェクトは単純に大きくなるか、または小さくなります(スケール係数が負の場合は、軸に対して反転します)。各軸に適用されるスケール係数が異なる場合、オブジェクトはいずれかの次元で押しつぶされたようになったり、場合によっては軸に対して反転する場合もありますが、多くの場合、同じオブジェクトを表現したものであると認識できます。
拡大縮小変換で使用されるスケール係数は、原点が基準です。たとえば、スケール係数が2.0の場合、新しい点の座標値は、元の点から原点までの距離の2倍になります。
元の点の座標がx1、y1、z1で、スケール係数がsx、sy、szの場合、点の新しい位置の座標は、次で表されます。
x2 = x1 * sx y2 = y1 * sy z2 = z1 * sx
回転
回転は、平行移動や拡大縮小ほど直感的ではなく、理解するにはある程度の三角法の知識が必要です。しかし、その仕組みを理解していなくても、決められた手順で回転変換を作成し、使用することは可能です。
次の方程式は、2D空間の原点を中心とする点の回転を表しており、「Planar transformations」(稿末の「参考資料」を参照)に記載されています。vは、回転の角度を表します。
x2 = x1 * cos(v) - y1 * sin(v) y2 = x1 * sin(v) + y1 * cos(v)
この方程式は、「Spatial transformations」(稿末の「参考資料」を参照)で、3Dに拡張されます。3Dでは、物事が非常に複雑になります。2Dの場合は、xy平面でのみ回転が可能です。つまり、原点を中心に回転できます。しかし、3Dにおける回転は、xy、yz、zxのいずれかの平面に限定されません。いずれかの軸、または3つのすべての軸を中心に回転させることすら可能です。そのため、3組の回転方程式が存在します。この3組の方程式については、変換の行列方程式と合わせて後で示します。
正の回転角
この式を導いた執筆者によると、軸を中心に反時計回りを正の回転角としています。これは、軸の正方向の端に位置して原点を見た場合、その軸を中心とする正の回転角が反時計回りであることを意味します。
行列
以前のレッスン「Understanding Transforms in Java 2D」では(稿末の「参考資料」を参照)、行列を使用してJava 2Dの変換を実行する方法について説明しました。「同次座標」についても説明しました。
記事「Planar transformations」(稿末の「参考資料」を参照)には、図5に示す行列方程式が記載されています。この行列方程式を解くことで、2Dの平行移動、拡大縮小、回転の各変換を実現できます。

