1

フィールドにボールがあり、カメラが上からの角度からボールを​​見るようにロックされている OpenGL で小さなシミュレーション ゲームを作成しています (以下のスクリーンショットを参照)。すべてが正常に機能しますが、カメラがあるポイントを通過すると、壁の照明が失敗します。新たに作成したシーンでは「ライトがない」ようになります。

これが正しいものです: 正しい

これは、カメラがあるポイントから通過するときで、左の壁の照明がリセットされます。

正しくない

徐々に発生するわけではありません。カメラが動いていると突然起こります。壁を描画するための私のコードは次のとおりです。

glBindTexture(GL_TEXTURE_2D, brickTexture);
glCallList(wallObjectID);

リストが以前に定義されている場所:

glNewList(wallObjectID, GL_COMPILE);
glBegin(GL_QUADS);
glNormal3f(0, 90, 0);

glTexCoord2f(0, 0);
glVertex3f(0, 0, 0);
glTexCoord2f(0, 1);
glVertex3f(0, level->length, 0);
glTexCoord2f(2, 1);
glVertex3f(0,level->length, 100);
glTexCoord2f(2, 0);
glVertex3f(0, 0, 100);

glNormal3f(90, 0, 0);

glTexCoord2f(0, 0);
glVertex3f(0, 0, 100);
glTexCoord2f(0, 2);
glVertex3f(level->width, 0, 100);
glTexCoord2f(2, 2);
glVertex3f(level->width, 0, 0);
glTexCoord2f(2, 0);
glVertex3f(0, 0, 0);

glEnd();
glEndList();

プログラムの最初に初期化される OpenGL 設定は次のとおりです。

glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glShadeModel(GL_SMOOTH);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
glEnable(GL_TEXTURE_2D);
glEnable(GL_DOUBLEBUFFER);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
float pos[] = { -30, -30, 30 };
float intensity[] = { 1,1,1,1 };
glLightfv(GL_LIGHT0, GL_POSITION, pos);
glLightfv(GL_LIGHT0, GL_SPECULAR, intensity);
glLightfv(GL_LIGHT1, GL_POSITION, pos);
glLightfv(GL_LIGHT1, GL_SPECULAR, intensity);
float diff[] = { 0.6f, 0.6f, 0.75f };
glLightfv(GL_LIGHT1, GL_DIFFUSE, diff);

...

問題の原因は何ですか? ありがとうございました。

更新: ボールの影に惑わされないでください。これは、ボールの下にある透明度が有効なテクスチャに過ぎず、実際の影ではありません。

4

1 に答える 1

2

ライトの位置が正しく設定されていません。3D ベクトル - 位置を使用しました。しかし、関数のドキュメントによると、 4D ベクトルを使用する必要があります。

4 番目の (w) コンポーネントは、ライトが指向性かポイントかを示し、1 はポイント ライトであることを意味します。1 以外の値を指定すると、不適切な変換が行われます。w = 500 で、3 ポイント移動すると、ライトは 1500 ポイント移動します。

また、ワールドの移動 (カメラの移動) のために ModelView マトリックスを変更するときに、各ライトの位置を設定する必要があります。これは、ワールドを移動すると、ライトはワールドと一緒に移動しないためです。つまり、ライトは常にカメラの前にあります。カメラにロックされた状態で動いています。これを読んでください。

ライトの位置は、glLight*() の呼び出しで位置が指定された時点で、現在の ModelView マトリックスによって変換されます。

于 2012-05-19T13:43:52.170 に答える