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) とは反対の方向を指します。