好的,所以我试图模仿手电筒的行为。目前,我只是想吸引人们关注一个球体。现在,下面的代码可以工作,但是仅当GL_SPOT_CUTOFF设置为180时,它可以创建均匀的光分布-而不是我想要的。如果我尝试将其设置为任何其他值,则它将停止工作。这是代码

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计算出来的,所以不知道还有什么会失败...有什么想法吗?

最佳答案

问题是您的spotDir。它是一个 vector ,而不是您的世界坐标中的一个点。
尝试将其更改为:

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

我很懒,所以我不会将这个 vector 归一化;

这会将您的聚光灯指向球体中心。

希望能帮助到你!

08-04 22:19