変換行列を指定して新しい頂点の位置を計算しますか?


7

4x4変換行列または単純に9つの浮動小数点(positionX、positionY、positionZ、rotationH、rotationP、rotationR、scaleX、scaleY、scaleZ)を指定して、頂点の新しい位置を取得するにはどうすればよいですか?通常、最終的なメッシュ(または「ノード」、「オブジェクト」、または「ジオメトリ」)にマトリックスを割り当てることができますが、今は手動で行う必要があります。

回答:


5

3次元ベクトルとして表される頂点に一般的な4x4変換行列を適用するには、次のことを行う必要があります。

  1. wコンポーネントとして1を追加して、ベクトルを4次元に拡張します。

    (x, y, z) => (x, y, z, 1)

  2. 上記の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. ベクトルを均質化することにより、3番目の次元に変換し直します。つまり、すべてを4番目のコンポーネントで除算しますw

    (tx, ty, tz, w) => (tx/w, ty/w, tz/w)

    問題は、変換行列が単純な平行移動/回転/スケールのみを行う場合、の値はw1になり、1で除算するのと同じになるため、4番目のコンポーネントをドロップするだけです。

    しかし、wコンポーネントの削除がすべてのケースで機能するわけではないことを覚えておくのは良いことです。たとえば、射影行列では、この3番目のステップを忘れないでください。


2
これが列として表される点を乗算する方法であることを追加しても問題はありません。行の場合、最初にベクトルを記述してから行列を記述します。また、複数の行列を乗算する場合は、次のように配置します。方程式では、ベクトルに最も近い行列が最初に適用されます。一部のライブラリは点を行として、いくつかは列として扱い、それを区別して、行列を適切に適用する必要があるためです。列から行の表現に移動するには、変換行列を転置する必要があります
dreta

1
@dreta私はそれらのポイントのいくつかについて熟考しました。追加できますが、あなたのコメントはすでにすべてのベースをカバーするのに素晴らしい仕事をしていると思うので、代わりに賛成しました:P
David Gouveia

1

行列とベクトルの乗算:

[ rxx rxy rxz px ] [ vx ]   [ vx' ]
[ ryx ryy ryz py ] [ vy ]   [ vy' ]
[ ryx ryy ryz pz ] [ vz ] = [ vz' ]
[   0   0   0  1 ] [  1 ]   [  1  ]

上のページを参照してくださいウィキペディアよりについて


それでは、各ベクトルコンポーネントに対応する行列列を乗算し、最後の行を無視しますか?
ioa 2012

いいえ、数学と同じように行列の乗算を行います。たとえば、vx'用語は次のように計算されますvx' = rxx * vx + rxy * vy + rxz * vz + px
Mihai Maruseac 2012

はい。上記の答えを受け入れてもらえれば幸いです。他の人にとってももっと有益になると思います。
ioa 2012

もちろん、もっときれいに書かれていて、それに値します:)
Mihai Maruseac
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.