12

所以我目前正在OpenGL(更具体地说是JOGL)中进行一些FPS游戏编程,只是为了好玩,我想知道创建类似FPS的相机的推荐方法是什么?

目前我基本上有一个玩家面向的方向的向量,当按下“w”或前进键时,它将被添加到当前玩家的位置。该向量的负数当然用于“s”或后退键。对于 "a"、left 和 "d",right 我使用方向向量的法线。(我知道这会让玩家飞起来,但目前这不是问题)

移动鼠标时,方向矢量将使用三角函数和矩阵进行旋转。当然,所有矢量都经过标准化以便于速度控制。

这是常见的和/或好的方法还是有更简单/更好的方法?

4

4 回答 4

7

一直看到它完成的方式是使用两个角度,偏航和俯仰。鼠标移动的两个轴对应于这些角度的变化。

forward您可以通过球面到矩形坐标变换轻松计算矢量。(俯仰=纬度=φ,偏航=经度=θ)

您可以使用固定up向量(例如 (0,0,1)),但这意味着您不能直接向上或向下看。(大多数游戏通过让你看起来不超过 89.999 度来解决这个问题。)

right向量是前向向量和向上向量的叉积。它总是平行于地平面,因为向上矢量总是垂直于地平面。

左/右扫射键然后使用+/-right向量。对于forward平行于地平面的向量,您可以取rightup向量的叉积。

至于GL部分,你可以简单地使用gluLookAt()玩家的原点,原点加上forward向量和up向量。

哦,拜托,请添加一个“反转鼠标”选项。

编辑:是摆脱 89.9 问题的替代解决方案,在另一个问题中提出,这涉及right首先构建向量(没有音高信息),然后是forwardand up

于 2009-08-28T14:43:53.633 回答
4

是的,这基本上就是我一直看到的方式。

于 2009-08-27T16:24:06.710 回答
1

是的,但最后你会想要为相机添加各种其他属性。拼写 n00b:如果您想模仿 Quake 或 CS,请保持整洁。最后可能会有bobing、FoV、运动过滤、网络延迟暂停等等。

相机实际上是一款好游戏中最难制作的部分之一。这就是为什么开发人员通常满足于非常沉闷、固定的第一/第三人称。

于 2009-08-27T16:48:49.170 回答
1

您可以使用四元数进行相机旋转。虽然我自己没有尝试过,但它们对于避免云台锁定很有用。

于 2009-08-27T17:10:38.003 回答