如何实现FPS相机?

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

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

移动鼠标后,将使用三角学和矩阵旋转方向向量。 当然,所有矢量都被标准化以便于速度控制。

这是常见的和/或好的方式还是更容易/更好的方式?

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

您可以使用球面到直角坐标转换轻松计算forward矢量。 (pitch =纬度=φ,yaw =经度=θ)

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

然后, right向量是向前和向上向量的叉积。 它始终与地平面平行,因为向上矢量始终垂直于地平面。

然后左/右strafe键使用+/-right矢量。 对于平行于地平面的forward矢量,可以采用right向量和up向量的叉积。

对于GL部分,您可以使用玩家的原点,原点加forward矢量和up矢量来简单地使用gluLookAt()

哦,请,请添加“反转鼠标”选项。

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

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

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

相机实际上是在一款优秀游戏中制作的难度较大的部分之一。 这就是为什么开发人员通常满足于严重沉闷,​​固定的第1 /第3人同样的原因。

您可以使用四元数来进行相机旋转。 虽然我自己没有尝试过,但它们对避免万向节锁定非常有用。