変換行列の乗算順序


21

最終的な変換行列の正しい乗算順序を把握しようとすると、問題が発生します。私はいつも奇妙な動きか歪んだ幾何学のどちらかを得る。私の現在のモデルは次のとおりです。

単一ノードの場合、乗算順序は次のとおりです。

L = S * R * T

どこで

L =ローカル変換行列

S =ローカルスケールマトリックス

R =ローカル回転行列

T =ローカル変換行列

ノードのワールド変換の場合:

W = PW * L

どこで

W =ワールド変換行列

PW =親世界の変換マトリックス

L =上記で計算されたローカル変換行列

レンダリングするとき、ノードごとにマトリックスを計算します:

MV = Inv(C)* NW

どこで

MV =特定のノードのモデルビュー変換行列

Inv(C)=逆カメラ変換行列

NW =上記で計算されたノードのワールド変換マトリックス。

最後に、シェーダーには休耕変換があります:

TVP = PRP * MV * VP

どこで

TVP =最終的な変換された頂点の位置

PRP =パースペクティブマトリックス

MV =上記で計算されたノードのワールド変換マトリックス

VP =未変換の頂点位置。

現在のモデルでは、ローカル回転を持つ子ノードは、カメラを変換するときに奇妙に回転します。乗算順序のどこが間違っていましたか?

回答:


37

順序の任意の組み合わせS*R*Tにより、有効な変換行列が得られます。ただし、最初にオブジェクトを拡大縮小してから回転させてから翻訳するのは非常に一般的です:

L = T * R * S

この順序で行わないと、不均一なスケーリングが前の回転の影響を受け、オブジェクトが歪んで見えるようになります。そして、回転は平行移動の影響を受け、オブジェクトの最終的な位置は、平行移動の値が期待するものとは非常に異なります。


これについてもう少し説明できますか?私が慣れていることから、回転は位置に関係なく2つのフレーム間の向きの違いであるため、回転は平行移動の影響を受けません。代わりに、新しく定義された回転軸で平行移動するため、平行移動はその前に発生する回転の影響を受ける可能性があります。L = TRSでは、変換が最初に行われるため、回転によって作成された新しいベクトルの影響を受けません。
ユーザー-2147482637

4
混乱は、ローカル変換(フレームがオブジェクトにリンクされたままである)について話しているのに対して、ここで説明する変換はワールド空間(1つの固定参照フレーム、つまりワールドのみ)で発生します。概念的には、物事の見方は有効であり、逆の順序で変換を適用するのと同じです。
サムホセバー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.