OPENGL 灯光旋转

OPENGL Light Rotation

我正在尝试设置一个固定光源。在我的程序中,我有一个可以 rotated.It 的立方体,看起来光源也在旋转。但不应该

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()

更新。另一个例子

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)

我希望立方体的一部分始终会发光,但 os 不会:经过一些旋转立方体不会发光(图 1 和 2)。例如,我希望立方体正面的某些部分始终被点亮,而不管立方体的旋转

设置灯光位置后,位置将通过当前模型视图矩阵进行变换(GL_MODELVIEW)。参见 glLight and glMatrixMode
如果在设置视图矩阵之前设置了位置(模型视图是 Identity matrix),那么灯光位置不会被转换,而是在视图 space 中设置。因此光线随视点移动并固定在相机上。
如果你想在world space中设置灯光位置,那么你必须在设置灯光位置之前设置视图矩阵。因此,光源位置由视图矩阵转换(vie 矩阵从世界 space 转换为视图 space)。

glMatrixMode(GL_MODELVIEW)
glLoadMatrixf(viewMatrix)

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

glMultMatrixf(modelMatrix)
draw_cube()