Java 如何实现FPS摄像头?

Java 如何实现FPS摄像头?,java,math,opengl,jogl,Java,Math,Opengl,Jogl,因此,我目前正在OpenGL中进行一些FPS游戏编程(更具体地说是JOGL),只是为了好玩,我想知道创建类似FPS的相机的推荐方法是什么 目前,我基本上有一个玩家所面对方向的向量,当按下“w”或前进键时,它将被添加到当前玩家的位置。该向量的负数当然用于“s”或后退键。对于“a”,左边和“d”,右边我使用方向向量的法线。(我知道这会让玩家飞起来,但目前这不是问题) 移动鼠标后,将使用三角和矩阵旋转方向向量。当然,所有矢量都是标准化的,以便于速度控制 这是一种常见的和/或好的方法,还是有一种更简单/

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

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

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


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

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

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

在一个好的游戏中,相机实际上是比较难制作的部分之一。这就是为什么开发人员通常满足于一个非常单调、固定的第一/第三人称同上。

你可以用它来旋转相机。虽然我自己没有试过,但它们对避免这种情况很有用。

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

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

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

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

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

至于GL部分,您可以简单地使用
gllookat()
使用播放器的原点,原点加上
向前
向量和
向上
向量

哦,还有,请添加一个“反转鼠标”选项


编辑:“这是另一个解决89.9问题的替代方案,在另一个问题中被问到,这涉及到首先构建
向量(没有音高信息),然后
向前
向上

好的,谢谢。只是想确保我没有遗漏任何东西。祝您有个美好的一天!框架锁不能发生在FPS中;事实上,将Euler角度与鼠标移动相耦合是一个大规模的简化,没有任何风险。Jonas是对的,当你组合至少3次旋转时,只有框架锁定的风险。你引用的文章完全错了。当且仅当使用欧拉变换时,可以使用矩阵和四元数的万向节锁。解决这一问题的方法只有两种,一种是对极点上奇异点的非线性处理,另一种是对非欧拉变换的非线性处理,这两种处理方法更易于用计算机表达。。。四元数:)