gpt4 book ai didi

C++ Opengl - 使用聚光灯照明

转载 作者:可可西里 更新时间:2023-11-01 18:28:31 27 4
gpt4 key购买 nike

我有一个模型需要在聚光灯/平行光下,

意思是,我需要在模式(聚光灯和定向)之间切换。

下面是一些解释的代码:

我可以通过鼠标移动来旋转模型/光源,所以我正在使用

glRotate 和 glTranslate。

一旦用户按下“L”键,我就应该在模式之间切换。

这里是闪电的代码:

void LightBall::projectLight(void)
{
if(LIGHT == _lightMode){
printf("Entering LIGHT mode\n"); <--- Supposed to be a directional light
glDisable(GL_LIGHT1);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_POSITION, _light_position);
}

if(SPOT_LIGHT == _lightMode){
printf("Entering SPOTLIGHT mode\n"); <--- Supposed to be a spotlight
glDisable(GL_LIGHT0);
glEnable(GL_LIGHT1);
glLightfv(GL_LIGHT1, GL_POSITION, _light_position);
glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 10.0);
glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 2.0);
glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION,_spotlight_position);
}
}

问题是在它们之间切换时我总是得到相同的灯光模式,

以下是:

directional

另一个例子是在两种灯光模式之间切换后仍然得到相同的灯光

带光源旋转的光源(小球):

rotation

我怎样才能得到想要的结果?

这里是 LIGHT0 和 LIGHT1 的定义:

    GLfloat light_ambient[] = { 1.0, 0.0, 0.0, 1.0 };
GLfloat light_diffuse[] = { 1.0, 0.0, 0.0, 1.0 };
GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
_light_position[0] = 0.0;
_light_position[1] = 1.0;
_light_position[2] = 0.0;
_light_position[3] = 0.0;

_spotlight_position[0] = 0.0;
_spotlight_position[1] = -1.0;
_spotlight_position[2] = 0.0;

glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);

glLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular);

谢谢!

最佳答案

GL 灯是定向灯还是聚光灯取决于其位置的 w(第 4 个)分量。如果坐标为 0,则它是定向的。如果非零(通常为 1),则它是聚光灯。在调用 glLightfv(..., GL_POSITION, ...) 之前,您必须相应地修改 _lightPosition

关于C++ Opengl - 使用聚光灯照明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13893332/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com