OpenGL ES 1.x でオブジェクトを (均一に) 縮小するとオブジェクトが軽くなるのはなぜですか?
法線が縮小されてもオブジェクトが暗くなるのではないので、暗くなる方が理にかなっていますか? しかし、何らかの理由でオブジェクトが軽くなります。拡大するとオブジェクトが暗くなります。私の意見では、これは逆であるべきです。
GL_NORMALIZE などの使用を提案しないでください。なぜ OpenGL の実装がそのように機能するのか興味があります。
OpenGL ES 1.x でオブジェクトを (均一に) 縮小するとオブジェクトが軽くなるのはなぜですか?
法線が縮小されてもオブジェクトが暗くなるのではないので、暗くなる方が理にかなっていますか? しかし、何らかの理由でオブジェクトが軽くなります。拡大するとオブジェクトが暗くなります。私の意見では、これは逆であるべきです。
GL_NORMALIZE などの使用を提案しないでください。なぜ OpenGL の実装がそのように機能するのか興味があります。
簡単な質問、複雑な答え。これは、レッドブックからの関連する抜粋です。
法線の変換
法線ベクトルは、頂点または位置ベクトルと同じように変換されません。数学的には、法線ベクトルをベクトルとしてではなく、それらのベクトルに垂直な平面として考える方がよいでしょう。次に、法線ベクトルの変換規則は、垂直面の変換規則によって記述されます。同種平面は、行ベクトル(a、b、c、d)で表されます。ここで、a、b、c、またはdの少なくとも1つはゼロ以外です。qがゼロ以外の実数の場合、(a、b、c、d)と(qa、qb、qc、qd)は同じ平面を表します。ax + by + cz + dw = 0の場合、点(x、y、z、w)Tは平面(a、b、c、d)上にあります。(w = 1の場合、これはユークリッドの標準的な記述です。 (a、b、c、d)がユークリッド平面を表すためには、a、b、またはcの少なくとも1つが非ゼロでなければなりません。それらがすべてゼロの場合、(0、0、0、
pが同種平面であり、vが同種頂点である場合、ステートメント「vは平面p上にあります」は、数学的にpv = 0と記述されます。ここで、pvは正規行列の乗算です。Mが非特異頂点変換(つまり、逆M-1を持つ4×4行列)の場合、pv=0はpM-1Mv=0と同等であるため、Mvは平面pM-1上にあります。したがって、pM-1は頂点変換Mの下の平面の画像です。
法線ベクトルをそれらに垂直な平面としてではなくベクトルとして考えたい場合は、vとnをvがnに垂直になるようなベクトルとします。次に、nTv = 0です。したがって、任意の非特異変換Mの場合、nTM-1Mv = 0です。これは、nTM-1が変換された法線ベクトルの転置であることを意味します。したがって、変換された法線ベクトルは(M-1) Tnです。言い換えると、法線ベクトルは、点を変換する変換の逆転置によって変換されます。ふぅ!
つまり、ポジションと法線は同じように変換されません。前のテキストで説明したように、通常の変換行列は(M-1)Tです。MをsMにスケーリングすると、(M-1)T / sになります。スケール係数が小さいほど、変換された法線が大きくなります。