所以我目前正在开发OpenGL中的一些FPS游戏编程(JOGL,更具体地说)只是为了好玩,我想知道创建类似FPS的摄像机的推荐方法是什么?
目前我基本上有一个玩家面向方向的矢量,按下“w”或前进键后,它将被添加到当前玩家位置。该向量的负数当然用于“s”或后向键。对于“a”,left和“d”,右边我使用方向向量的法线。 (我知道这会让玩家飞起来,但目前这不是问题)
移动鼠标时,方向矢量将使用三角函数和矩阵旋转。当然,所有矢量都被标准化以便于速度控制。
这是常见的和/或好的方式还是有更简单/更好的方式?
答案 0 :(得分:6)
I 总是看到它完成的方式是使用两个角度,偏航和俯仰。鼠标移动的两个轴对应于这些角度的变化。
您可以使用球形到直角坐标转换轻松计算forward
向量。 (pitch = latitude =φ,yaw = longitude =θ)
您可以使用固定的up
向量(例如(0,0,1)),但这意味着您无法直接向上或向下查看。 (大多数游戏通过让你看起来不比89.999度更陡峭来解决这个问题。)
right
向量是向前和向上向量的叉积。它始终与地平面平行,因为向上矢量始终垂直于地平面。
左/右strafe键然后使用+/-right
向量。对于与地平面平行的forward
向量,您可以采用right
和up
向量的叉积。
至于GL部分,你可以使用玩家的原点,原点加上gluLookAt()
向量和forward
向量来使用up
。
哦,拜托,请添加“反转鼠标”选项。
编辑:Here是一个替代解决方案,摆脱89.9问题,在另一个问题中提出,其中涉及首先构建right
向量(没有音高信息)然后{{1 }和forward
。
答案 1 :(得分:4)
是的,这基本上就像我一直看到的那样。
答案 2 :(得分:1)
是的,但最后你会想要为相机添加各种其他属性。拼写n00b:如果你想模仿Quake或CS,请保持整洁。最终可能有bobing,FoV,运动过滤,网络延迟暂停等等。
相机实际上是在一款优秀游戏中制作的难度较大的部分之一。这就是为什么开发人员通常满足于认真沉闷,固定的第一/第三人同样的原因。
答案 3 :(得分:1)
您可以使用Quaternions进行相机旋转。虽然我自己没有尝试过,但它们对于避免gimbal lock很有用。