モデルビュー行列の転置された逆行列が法線ベクトルの変換に使用されるのはなぜですか?


22

オブジェクトに変換が適用された3Dシーンをレンダリングする場合、法線はモデルビュー行列の転置された逆行列で変換される必要があります。したがって、法線、modelViewMatrix場合、変換された法線はnn Mn

n=(M1)Tn

オブジェクトを変換するとき、それに応じて法線を変換する必要があることは明らかです。しかし、数学的に、これが対応する変換行列なのはなぜですか?


モデル行列が平行移動、回転、スケールで構成されている場合、通常の行列を計算するために逆転置を行う必要はありません。法線を2乗スケールで除算し、モデル行列で乗算するだけで完了です。それを垂直軸を持つ任意のマトリックスに拡張し、代わりに使用しているマトリックスの各軸の二乗スケールを計算するだけです。詳細をブログに書きました:lxjk.github.io/2017/10/01/Stop-Using-Normal-Matrix.html
Eric

回答:


22

これは、逆転置が必要であるという簡単な証明です。平面方程式で定義される平面がとします。ここで、は法線です。次に、この平面を行列変換します。言い換えれば、前の平面方程式を満たすまったく同じ値に対して満たされる新しい平面方程式を見つけたいということです。N M N 'M X + D ' = 0 、Xnx+d=0nMnMx+d=0x

これを行うには、2つの平面方程式を等しく設定すれば十分です。(これは平面方程式を任意に再スケーリングする機能を放棄しますが、それは引数にとって重要ではありません。)それからを設定し、それを減算することができます。残っているのは:d=d

nMx=nx

これを、マトリックス表記(ベクトルを1列のマトリックスとして考える)で表現されたドット積で書き直します。

nTMx=nTx

すべての についてこれを満たすために、次のものが必要です。x

nTM=nT

今を解くの面で、 nnn

nT=nTM1n=(nTM1)Tn=(M1)Tn

プレスト!点が行列によって変換される場合、平面法線は、平面方程式を保存するために、の逆転置によって変換する必要があります。M MxMM

これは基本的にドット積のプロパティです。変換が適用されたときにドット積が不変のままであるためには、ドットが付けられた2つのベクトルは、対応するが異なる方法で変換する必要があります。

数学的には、これは法線ベクトルが普通のベクトルではなく、コベクトル(共変ベクトル、デュアルベクトル、または線形形式)と呼ばれるものであると言うことで説明できます。コベクトルは基本的に「ベクトルで点を付けて不変スカラーを生成できるもの」として定義されます。それを達成するためには、通常のベクトルで動作している行列の逆転置を使用して変換する必要があります。これは、任意の数の次元に当てはまります。

特に3Dでは、バイベクトルはコベクトルに似ていることに注意してください。それらは異なる単位を持っているため、まったく同じではありません:コベクトルは逆長の単位を持ち、バイベクトルは長さの2乗(面積)の単位を持っているため、スケーリングの下で​​異なる動作をします。ただし、方向に関しては同じように変換されます。これは法線にとって重要なことです。通常、法線の大きさは気にしません(とにかく単位長に常に正規化します)。したがって、通常、バイベクトルとコベクトルの違いを心配する必要はありません。


2
素晴らしい説明。ただし、2ポイントで少し高速ですが、もう少し詳細が大好きです。1。ドット積からマトリックス積にどのようにジャンプしますか?2.最後に引用されたセクションの2行目と3行目の間、何が起こるか(nは左から右に少し魔法のように移動されます)
-v.oddou

4
1. aとbが同じ次元の列行列である場合、(a ^ T)bはdot(a、b)と同じです。あなた自身のために数学を試してみてください!2.(AB)^ T =(B ^ T)(A ^ T)、および(A ^ T)^ T = AマトリックスIDの詳細については、マトリックスクックブック
-Mokosha

3
@ v.oddouうん、モコシャは正しい。ドット積は、1×n行列(行ベクトル)と×1行列(列ベクトル)の乗算として表現できます。結果は、1つの成分が内積である1×1マトリックスです。列ベクトルの転置は行ベクトルなので、a・bをa ^ T bと書くことができます。2番目の質問では、行列の積を転置することは、個々の因子を転置してその順序を逆にすることと同等です。
ネイサンリード

完璧で、今ではすべてが問題なく明確です。両方に感謝します。
v.oddou

@NathanReed(これは飛行機でほとんどのものをモデル化した初期のPowerVR時代に戻ります)また、最適化のために、回転のみを含む(つまり、直交する)行列Mrがある場合、Inverse(Mr)= Transpose(Mr)、Trans(Inverse(Mr)= _ Mr_)に言及する価値があるかもしれません。あなたはまた、翻訳部にショートカットを取ることができ、あなたが知っていればスケーリングが均一であるFWIW SGLのPowerVRグラフィックスライブラリでは、我々は変換行列は、通常の変換とコストを節約するために、これらの性質を持っていたかどうかを追跡するブール値を維持するために使用。。
サイモンF

6

これは、法線が実際にはベクトルではないためです!それらはクロス積によって作成され、結果としてベクトルではなく、バイベクトルになります。代数はこれらの座標に対して大きく異なり、幾何学的変換は動作が異なる1つの操作にすぎません。

これについてさらに学ぶための素晴らしいリソースは、Eric LengyelのGrassman Algebraに関するプレゼンテーションです。


法線は、いわゆる擬似ベクトルでもあります。一般化と経験則として、外積(平面など)から生じるすべてのものは、同様の方法で変換されます。
マティアス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.