2

私は現在、クリップ空間ビューでシーンを表示する OpenGL を使用した小さなおもちゃのプログラムに取り組んでいます。つまり、立方体を描画して正準ビュー ボリュームを視覚化し、立方体内に射影変換されたモデルを描画します。モデル図面のコード スニペットを表示するには:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glScalef(1.0f, 1.0f, -1.0f);
glMultMatrixd(projectionMat);
glMultMatrixd(modelviewMat);
glEnable(GL_LIGHTING);
draw_model();
glDisable(GL_LIGHTING);

したがって、当然、描画されたモデルは「歪んで」います (これが望ましい動作です)。ただし、サーフェス法線も射影行列によって変換されるため、変換後のサーフェスに対して直交しないため、ライティングは正しくありません。私が達成しようとしているのは、歪んだモデルの表面が正しい法線を持つという意味で「正しい」ライティングです。

問題は、どうすればそれができるかということです。私は通常の法線の転置逆行列ルールで遊んでいましたが、私が理解している限り、それは OGL がデフォルトで法線で行うことです。サーフェスがモデルビュー マトリックスで変換された後、サーフェス法線を再計算する必要があると思いますが、その方法は? それとも別の方法がありますか?

4

2 に答える 2

1
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glScalef(1.0f, 1.0f, -1.0f);
glMultMatrixd(projectionMat);

射影行列は に入りglMatrixMode(GL_PROJECTION);ます。法線の変換は、モデルビューの逆転置で行われます。モデルビューに投影コンポーネントがある場合、通常の変換が台無しになります。

正しいコードは

glMatrixMode(GL_PROJECTION);
glLoadMatrixd(projectionMat);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glScalef(1.0f, 1.0f, -1.0f);
glMultMatrixd(modelviewMat);
glEnable(GL_LIGHTING);
draw_model();
glDisable(GL_LIGHTING);
于 2012-11-22T18:53:16.677 に答える
0

固定関数を使用している場合は、これらすべてを射影行列に入れる必要があります。投影後に発生するスケール、平行移動、および回転を含めます。

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glScalef(1.0f, 1.0f, -1.0f);
glMultMatrixd(projectionMat);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMultMatrixd(modelviewMat);
glEnable(GL_LIGHTING);
draw_model();
glDisable(GL_LIGHTING);

これが機能するのは、位置 (つまり、表示されるもの) が射影行列とモデル ビュー マトリックスの両方によって変換されるためです。ただし、固定関数ライティングはビュー空間でのみ行われます (つまり、モデル ビューの後、射影の)。

実際、固定関数 GL で 2 つの行列が区別されるのはまさにそのためです。

于 2012-11-22T19:08:08.660 に答える