回答:
3次元ベクトルとして表される頂点に一般的な4x4変換行列を適用するには、次のことを行う必要があります。
wコンポーネントとして1を追加して、ベクトルを4次元に拡張します。
(x, y, z) => (x, y, z, 1)
上記の4次元ベクトルを変換行列に乗算します。結果は、別の4次元ベクトルになります。
( 4x4 matrix ) * (x, y, z, 1) => (tx, ty, tz, w)
4x4マトリックスに4x1ベクトルを乗算するための一般的な式は次のとおりです(私が失敗しなかった場合):
[ m11 m12 m13 m14 ][ x ] [ m11 * x + m12 * y + m13 * z + m14 * w ]
[ m21 m22 m23 m24 ][ y ] [ m21 * x + m22 * y + m23 * z + m24 * w ]
[ m31 m32 m33 m34 ][ z ] = [ m31 * x + m32 * y + m33 * z + m34 * w ]
[ m41 m42 m43 m44 ][ w ] [ m41 * x + m42 * y + m43 * z + m44 * w ]
または、変換マトリックスの通常の構成を検討する場合:
[ m11 m12 m13 px ][ x ] [ m11 * x + m12 * y + m13 * z + px ]
[ m21 m22 m23 py ][ y ] [ m21 * x + m22 * y + m23 * z + py ]
[ m31 m32 m33 pz ][ z ] = [ m31 * x + m32 * y + m33 * z + pz ]
[ 0 0 0 1 ][ 1 ] [ 1 ]
ベクトルを均質化することにより、3番目の次元に変換し直します。つまり、すべてを4番目のコンポーネントで除算しますw
。
(tx, ty, tz, w) => (tx/w, ty/w, tz/w)
問題は、変換行列が単純な平行移動/回転/スケールのみを行う場合、の値はw
1になり、1で除算するのと同じになるため、4番目のコンポーネントをドロップするだけです。
しかし、wコンポーネントの削除がすべてのケースで機能するわけではないことを覚えておくのは良いことです。たとえば、射影行列では、この3番目のステップを忘れないでください。
行列とベクトルの乗算:
[ rxx rxy rxz px ] [ vx ] [ vx' ]
[ ryx ryy ryz py ] [ vy ] [ vy' ]
[ ryx ryy ryz pz ] [ vz ] = [ vz' ]
[ 0 0 0 1 ] [ 1 ] [ 1 ]
上のページを参照してくださいウィキペディアよりについて
vx'
用語は次のように計算されますvx' = rxx * vx + rxy * vy + rxz * vz + px