带有OpenGl和C+的2D平台游戏摄像机+; 我尝试用C++和OpenGL和GLUT制作一个2D平台游戏。你可以用左右箭头键移动你的玩家,并用空格跳跃。我通过文本文件将所有平台加载到游戏中,并打印到屏幕上。这一切都非常有效。我遇到的问题是照相机。当按下向右箭头键时,我将增加玩家的x位置。问题是,当这种情况发生时,我不能让实际的相机也移动。这让我认为,我应该使用GLTRANSTEF将所有平台向左平移,而不是移动播放器。这对我来说似乎有点奇怪,我只是想知道是否应该这样做。因此,我想最后一个问题是,我应该翻译整个场景还是移动播放器?

带有OpenGl和C+的2D平台游戏摄像机+; 我尝试用C++和OpenGL和GLUT制作一个2D平台游戏。你可以用左右箭头键移动你的玩家,并用空格跳跃。我通过文本文件将所有平台加载到游戏中,并打印到屏幕上。这一切都非常有效。我遇到的问题是照相机。当按下向右箭头键时,我将增加玩家的x位置。问题是,当这种情况发生时,我不能让实际的相机也移动。这让我认为,我应该使用GLTRANSTEF将所有平台向左平移,而不是移动播放器。这对我来说似乎有点奇怪,我只是想知道是否应该这样做。因此,我想最后一个问题是,我应该翻译整个场景还是移动播放器?,c++,opengl,camera,glut,C++,Opengl,Camera,Glut,通过glTranslate以与播放器相反的方向移动相机以跟随播放器 你应该把相机想象成一个游戏中的物体,类似于玩家和其他可移动的物品,而关卡则是一个固定位置的静止物体。这使得放置游戏中的物品和其他东西更加容易 移动相机以跟随播放机,移动方向与播放机相反 你应该把相机想象成一个游戏中的物体,类似于玩家和其他可移动的物品,而关卡则是一个固定位置的静止物体。这使得放置游戏中的物品和其他东西更加容易 实际上,当您在OpenGL中“移动摄影机”时,因为实际上没有摄影机,所以在内部执行的操作就是,将场景中的

通过
glTranslate
以与播放器相反的方向移动相机以跟随播放器


你应该把相机想象成一个游戏中的物体,类似于玩家和其他可移动的物品,而关卡则是一个固定位置的静止物体。这使得放置游戏中的物品和其他东西更加容易

移动相机以跟随播放机,移动方向与播放机相反

你应该把相机想象成一个游戏中的物体,类似于玩家和其他可移动的物品,而关卡则是一个固定位置的静止物体。这使得放置游戏中的物品和其他东西更加容易

实际上,当您在OpenGL中“移动摄影机”时,因为实际上没有摄影机,所以在内部执行的操作就是,将场景中的所有内容都向oposite方向移动

至于解决方案,如果您使用glut,您可以使用

gluLookAt(x,  y,  z,
          ex, ey, ez,
          0,  1,  0)
其中(x,y,z)是您希望摄影机位于的坐标,(ex,ey,ez)是您希望摄影机查看的方向向量(参考(x,y,z)坐标),而(0,1,0)是上方向向量。此函数执行所有必要的矩阵变换。更多信息

如果您不使用glut,而只使用原始OpenGL,那么相同的链接还解释了为实现与gluLookAt完全相同的效果而必须使用的等效OpenGL调用

因此,当你想移动相机时(可能只需左右移动,因为这是一个平台游戏),你只需在OpenGL中“移动相机”时更改x值,因为实际上没有相机,所以内部所做的就是,沿oposite方向移动场景中的所有内容

至于解决方案,如果您使用glut,您可以使用

gluLookAt(x,  y,  z,
          ex, ey, ez,
          0,  1,  0)
其中(x,y,z)是您希望摄影机位于的坐标,(ex,ey,ez)是您希望摄影机查看的方向向量(参考(x,y,z)坐标),而(0,1,0)是上方向向量。此函数执行所有必要的矩阵变换。更多信息

如果您不使用glut,而只使用原始OpenGL,那么相同的链接还解释了为实现与gluLookAt完全相同的效果而必须使用的等效OpenGL调用


因此,当你想移动相机时(可能只需左右移动,因为这是一个平台游戏),你只需更改x值即可

我通过以下方法实现了这一点

gl.PushMatrix()
gl.Translatef((1280/2)-float32((player.Body.Position().X)), 0, 0.0)

//Rest of drawing Code Code

gl.PopMatrix()

这是使用OpenGL+花栗鼠物理(在GoLang中,但应该适用,因为这些只是c绑定)。在本例中,1280是屏幕宽度。

我通过以下方法实现了这一点:

gl.PushMatrix()
gl.Translatef((1280/2)-float32((player.Body.Position().X)), 0, 0.0)

//Rest of drawing Code Code

gl.PopMatrix()

这是使用OpenGL+花栗鼠物理(在GoLang中,但应该适用,因为这些只是c绑定)。在这种情况下,1280是屏幕宽度。

因此,如果我想让相机只看正前方,我会看(0,0,0,0,0,0,1,0,1,0)?准确地说(假设在您的情况下“正前方”是指Z轴方向),但是,请注意视锥台的限制。如果您不知道,这基本上意味着无法绘制相机正前方的对象(即坐标(0,0,0.1))。因此,通常最好将相机向后移动几个单位,例如:gluLookAt(0,0,-5,0,0,0,1,0,1,0)(通过实验调整-5),然后开始在原点绘制,这样可以简化相机前面的运动对象(即在坐标(0,0,0.1))处)对于透视投影为true时无法绘制,对于正交投影则不是这样。使用正交矩阵(取决于参数),您可以看到与眼睛平行甚至在眼睛后面的东西+正确答案为1。是的,忘记了正交投影(实际上没有太多使用它们)。感谢您的更正。如果我想让相机只看正前方,我会看(0,0,0,0,0,1,0,1,0,1,0)?准确地说(假设“正前方”在您的情况下意味着在Z轴方向),但是,请注意视锥台的限制。如果您不知道,这基本上意味着无法绘制相机正前方的对象(即坐标(0,0,0.1))。因此,通常最好将相机向后移动几个单位,例如:gluLookAt(0,0,-5,0,0,0,1,0,1,0)(通过实验调整-5),然后开始在原点绘制,这样可以简化相机前面的运动对象(即在坐标(0,0,0.1))处)对于透视投影为true时无法绘制,对于正交投影则不是这样。使用正交矩阵(取决于参数),您可以看到与眼睛平行甚至在眼睛后面的东西+正确答案为1。是的,忘记了正交投影(实际上没有太多使用它们)。谢谢你的更正