使相机同时移动和旋转的最佳方法

3
我正在学习OpenGL游戏编程,但我不知道如何实现让相机跟随鼠标指针移动。就像在第一人称射击游戏中,你想看向鼠标指向的方向,但是当我移动时,我找不到一个好的解决方案。我考虑保存一个矩阵用于移动,例如行走和横向移动,同时使用四元数处理旋转。然后将四元数转换为旋转矩阵,加载模型视图矩阵的标识,并将此矩阵与两个矩阵相乘。
当然,这种方法还存在一些问题,例如我们应该先使用哪个矩阵进行乘法运算,以及代码会变得很丑陋。
所以我想知道是否有人有好的解决方案来解决这个问题,以便我不必找出应该先使用哪个矩阵,同时使代码更加清晰。
2个回答

5

将相机的视图细节存储为位置向量、视图向量和上向量(想象一下伸出大拇指指向前方:食指是视图向量,拇指是上向量)。保持这些向量彼此正交并归一化。你应该能够看到这三个向量足以表示任何相机的位置和方向。

你可以使用这些向量将世界坐标转换为相机坐标:

  • 通过-position平移;
  • 绕(up-vector“叉乘”y轴)旋转-(up-vector和y轴之间的角度);
  • 绕up-vector旋转-(view-vector和z轴之间的角度)。

(我可能把其中一些符号弄反了)。

你可以随着用户移动鼠标来转换这些向量:

  • 当鼠标侧移时,围绕up-vector旋转view-vector(或者如果你愿意,围绕y轴旋转view-vector和up-vector)。
  • 当鼠标向后/向前移动时,围绕(view-vector“叉乘”up-vector)旋转view-vector和up-vector。

谢谢,看纸上的内容似乎会起作用。所以我迫不及待想要尝试实施它。 - martiert
我在这里遇到了一个问题,如何找到视角向量和鼠标在围绕上向量的单位球上的向量之间的角度?我不能只使用两个向量的点积,因为那会把它给出在世界空间坐标系中而不是相机坐标系中。 - martiert
你能澄清一下吗?我不确定你所说的“鼠标在单位矢量上的向量”是什么意思。鼠标和键盘只是修改了三个相机向量。 - stusmith
我发现了一篇可能有帮助的文章:http://www.gamedev.net/community/forums/topic.asp?topic_id=440585 - stusmith
啊啊啊...现在我有点明白了。我只是还被困在我的思维方式中,这并不太好:P感谢你的帮助。 - martiert

0

我对你的问题没有确切的解决方案,但我知道开源3D引擎Irrlicht有一个FPS相机,完全符合你所需求的,并且通常具有良好文档化的源代码。

你可以尝试查看Irrlicht中FPS相机的实现方式,或者你甚至可以直接在你的项目中使用Irrlicht;当我还在大学时,我使用它做了一些项目,总是非常顺利 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接