【问题标题】:How would one implement an FPS camera?如何实现 FPS 相机?
【发布时间】:2009-08-27 16:16:33
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java math opengl jogl


    【解决方案1】:

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

    您可以通过球面到矩形的坐标变换轻松计算forward 向量。 (俯仰=纬度=φ,偏航=经度=θ)

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 好的,谢谢。只是想确保我没有遗漏任何东西。祝你有美好的一天!
      【解决方案3】:

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

      相机实际上是一款好游戏中最难制作的部分之一。这就是为什么开发人员通常会满足于非常枯燥、固定的第一/第三人称。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • FPS 不会发生云台锁定;事实上,将欧拉角与鼠标移动相结合是一种巨大的简化,没有任何风险。
        • Jonas 是对的,至少组合 3 次旋转时,只有云台锁定的风险。你引用的文章完全是错误的。当且仅当您使用欧拉变换时,您可以使用矩阵和四元数进行万向节锁定。只有两种方法可以解决这个问题,对极点上的奇点或非欧拉变换进行一些非线性处理,这些更容易用...四元数表示:)
        猜你喜欢
        • 2014-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-24
        • 2012-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多