所以我目前正在 OpenGL(更具体地说是 JOGL)中编写一些 FPS 游戏编程只是为了好玩,我想知道创建类 FPS 相机的推荐方法是什么?
目前我基本上有一个玩家面向方向的 vector ,按下“w”或前进键后,它将添加到当前玩家位置。该 vector 的负数当然用于“s”或向后键。对于“a”、左和“d”,我使用方向 vector 的法线。 (我知道这会让玩家飞起来,但目前这不是问题)
移动鼠标时,方向 vector 将使用三角函数和矩阵进行旋转。当然,所有 vector 都经过归一化以便于控制速度。
这是常见的和/或好的方法还是有更简单/更好的方法?
最佳答案
我一直看到的做法是使用两个角度,偏航角和俯仰角。鼠标移动的两个轴对应于这些角度的变化。
您可以使用球坐标到直角坐标变换轻松计算前向
vector 。 (pitch=latitude=φ, yaw=longitude=θ)
您可以使用固定的 up
vector (比如 (0,0,1)),但这意味着您不能直接向上或向下看。 (大多数游戏通过允许您看起来不超过 89.999 度来解决这个问题。)
right
vector 是前向 vector 和向上 vector 的叉积。它将始终平行于地平面,因为向上 vector 始终垂直于地平面。
左/右扫射键然后使用 +/-right
vector 。对于平行于地平面的 forward
vector ,您可以取 right
和 up
vector 的叉积。
至于 GL 部分,您可以简单地使用 gluLookAt()
使用玩家的原点,原点加上 forward
vector 和 up
vector 。
哦,拜托,请添加“反转鼠标”选项。
编辑:Here这是摆脱 89.9 问题的替代解决方案,在另一个问题中提出,它涉及首先构建 right
vector (没有音调信息),然后 forward
和 向上
。
关于java - 如何实现 FPS 相机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1342149/