我目前正在编写一个使用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新手。可悲的是经过几个小时的研究后,我无法绕过这个。
答案 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存储的单独状态。因此,为了使glLoadInentity
和gluLookAt
不覆盖投影矩阵,您必须使用glMatrixMode
来指定您当前正在使用哪个矩阵。
此外,您应该在渲染对象(gluLookAt
)之前设置模型视图矩阵(self.renderAllObjects
)。