OPENGL 灯光旋转

Posted

技术标签:

【中文标题】OPENGL 灯光旋转【英文标题】:OPENGL Light Rotation 【发布时间】:2020-04-01 15:44:18 【问题描述】:

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

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)。例如,我希望立方体正面的某些部分始终被点亮,而不管立方体的旋转

【问题讨论】:

【参考方案1】:

设置灯光位置后,位置将由当前模型视图矩阵(GL_MODELVIEW)进行变换。请参阅glLightglMatrixMode。 如果设置了位置,则在设置视图矩阵之前(模型视图是Identity matrix),那么灯光位置不会被转换,而是在视图空间中设置。因此,光线会随着视点移动并固定在相机上。 如果要在世界空间中设置灯光位置,则必须在设置灯光位置之前设置视图矩阵。因此光源的位置由视图矩阵变换(vie矩阵从世界空间变换到视图空间)。

glMatrixMode(GL_MODELVIEW)
glLoadMatrixf(viewMatrix)

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

glMultMatrixf(modelMatrix)
draw_cube()

【讨论】:

评论不用于扩展讨论;这个对话是moved to chat。

以上是关于OPENGL 灯光旋转的主要内容,如果未能解决你的问题,请参考以下文章

如何避免 OpenGL 中的光旋转?

OpenGL定向照明+定位

着色器中的 OpenGL 法线变换

OpenGL学习--08--基本渲染(灯光)

通过多个类传递 OpenGL 3.0 制服的问题

过多的镜面光opengl