根据相机方向移动

Posted

技术标签:

【中文标题】根据相机方向移动【英文标题】:Move according to camera direction 【发布时间】:2014-06-01 10:18:22 【问题描述】:

我正在使用以下方法围绕自身旋转相机(当相机位于 (0,0,0) 时):

glRotatef(x_camera_angle, 1.0, 0.0, 0.0);
glRotatef(y_camera_angle, 0.0, 1.0, 0.0);

我希望将相机沿其观察方向移动,并对象(例如,将对象移动到相机并远离相机)。

我尝试使用此处指定的模型视图矩阵来实现这一点:https://***.com/a/16137191/3362159,但这似乎不起作用。例如,我尝试使用以下代码向前移动相机(根据其方向):

glTranslatef(front[0] * units_forward, front[1] * units_forward, front[2] * units_forward);

其中“front”是答案中指定的矩阵。相机不会向前移动,它会根据方向不同移动。

我做错了什么?任何帮助将不胜感激。

【问题讨论】:

什么是矩阵运算的顺序? (相机和绘图)。你反转相机矩阵吗? This is a related post 如果您准备好投入一些时间来了解相机在 3D 图形编程中的工作原理,那么它会提供您想要的详细信息。一旦你理解了这一点,你应该能够自己编写代码。 【参考方案1】:

您是否尝试了 glTranslatef(0,0,units_forward)?这可能是您所期望的吗?

您感到困惑的根本原因是矩阵的工作方式。 gl(Matrix) 函数都将当前矩阵与它们构建的矩阵相乘。正如 keltar 在左侧纠正的那样。关于矩阵的一件奇怪的事情是 A*B != B*A。通常产品的右侧“首先发生”。因此,如果 A 是一个旋转并且 B 正在向前移动,A*B 的意思是“向前移动然后围绕我移动到的点旋转”,而 B*A 的意思是“旋转然后向前移动到我们现在指向的位置”。

您引用的答案采用了一条不太有用的捷径。

你总是有两个选择:

gl(Operation) 向左相乘 glGet(tempmatrix), glLoadIdentity() gl(Operation) glMultMatrix(tempmatrix) 向右相乘

两个都试试!看看它们有什么不同。其中一个只需 Operation=Translate 和 (0,0,amount) 即可满足您的需求。

【讨论】:

GL 应用矩阵所以result = new_multiplier * result。它提供“自然”顺序 - glRotate + glTranslate = 旋转,然后平移。如果需要相反的顺序,通常最好只更改操作顺序。 感谢指正。我总是忘记 :) 我会编辑正确的答案。 @keltar:恰恰相反。最后指定的矩阵是最先应用的矩阵。因此,如果您调用glRotateglTranslate,则平移首先应用于您的坐标,然后是旋转。 @RetoKoradi 相反的顺序正是我所说的。关于其余部分,opengl.org/sdk/docs/man2/xhtml/glMultMatrix.xml 请参阅“注释”部分。我有一种感觉,我们在说同样的话,但用的词不同。 @keltar:看看你的评论,你说“glRotate + glTranslate = 旋转,然后翻译”。该调用序列首先翻译,然后旋转。 opengl.org 上这些手册页的格式在我的浏览器中不起作用。但是,如果您查看msdn.microsoft.com/en-us/library/windows/desktop/…,它会说“也就是说,如果 M 是当前矩阵并且 T 是传递给 glMultMatrix 的矩阵,那么 M 将替换为 M • T”,如果将向量乘以右侧的列向量。所以在你的符号中,那是result = result * new_multiplier

以上是关于根据相机方向移动的主要内容,如果未能解决你的问题,请参考以下文章

A 帧沿相机方向向前移动

玩家相对于相机方向的移动 C#

OpenGL模拟波斯王子相机

如何将“相机”移动到玩家所面对方向的左/右

OpenGL,第一人称相机翻译

如何让角色转向相机的方向? [Unity3D]