如何实现一个FPS相机?

12

我目前正在使用OpenGL(具体来说是JOGL)编写一些FPS游戏程序,只是出于兴趣。我想知道创建类似FPS相机的推荐方法是什么?

目前,我基本上有一个向量表示玩家面朝的方向,按下“w”或前进键时将其添加到当前玩家位置上。当然,该向量的负数用于“s”或后退键。对于“a”,左侧和“d”,右侧,我使用方向向量的法线。(我知道这会让玩家飞行,但目前并不是问题)

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

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

4个回答

7
我一直以来的做法是使用两个角度,偏航角和俯仰角。鼠标移动的两个轴对应于这些角度的变化。
你可以通过球坐标系到直角坐标系的转换轻松计算出前向量。 (俯仰角=纬度=φ, 偏航角=经度=θ)
你可以使用一个固定的上向量(比如(0,0,1)),但这意味着你不能直接向上或向下看。(大多数游戏通过允许你最多只能看89.999度来解决这个问题。)
右向量是前向量和上向量的叉积。由于上向量始终垂直于地面平面,因此它将始终与地面平行。
左/右平移键然后使用+/-右向量。对于一个与地面平面平行的前向量,你可以取右向量和上向量的叉积。
至于GL部分,你可以简单地使用gluLookAt(),使用玩家的原点、原点加上前向量和上向量。
哦,请添加一个“反转鼠标”选项。
编辑:这里提供了另一种解决89.9问题的替代方案,该问题在另一个问题中提出,其中涉及首先构建右向量(没有俯仰角信息),然后是前向量和上向量。

4

是的,这基本上是我一直以来所见过的方式。


好的,谢谢。只是想确保我没有漏掉任何东西。祝你有美好的一天! - Marc Müller

1

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

相机实际上是制作好游戏中比较困难的部分之一。这就是为什么开发者通常满足于一个非常乏味的、固定的第一/第三人称视角。


1
你可以使用 四元数 来控制相机旋转。虽然我自己没有试过,但它们非常有用,可以避免 万向锁 的问题。

1
万向节锁在FPS游戏中不会发生;事实上,将欧拉角与鼠标移动耦合是一种巨大的简化,没有任何风险。 - Jonas Byström
Jonas是正确的,只有在组合至少3个旋转时才存在万向节锁定的风险。你引用的文章是完全错误的。如果且仅如果使用欧拉变换,您可以通过矩阵和四元数来实现一些万向节锁定。修复它的方法只有两种,一些非线性处理极点奇异性或更容易用...四元数表达的非欧拉变换 :) - gouessej

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