PyOpenGL glLookAt在第一次调用后表现得很奇怪,具有相同的参数

时间:2016-10-27 11:35:33

标签: python opengl camera perspective pyopengl

我目前正在编写一个使用PyOpenGL上学的小游戏(Python不是我的选择......)。

我似乎无法绕过"相机"的功能。我认为对我来说最直观的方法是gluLookAt(...)函数。我想以第三人称看待我的角色。由于我的游戏是基于图块的,逻辑上是二维的,因此Y坐标永远不会改变。以下是我认为重要的代码(基本上我用OpenGL做的所有事情)。

这就是所谓的一次,最初设置OpenGL:

# set the perspective
fieldOfView = 45 # degrees
aspectRatio = 1800 / 1000 # given as parameters to constructor previously
gluPerspective(fieldOfView, aspectRatio, 0.1, 50.0)

# things in the back are covered by things in front of them
glEnable(GL_DEPTH_TEST)

这是每次更新时调用的内容:

# Clear Buffers
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)

# render the objects in the map and ground where needed
self.renderAllObjects() # in here glBegin(..), glEnd(),
                        # glColor3fv(...) and glVertex3fv(...)
                        # are the only used OpenGL functions
# eye coords
eX = 19.5
eY = 3
eZ = 1.5

# center/lookat coords
cX = 12.5
cY = 1
cZ = 1.5

gluLookAt(eX, eY, eZ, cX, cY, cZ, 0, 1, 0)

当第一次更新运行时,一切都按预期工作,但是一旦我再次调用更新功能,我们就会被放置在某个其他坐标处,这似乎与相机的前一个坐标有某种关系。

在线我找到了这些功能:

  • glMatrixMode(...)与GL_MODELVIEW和GL_PERSPECTIVE
  • glLoadIdentity()

有人说,glLoadIdentity()是在每次gluLookAt(...)之前调用的。但是一旦我这样做,我只会得到一个黑屏。

同时围绕放置glMatrixMode(...)的地方并没有解决任何问题。

我也尝试更改加载对象和相机的顺序,但似乎我当前的订单是正确的。

非常感谢任何帮助。我是一个完全的OpenGL新手。可悲的是经过几个小时的研究后,我无法绕过这个。

1 个答案:

答案 0 :(得分:2)

在您gluPerspective之前

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(fieldOfView, aspectRatio, 0.1, 50.0)

设置投影矩阵。

然后每次渲染帧时都会设置模型视图矩阵:

glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
gluLookAt(eX, eY, eZ, cX, cY, cZ, 0, 1, 0)

投影矩阵和模型视图矩阵是由GL存储的单独状态。因此,为了使glLoadInentitygluLookAt不覆盖投影矩阵,您必须使用glMatrixMode来指定您当前正在使用哪个矩阵。

此外,您应该在渲染对象(gluLookAt)之前设置模型视图矩阵(self.renderAllObjects