我想向前移动相机,这相当于将世界移回相机。我正在使用Glut和glTranslate来完成这项工作,但我的问题是我应该如何使用它呢?
假设我最初从glLoadIdentity()开始,然后使用gluLookAt设置外观点,然后我对模型进行了一些平移/旋转。在这种情况下,我应该如何使用glTranslate翻译世界中的对象,以便它们可以相对于相机而不是自己的原点/坐标移动?
我以为我可以使用glGet保存当前矩阵,加载Identity矩阵,然后进行我想要的转换,然后使用glMultmatrix将前一个矩阵相乘。但这对我没用。
如果我想使用glrotate启用偏航/音高,我该怎么办? (同样在旋转世界的意义上使它看起来像旋转相机)
抱歉,如果有的话,我的措辞或概念错误。我对opengl和图形编程很新,我仍然试图完全理解opengl管道,尤其是矩阵部分。任何详细的解释也将非常感谢!
答案 0 :(得分:0)
通过阅读你的问题,我觉得你想要做的就是通过翻译世界上关于固定点(相机)的所有其他物体来模拟相机移动
虽然你说移动相机实际上移动了世界上其他所有关于它的东西是正确的,但你似乎是以错误的方式去做。毕竟,看看你移动一个盒子有多困难。现在想象你有数百个!没什么好玩的:)
幸运的是,有一个功能可以帮助你,你已经在使用它了! 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
如果看起来太难,不要气馁,坚持下去!如果您需要澄清这个答案,请随时问我。