java - 如何实现 FPS 相机?

标签 java math opengl jogl

所以我目前正在 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 ,您可以取 rightup vector 的叉积。

至于 GL 部分,您可以简单地使用 gluLookAt() 使用玩家的原点,原点加上 forward vector 和 up vector 。

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

编辑:Here这是摆脱 89.9 问题的替代解决方案,在另一个问题中提出,它涉及首先构建 right vector (没有音调信息),然后 forward向上

关于java - 如何实现 FPS 相机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1342149/

相关文章:

java - 穿过迷宫时出现堆栈溢出错误

java - 无法将中文字符写入文件名

objective-c - 使 Cocoa 窗口全屏显示

OpenGL 聚光灯与 Cg

c++ - 在运行时从 OpenGL 上下文切换到 D3D/DX 上下文(或其他上下文)

java - 直接在玻璃板上绘图 : not working

java - 关于 Java 中线程的说明

java - 赋值,但仅限于正数 - 无条件

c++ - 叉积的输出

php:在 "echo"内部执行数学运算。还将变量名传递给函数