6

OpenGL Red Book の付録 F によると、通常の 3D 変換行列 M を使用して、法線ベクトルの作用を次のように計算できます。

normalTransformed = transpose(inverse(M)) * normal

ただし、変換された法線に関連付けられた直交平面は実際には変換されたサーフェスに平行ですが、変換された法線ベクトル自体が予想とは反対の方向を指している可能性があります。表面から。

normalTransformed を正しい方向 (つまり、それが取り付けられているサーフェスが変換されていないときに指している方向と同じ方向) に向けたい場合、数学的にどのようにすればよいでしょうか?

サーフェス法線が (0,0,1) で、変換が Z 方向に 10 だけ平行移動したとします。変換行列 M は次のようになります。

1 0 0 0
0 1 0 0
0 1 10
0 0 0 1

次に、転置(逆(M))は次のとおりです。

1 0 0 0
0 1 0 0
0 0 1 0
0 0 -10 1

サーフェス法線 (0,0,1)、つまり同次座標の (0,0,1,1) に適用すると、次のようになります。

normalTransformed = (0, 0, 1, -9)

同次座標から戻る:

(0, 0, -1/9)

長さ 1 に正規化:

(0, 0, -1)

元の法線ベクトル (0, 0, 1) とは反対の方向を指します。

4

4 に答える 4

19

サーフェス法線 (0,0,1)、つまり同次座標の (0,0,1,1) に適用

わかりました、そこでやめてください。

面法線を同次座標として見る場合は、W コンポーネントとして 1 ではなく0を使用します。おそらく、0 で除算できないことにすぐに気付くでしょうが、それが理由でもあります。法線で同種の計算をしないでください。

法線は位置ではありません。それは方向です。方向には位置がないため、翻訳しても意味がありません。W=0 の均一な位置は、無限に離れた「位置」を表します (これが、それらを分割できない理由です)。無限に離れた位置は、すべての有限点から無限に離れています。

したがって、無限遠の位置は方向です。つまり、どの (有限の) 位置から見ても方向は変わりません。

ここで、4x4 行列があり、それによって法線を変換する必要がある場合は、数学がうまくいくため、W=0 のみを使用します。マトリックスの平行移動コンポーネントを取り除きます。変換後の W コンポーネントは完全に無視する必要があります。

したがって、変換後、次のようになります。

normalTransformed = (0, 0, 1, -9)

W コンポーネントを無視すると、次のようになります。

normalTransformed = (0, 0, 1)


そもそも、法線が実際には正しい方向を向いていない可能性がはるかに高くなります。もちろん、コードとデータがない場合は、これ以上のことは言えませんが、入力が正当であると仮定すると、数学は機能します。

また、シェーダーで反転/転置を行わないでください。CPU で実行し、結果のマトリックスをシェーダーに渡します。

于 2012-05-15T09:23:32.527 に答える
2

w問題は、法線がポイントであるかのように、座標で割っていることです。( の場合w<0、この除算は法線を反転させるものです。) 代わりに、-座標を完全に無視する必要があります。w座標で除算するのではなく、完全に削除します。

法線はポイントではなく、技術的にはコベクトルです (そのため、ポイントやベクトルとは異なる方法で変換されます)。実際には -coordinate はありません。これwを追加する唯一の理由は、既存の 4x4 マトリックス ルーチンを使用する際の便宜のためです。

任意の座標を追加するwと、指定された法線を持つ平面の同次座標が得られます。法線と同様に、そのような平面は、点の変換に使用される行列の逆転置によって変換されます (また、平面を座標で割ってもw意味がないことに注意してください。平面も点ではありません! )。

法線が三角形から派生した場合、三角形の平面にはその法線が含まれている必要がありますが、法線には、wそれがどの平面であるかを正確に決定する座標が明示的にありません。w法線に任意のものを追加することは (それが01、またはその他のものであるかどうかに関係なく)、その法線で任意の平面を選択することを意味するため、それを変換すると、変換された法線を持つ任意の平面が生成されます。wこれが、4x4 マトリックスで変換した後を無視する必要がある理由です。

于 2012-05-15T23:17:59.197 に答える
1

ニコル・ボーラが彼の答えに書いたことは絶対に正しいです、確かに私はそれらの概念を繰り返しません。

しかし、私は質問の中で興味深いことがあるいくつかの点に気づきました。

まず、正規行列は通常、モデルビュー行列の左上の3x3行列の逆行列の転置として定義されます。これは、法線が均一な位置を使用して定義されていないためです。実際、4x4の行列は必要ありません。モデルビューマトリックス全体を使用する場合は、 Nicol Bolasの指示に従いますが、計算は同じです。( wがゼロであるため)。

第二に、あなたは述べました

normalTransformedが正しい方向(つまり、それが接続されているサーフェスが変換されていないときに指す方向と同じ方向)を指すようにしたいのですが、数学的にどのように行う必要がありますか?

正規行列は、モデル変換を使用して正規行列をコヒーレントに変換するために使用されます(実際、正規行列はモデルビュー行列から導出されます)。あなたの引用から私が理解できるように、あなたは通常を変換したくないということです...確かに、なぜあなたはそれを変換するのですか?'normal'を直接使用できます。

于 2012-05-15T12:33:22.260 に答える
1

適用しているアフィン変換が座標系の「利き手」を逆にする場合にのみ、法線の相対的な方向を逆にする必要があります。これは、たとえば でスケーリングした場合に発生します[1, 1, -1]

Physically Based Renderingによると、左上の 3x3 (通常の?) 行列の行列式を計算することで、このケースを確認できます。行列式が負の場合、マトリックスは利き手を変更するため、法線を反転する必要があります。

[昨日これについて読んだばかりで、記憶から引用しています]。

于 2014-05-27T16:00:41.487 に答える