2014-02-18 71 views
0

我想向前移动相机,这相当于将世界移回相机。我使用Glut和glTranslate会做这项工作,但我的问题是我应该如何使用它?将世界上的物体朝向固定相机移动

假设最初我从glLoadIdentity()开始,然后使用gluLookAt设置点的外观,然后我对模型做了一些平移/旋转。在这种情况下,我应该如何使用glTranslate来翻译世界中的物体,以便它们可以相对于相机而不是它们自己的原点/坐标移动?

我想我可以使用glGet保存当前矩阵,加载标识矩阵,然后做我想要的翻译,然后使用glMultmatrix将前一个矩阵重新乘。但这不适合我。

而且,如果我想使用glrotate启用偏航/俯仰,我该怎么做? (也在旋转的世界看起来像旋转相机)意义

对不起,如果有什么我可怜的措辞或概念错误。我对opengl和图形编程一般都很陌生,我仍然试图完全理解opengl管道,尤其是矩阵部分。任何对此的详细解释也将不胜感激!

回答

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

不要如果看起来太辛苦,就不要气馁,坚持下去!随意问我是否需要澄清这个问题。

+0

我可能需要一段时间才能完成以上所有事情,但是要提前致谢!如果还有任何问题,我会发布以下问题:) – user3321813