行列で位置、回転、サイズを変換する
ゲームオブジェクトの変換を行列で表現する
本ブログ作成文は、講義を目指して製作されました。 また、作成された文章の情報も間違っている可能性がありますので、ご注意ください。
ゲームオブジェクトの位置、回転、サイズは行列で表すことができる。 2Dで原点を基準にした変換から確認してみよう。
サイズ変換
[ sx 0 ] [ x ] = [ sx * x ]
[ 0 sy ] [ y ] [ sy * y ]
X軸はsx、Y軸はsyほど増える。 どちらかが負の場合は、その軸に基づいて反転します。
回転変換
[ cosθ -sinθ ] [ x ]
[ sinθ cosθ ] [ y ]
この行列は、原点を中心にベクトルをθだけ回転させる。 Degreeを受け取る関数とRadianを受け取る関数を混ぜないように注意しなければならない。
移動はなぜ3×3であるか。
2×2行列だけでは原点を他の位置に移動できない。 だから2D座標にw = 1を追加した同軸座標を使用する。
[ 1 0 tx ] [ x ] [ x + tx ]
[ 0 1 ty ] [ y ] = [ y + ty ]
[ 0 0 1 ] [ 1 ] [ 1 ]
3Dでは、同じ理由で4×4行列を使用します。
順序が結果を変える
オブジェクトを2倍にして右に10移動することと、最初に移動してから全体の座標を2倍にすることは結果が異なります。
Scale → Translate
位置は10移動
Translate → Scale
移動量まで2倍になることがある
エンジンと数学ライブラリごとにベクトルを行にするか列に置くかが異なるため、コードの乗算順序を文書で確認する必要があります。 行列自体よりもどの座標系でどの順序で適用するかがより重要です。