освещение openGL вращается вместе с камерой - PullRequest
1 голос
/ 12 апреля 2011

Я пытаюсь создать что-то простое для курсовой работы в универе, и я только что попытался его зажечь, но свет, кажется, вращается вместе с камерой, что очень раздражает ...

* 1002вставил мой код ниже, используя pastebin (чтобы он не растягивал страницу), но вот небольшое объяснение:

Я добавил источники света в Display :: Init (используя класс PoolLight).Камера настроена в Display :: Resize.Он расположен над «бильярдным столом» в точке (0, 0, 80), смотря вниз (0, 0, -1), а ось X направлена ​​вперед / вверх (1, 0, 0).Это простое движение и вращение камеры также регулирует свет, но не геометрию (или, возможно, он регулирует геометрию, а не свет, я не совсем уверен).

Я читал некоторые издругие ответы здесь касаются той же проблемы, но я не очень хорошо понимаю.Я надеюсь, что кто-то может объяснить мне это в более простых терминах или, может быть, заметит что-то очевидное, что я случайно исключил.

В любом случае, вот код:

Класс основного дисплея

Класс PoolLight:

#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);
}

1 Ответ

3 голосов
/ 12 апреля 2011

После изменения положения камеры снова наберите glLightfv(lightNumber, GL_POSITION, position) с мировыми координатами источника света.Затем нарисуйте сцену.

...