C++ openGL照明随摄影机旋转

C++ openGL照明随摄影机旋转,c++,opengl,lighting,C++,Opengl,Lighting,我正在尝试为大学课程做一些简单的东西,我刚刚试着点燃它,但是灯光似乎随着相机旋转,这真是令人讨厌 我已经在下面使用粘贴箱粘贴了我的代码(这样它就不会拉伸页面),但这里也有一些解释: 我在Display::Init(使用PoolLight类)中添加了灯光。 相机在Display::Resize中设置。它位于(0,0,80)的“池桌”上方,向下看(0,0,-1),X轴向前/向上(1,0,0) 相机的简单移动和旋转也会调整灯光,但不会调整几何体(或者它会调整几何体,而不是灯光,我不太确定) 我已经阅读

我正在尝试为大学课程做一些简单的东西,我刚刚试着点燃它,但是灯光似乎随着相机旋转,这真是令人讨厌

我已经在下面使用粘贴箱粘贴了我的代码(这样它就不会拉伸页面),但这里也有一些解释:

我在Display::Init(使用PoolLight类)中添加了灯光。 相机在Display::Resize中设置。它位于(0,0,80)的“池桌”上方,向下看(0,0,-1),X轴向前/向上(1,0,0)

相机的简单移动和旋转也会调整灯光,但不会调整几何体(或者它会调整几何体,而不是灯光,我不太确定)

我已经阅读了关于同一问题的其他一些答案,但我真的不太明白。我希望有人能用更简单的术语向我解释,或者找出一些我不小心排除的明显的东西

无论如何,代码如下:

池灯等级:

#include "PoolLight.h"
#include "Glut/glut.h"
#include "GL/gl.h"
#include "GL/glu.h"

PoolLight::PoolLight(GLenum lightNumber, GLenum lightType, float red, float green, float blue, bool distant, float posX, float posY, float posZ)
{
    this->lightNumber = lightNumber;
    this->lightType = lightType;

    color[0] = red; color[1] = green; color[2] = blue; color[3] = 1;
    position[0] = posX; position[1] = posY; position[2] = posZ; position[3] = (int) (!distant);
    glLightfv(lightNumber, lightType, color);
    glLightfv(lightNumber, GL_POSITION, position);

    enabled(true);
}


PoolLight::~PoolLight(void)
{
}

void PoolLight::setSpotlight(float angle, float attenuation, float dirX, float dirY, float dirZ) {
    glLightf(lightNumber, GL_SPOT_EXPONENT, angle);
    glLightf(lightNumber, GL_CONSTANT_ATTENUATION, attenuation);
    glLightf(lightNumber, GL_LINEAR_ATTENUATION, 0.0f);
    glLightf(lightNumber, GL_QUADRATIC_ATTENUATION, 0.0f);
    spotDirection[0] = dirX; spotDirection[1] = dirY; spotDirection[2] = dirZ;
    glLightfv(lightNumber, GL_SPOT_DIRECTION, spotDirection);
    glLightf(lightNumber, GL_SPOT_CUTOFF, 60);
}

void PoolLight::enabled(bool enabled) {
    if (enabled) glEnable(lightNumber);
    else glDisable(lightNumber);
}

更改相机位置后,使用灯光的世界坐标再次调用
glLightfv(lightNumber,GL\u position,position)
。然后画场景