私は赤い本のレシピに従ってopenglで影を描こうとしています http://www.glprogramming.com/red/chapter14.html#name15
簡単に始めるために、影を落とすライトを原点に配置します。
カメラを x,y,z = 0,1,0 に配置し、-ve y 軸に沿って「下」を見ます。
y = 0.1 で 0.1 x 0.1 の正方形を描きます
float mx,pz,elevation;
mx = pz = elevation = 0.1;
glBegin( GL_QUADS );
glVertex3f( mx, elevation, pz);
glVertex3f( mx, elevation, pz+0.1);
glVertex3f( mx+0.1, elevation, pz+0.1);
glVertex3f( mx+0.1, elevation, pz);
glEnd();
期待どおりに表示されます:
ここで、y = 0.5 (つまり、正方形とカメラのほぼ中間) で「地面」を定義します。赤い本のレシピによると (正しく理解できれば)、シャドウ マトリックスは次のようになります。
// shadow matrix
GLfloat shadow[] = {
0.5,0,0,0,
0, 0.5,0,0,
0,0, 0.5,0,
0,1,0,0 };
だから私は追加します
glMatrixMode (GL_MODELVIEW);
glLoadIdentity();
glMultMatrixf( shadow );
地面に正方形の影が見えることを期待しています - わずかに大きな正方形です。代わりに、完全な空白が得られます。
私の間違いは何ですか?
(シャドウ マトリックスの値とレンダリングされた正方形の標高の符号を反転するすべての組み合わせを試しました。すべてが空白になります。)
(また、シャドウ マトリックスを単位マトリックスに置き換えてみました。元の正方形が再び表示されます。したがって、これは愚かなコーディング エラーを除外しているようです。シャドウ マトリックスに何か問題があります。)
多分いくつかの代数が役立つでしょうか?
任意のグランドプレーン:
。x + b。y + c . y + d = 0
任意のライトから任意の頂点へのベクトル
x = lx + m . ( vx - lx )
y = ly + m . ( vy - ly )
z = lz + m . ( vz - lz )
m について解く
m = - (a.lx + b.ly + c.lz + d) / (a.vx - a.lx + b.vy - b.ly + c.vz - c.lx)
ライトを原点に配置します
m = -d / ( a . vx + b . vy + c . vz )
x = m . vx
y = m . vy
z = m . vz
ここで、グランド プレーンを y = 0.5 に配置します。
m = 0.5 / vy
x = 0.5 . vx / vy
y = 0.5
z = 0.5 . vz / vy
これは、頂点 v の影が地面に当たるポイントである必要があります。実際、これらのポイントを手動で計算し、それらを opengl にプラグインすると、期待どおりの表示が得られます!