我创造了一种绕着轨道移动的直升机,现在我遇到麻烦的是我们应该在游戏中有2个光源,一个复制太阳的光源(我已经完成了它也没有第二个是位于实际直升机上的聚光灯。这基本上是我到目前为止所做的:
GLfloat specular2[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat position2[] = { vx, vy, vz, 1.0 };
glLightfv(GL_LIGHT2, GL_DIFFUSE, ambientLight);
glLightfv(GL_LIGHT2, GL_SPECULAR, specular2);
glLightfv(GL_LIGHT2, GL_POSITION, position2);
glLightf(GL_LIGHT2, GL_SPOT_CUTOFF, 60.0f);
glLightf(GL_LIGHT2, GL_SPOT_EXPONENT, 100.0f);
glEnable(GL_LIGHT2);
但是,它没有做任何我注意到的事情。我对灯光进行了大量的研究,我似乎无法弄明白。顺便说一句(vx,vy,vz)是我希望光线在直升机前面的当前位置。
答案 0 :(得分:1)
您用于GL_SPOT_EXPONENT
的值非常大:
glLightf(GL_LIGHT2, GL_SPOT_EXPONENT, 100.0f);
这可以控制强度从锥体中心下降的速度。例如,当该值为100.0时,在距离锥体中心仅10度的角度处,强度将降低至约20%。您可能希望尝试使用更小的值来查看它是否能为您提供更好的结果。
虽然未显示vales,但此调用仅从命名中看起来可疑。它使用名为ambientLight
的变量来设置光源的漫反射组件:
glLightfv(GL_LIGHT2, GL_DIFFUSE, ambientLight);
另外,您没有指定聚光灯的方向。默认值为(0.0,0.0,-1.0)。除非直升机在负z方向上有任何东西,否则聚光灯不会照亮任何东西。如果默认值不是您想要的,则需要指定GL_SPOT_DIRECTION
。
同样重要的是要注意在指定光源位置和方向时应用当前的模型视图变换。因此,如果您的直升机进行了变换,最简单的方法是在转换已经设置的同时指定聚光灯的位置/方向,然后再进行绘制调用。