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
)进行变换。请参阅glLight
和glMatrixMode
。
如果设置了位置,则在设置视图矩阵之前(模型视图是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 灯光旋转的主要内容,如果未能解决你的问题,请参考以下文章