2

さて、懐中電灯の動作をエミュレートしようとしています。とりあえず、球体にスポットライトを当てようとしています。これで、以下のコードが機能しますが、が180に設定されている場合にのみ機能しGL_SPOT_CUTOFFます。これにより、光の均一な分布が作成されます。これは、私が目指していることではありません。他の値に設定しようとすると、機能しなくなります。これがコードです

GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light_pos [4] = {5, 2, -10, 1.0};

glLightfv (GL_LIGHT0, GL_SPECULAR, mat_specular);
glLightfv (GL_LIGHT0, GL_POSITION, light_pos);

glLightf (GL_LIGHT0, GL_SPOT_CUTOFF, 20.0f);
glLightf (GL_LIGHT0, GL_SPOT_EXPONENT, 100.0);

GLfloat spotDir [] = {0.0, 0.0, 0.0};
glLightfv (GL_LIGHT0, GL_SPOT_DIRECTION, spotDir);

glutSolidSphere (2, 20, 20);

glFlush ();
glutSwapBuffers ();

ライティングを有効にして、すべての初期化を行いました。すべての表面法線はglutSolidSphereから計算されるので、他に何が失敗する可能性があるのか​​わかりません...何かアイデアはありますか?

4

1 に答える 1

2

問題はあなたspotDirです。これはベクトルであり、ワールド座標のポイントではありません。次のように変更してみてください。

GLfloat spotDir[] = { -5, -2, 10 };

私は怠け者なので、このベクトルを正規化しません;D

これにより、スポットライトが球の中心に向けられます。

それが役に立てば幸い!

于 2012-11-25T19:48:04.463 に答える