OPENGL灯光旋转

时间:2020-04-01 15:44:18

标签: python opengl pyopengl opengl-compat

我正在尝试设置一个固定光源。在我的程序中,我有一个可以旋转的立方体,似乎光源也在旋转。但这不应该

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 :(得分:0)

设置光源位置后,该位置将通过当前模型视图矩阵(GL_MODELVIEW)进行转换。请参见glLightglMatrixMode
如果设置了位置,则在设置视图矩阵(模型视图为Identity matrix)之前,灯光位置不会变形,而是会在视图空间中设置。因此,光线随视点移动并固定在相机上。
如果要设置世界空间中的灯光位置,则必须在设置灯光位置之前设置视图矩阵。这样,光的位置就被视图矩阵转换(维矩阵从世界空间转换为视图空间)。

glMatrixMode(GL_MODELVIEW)
glLoadMatrixf(viewMatrix)

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

glMultMatrixf(modelMatrix)
draw_cube()