C++ 如何停止位置光随摄影机移动
当我在openGL项目中旋转和/或移动相机时,几乎就好像有一个聚光灯随它一起移动,但是我已经将我的gl灯光设置为位置,并给它一个静态位置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
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固定功能灯光模型的背景下。我尝试过你的建议,但似乎没有任何明显的区别。天花板上的这些点是镜面反射的高光,不是吗。镜面反射光取决于灯光位置、法向量和观察方向。更改视点时,特定高光必须更改。