如何实现FPS相机?

时间:2009-08-27 16:16:33

标签: java math opengl jogl

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

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

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

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

4 个答案:

答案 0 :(得分:6)

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

您可以使用球形到直角坐标转换轻松计算forward向量。 (pitch = latitude =φ,yaw = longitude =θ)

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

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

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

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

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

编辑:Here是一个替代解决方案,摆脱89.9问题,在另一个问题中提出,其中涉及首先构建right向量(没有音高信息)然后{{1 }和forward

答案 1 :(得分:4)

是的,这基本上就像我一直看到的那样。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

您可以使用Quaternions进行相机旋转。虽然我自己没有尝试过,但它们对于避免gimbal lock很有用。