C++ 如何停止位置光随摄影机移动

C++ 如何停止位置光随摄影机移动,c++,opengl,lighting,opengl-compat,C++,Opengl,Lighting,Opengl Compat,当我在openGL项目中旋转和/或移动相机时,几乎就好像有一个聚光灯随它一起移动,但是我已经将我的gl灯光设置为位置,并给它一个静态位置 void Lighting::Display() { glPushMatrix(); glTranslatef(0.f, yoffset, 0.f); // move to start glTranslatef(0.f, ceilHeight * scale[0], 0.f); DrawLight(); glDisa

当我在openGL项目中旋转和/或移动相机时,几乎就好像有一个聚光灯随它一起移动,但是我已经将我的gl灯光设置为位置,并给它一个静态位置

void Lighting::Display()
{
    glPushMatrix();

    glTranslatef(0.f, yoffset, 0.f); // move to start
    glTranslatef(0.f, ceilHeight * scale[0], 0.f);
    DrawLight();

    glDisable(GL_LIGHTING);

    glPushAttrib(GL_ALL_ATTRIB_BITS);
    // Match colour of sphere to diffuse colour of light
    glColor4fv(specular);
    glTranslatef(0.f, -10.0f * scale[1], 0.f);
    glutSolidSphere(5.0f * scale[0], 25, 25);

    glPopAttrib();
    glPopMatrix();
    // Re-enable lighting after light source has been drawn
    glEnable(GL_LIGHTING);

    // Set properties GL_LIGHT0
    glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, specular);
    //glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.0001f);

    GLfloat pos[4] = { 0.f, 950.f, 0.f, 1.f };
    glLightfv(GL_LIGHT0, GL_POSITION, pos);

    // enable GL_LIGHT0 with these defined properties
    glEnable(GL_LIGHT0);
}
我希望有一个单一的光源悬挂在场景的中心,光线从它的位置均匀地向各个方向发射 然而,一道光线似乎是作为聚光灯发出的

以下是一张图片,展示了这一问题:


正如您所看到的,有一条奇怪的光线发出。

当灯光位置设置为时,
pos
乘以当前模型视图矩阵

的环境光(
Ia
)、漫反射光(
Id
)和镜面反射光(
Is
)的强度计算如下:

N。。。诺尔马尔向量
L灯光矢量(从顶点位置到灯光)
v视图向量(从顶点位置到眼睛)
嘘。。。光亮
H=正常化(V+L)
NdotH=最大值(点(N,H),0.0)
Ia=1
Id=最大值(点(N,L),0.0)
Is=功率(第N个,第sh个)
因此环境光(
GL_ambient
)与任何方向无关

漫反射光(
GL\u diffuse
)取决于曲面的法向量(
N
)和入射光的方向(
L
)。它在照亮的表面上保持不变,与视点无关

镜面反射光(
GL_specular
)取决于曲面法向量(
N
)、光方向(
L
)。以及查看方向(
V
)。这会导致在场景中移动时镜面反射高光发生变化,因为到照明曲面的查看方向会发生变化

进一步注意,不推荐使用的OpenGL固定功能灯光模型中的灯光计算是按顶点进行的()。计算出的灯光在基本体角点之间的区域上进行插值。现代的实现是对每个片段()进行光照计算。
Gouraud着色会导致天花板上镜面反射高光的斑点外观,并可能增加意外外观。在较小的空间中细分区域可能会改善这一点,但最好的解决方案是切换到现代OpenGL write a,并根据您的需要实现每个片段的灯光模型。

在设置灯光位置之前,您可以打开矩阵。因此,你的光的位置总是你设置的。然后,将其他所有内容乘以我假设的视图矩阵。视图矩阵实质上将世界转换为摄影机的视图。本质上,摄影机不移动,世界围绕摄影机移动。由于灯光不会与该视图矩阵相乘,因此您也会得到一个灯光,该灯光看起来相对于相机保持恒定的位置。

因为您使用的是传统(非现代)你可以用OpenGL API来移动眼睛的位置,而不是移动模型。我指的相机是用gluLookAt移动的already@zombunny天花板上的这些点是镜面反射的亮点,不是吗。镜面反射光取决于灯光位置、法向量和观察方向。当你改变视角时,特定的亮点必须改变。啊,我可以看出这就是问题所在,这是否意味着我将不得不接受它?@zombunny是的。你们有反射球吗?通过点光源照亮它并在其周围移动,然后您可以看到尝试由模拟的自然效果。当然效果很差,尤其是在不推荐使用的OpenGL固定功能灯光模型的背景下。我尝试过你的建议,但似乎没有任何明显的区别。天花板上的这些点是镜面反射的高光,不是吗。镜面反射光取决于灯光位置、法向量和观察方向。更改视点时,特定高光必须更改。