Создание фиксированного источника света, который сохраняет свои мировые координаты - PullRequest
3 голосов
/ 01 июня 2011

Я хочу поместить свет в сцену, которая зафиксирована в определенном месте.Вот что сайт OpenGL может сказать по этому поводу:

Как я могу сделать свой свет фиксированным относительно моей сцены?Как я могу поместить источник света в угол и сделать так, чтобы он оставался там, пока я меняю свое представление?

При изменении вашего представления меняется и ваша матрица ModelView.Это означает, что вам нужно будет повторно указать светлое положение, обычно в начале каждого кадра.Типичное приложение будет отображать кадр со следующим псевдокодом:

  • Установить преобразование вида.
  • * Установить положение освещения // glLightfv (GL_LIGHT_POSITION,…) *
  • Передача геометрии сцены или модели.
  • Замена буферов.

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

Поэтому я добавил это к paintGL()функция.

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
gluLookAt(0.0, 5.0, 0.0,
    0.0, 0.0, 0.0,
    0.0, 1.0, 0.0);
GLfloat l0pos[] = {0.0, 0.0, 0.0, 1.0};
glLightfv(GL_LIGHT0, GL_POSITION, l0pos);
glPopMatrix();

Кажется, когда я стою, все в порядке, но когда я перемещаю положение глаз камеры или ее центральное положение, свет мигает.Что я делаю не так?


Обновление2 : я закончил использовать этот код, но у меня все еще есть проблемы.Свет больше не движется, но его положение не точное.Матрица сверху стека - это матрица, сгенерированная командой gluLookAt, которая представляет положение камеры.

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glTranslatef(xCoordinate, yCoordinate, zCoordinate);
GLfloat lpos[] = {0.0, 0.0, 0.0, w};
glLightfv(GL_LIGHT0, GL_POSITION, lpos);
glPopMatrix();

1 Ответ

4 голосов
/ 01 июня 2011

Я не совсем уверен, является ли это причиной ваших симптомов, однако:

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
gluLookAt(0.0, 5.0, 0.0,
    0.0, 0.0, 0.0,
    0.0, 1.0, 0.0);

Есть несколько вещей, на которые вы хотели бы взглянуть здесь.

Во-первых,согласно онлайн-документации, gluLookAt умножает матрицу в верхней части стека на матрицу преобразования камеры, а не устанавливает ее (более того, glPushMatrix сохраняет текущую матрицу).По этой причине перед преобразованием камеры рекомендуется убедиться, что текущая матрица является единичной матрицей.Как правило, достаточно push / pop, но если вы вызываете gluLookAt после или «внутри» какого-либо другого преобразования, могут произойти плохие вещи.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...