OPENGL Light Rotation - PullRequest
       24

OPENGL Light Rotation

0 голосов
/ 01 апреля 2020

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

glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
lightType = [-2.0, 0.0, -3.0, 1.0]
glLightfv(GL_LIGHT0, GL_POSITION, lightType)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
m = accum.get_rotation_matrix()
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glMatrixMode(GL_MODELVIEW)
glLoadMatrixf(m)
draw_cube()

UPD. Другой пример

def init():
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    lightType = [0, 0, 4, 1]
    glLightfv(GL_LIGHT0, GL_POSITION, lightType)
    glLightfv(GL_LIGHT0, GL_AMBIENT, (0, 0, 0, 0))
    glLightfv(GL_LIGHT0, GL_DIFFUSE, (0, 0, 0, 0))
    glLightfv(GL_LIGHT0, GL_SPECULAR, (1, 1, 1, 1))
    glLightfv(GL_LIGHT0, GL_SPOT_CUTOFF, 180)
    glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, (0, 0, 1, 1))
    glEnable(GL_LIGHTING)
    glEnable(GL_LIGHT0)

Я ожидаю, что одна часть куба будет всегда освещена, но это не так: после некоторого вращения куб не будет освещен (рисунки 1 и 2). Я хотел бы, например, чтобы некоторая часть лицевой поверхности куба была всегда освещена независимо от вращения куба

enter image description here

enter image description here

1 Ответ

0 голосов
/ 01 апреля 2020

Когда позиция освещения установлена, то позиция преобразуется с помощью матрицы вида текущей модели (GL_MODELVIEW). См. glLight и glMatrixMode.
Если позиция установлена, до того, как будет установлена ​​матрица вида (вид модели - Матрица идентичности ) , то положение света не трансформируется и устанавливается в поле зрения. Следовательно, свет перемещается с точки зрения и привязывается к камере.
Если вы хотите установить положение источника света в мировом пространстве, то вам нужно установить матрицу вида до того, как будет установлено положение источника света. Таким образом, световое положение преобразуется матрицей вида (матрица v ie преобразует пространство мира в пространство просмотра).

glMatrixMode(GL_MODELVIEW)
glLoadMatrixf(viewMatrix)

lightType = [-2.0, 0.0, -3.0, 1.0]
glLightfv(GL_LIGHT0, GL_POSITION, lightType)

glMultMatrixf(modelMatrix)
draw_cube()
...