通过阅读您的问题,在我看来,您正在尝试做的是通过围绕固定点(相机)平移世界上所有其他对象来模拟相机运动
虽然您说移动相机实际上会移动世界上与之相关的所有其他东西是正确的,但您似乎走错了路。毕竟,看看你只是移动一个盒子有多么困难。现在想象你有数百个!没什么好玩的:)
幸运的是,有一个功能可以帮助您,而且您已经在使用它了! gluLookAt (http://www.opengl.org/sdk/docs/man2/xhtml/gluLookAt.xml) 是你的人。它在幕后所做的是创建一个矩阵(不确定矩阵是什么?读一读:http://solarianprogrammer.com/2013/05/22/opengl-101-matrices-projection-view-model/),世界上的每个其他点都乘以该矩阵。这种乘法会平移每个点,直到它相对于相机处于正确的位置。所以你说移动相机实际上是相对于相机移动整个世界是正确的,这样我们可以一次完成所有操作,而不必手动计算每个点的新位置。
那么,您想在 z 轴上向前移动相机吗?只需调用 gluLookAt,但传入的 eyez 值小于之前调用 gluLookAt 时的值。这是一个例子:
gluLookAt(0,3,0,0,0,0,0,1,0);//This is out starting position, (0,3,0)
gluLookAt(0,2,0,0,0,0,0,1,0);//And this is out ending position. Notice that the eyez value has decreased by one
至于如何旋转,看第二组三个参数,“中心”参数。这些决定了相机中心的点,即相机正在看什么。在前面的示例中,中心点是 (0,0,0)。您可以通过移动这些点来旋转相机。如何做到这一点是一个相当复杂的话题,其中包含大量数学知识,但以下链接应该会有所帮助:
http://ogldev.atspace.co.uk/www/tutorial15/tutorial15.html
http://www.fastgraph.com/makegames/3drotation/
http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation
如果看起来太难了,不要气馁,坚持下去!如果您需要澄清这个答案,请随时问我。