将世界中的物体移向静止的相机

Posted

技术标签:

【中文标题】将世界中的物体移向静止的相机【英文标题】:moving object in the world towards a stationary camera 【发布时间】:2014-02-18 05:11:44 【问题描述】:

我想将相机向前移动,这相当于将世界移回相机。我正在使用 Glut 和 glTranslate 可以完成这项工作,但我的问题是我应该如何使用它?

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

我想我可以使用 glGet 保存当前矩阵,加载标识矩阵,然后进行我想要的转换,然后使用 glMultmatrix 将前一个矩阵相乘。但这对我不起作用。

如果我想使用 glrotate 启用偏航/俯仰,我应该怎么做? (在某种意义上也可以旋转世界以使其看起来像旋转相机)

抱歉,我的措辞不当或概念错误(如果有的话)。一般来说,我对opengl和图形编程很陌生,我仍在尝试完全理解opengl管道,尤其是矩阵部分。任何对此的详细解释也将不胜感激!

【问题讨论】:

【参考方案1】:

通过阅读您的问题,在我看来,您正在尝试做的是通过围绕固定点(相机)平移世界上所有其他对象来模拟相机运动

虽然您说移动相机实际上会移动世界上与之相关的所有其他东西是正确的,但您似乎走错了路。毕竟,看看你只是移动一个盒子有多么困难。现在想象你有数百个!没什么好玩的:)

幸运的是,有一个功能可以帮助您,而且您已经在使用它了! 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

如果看起来太难了,不要气馁,坚持下去!如果您需要澄清这个答案,请随时问我。

【讨论】:

我可能需要一些时间才能了解以上所有内容,但提前非常感谢!如果还有问题,我会发布以下问题:)

以上是关于将世界中的物体移向静止的相机的主要内容,如果未能解决你的问题,请参考以下文章

视觉高级篇21 # 如何添加相机,用透视原理对物体进行投影?

视觉高级篇21 # 如何添加相机,用透视原理对物体进行投影?

Libgdx之正交相机 OrthographicCamera

Libgdx之正交相机 OrthographicCamera

深度相机哪家强?

基于物理的的相机:曝光