OpenGL第一人称逼真的键盘运动

OpenGL first person realistic keyboard movement

所以我正在制作这款 FPS 游戏,我想通过键盘输入向前、向后、向左和向右移动,并像在真正的 FPS 游戏(如《战地风云》)中那样用相机环顾四周。相机移动与键盘输入相结合效果很好,但现在我的相机可以飞来飞去。而且我只是希望能够像在战场游戏中一样在“地面”上前进,后退,左右移动,同时向上或向下看,而不是飞来飞去(就像无剪辑一样)。现在,如果我向下或向上看并在键盘上向前按,我可以“飞”,但我不希望这种情况发生。

我的一个朋友建议用这样的东西来前进。

Position += glm::vec3(glm::cos(Yaw), glm::sin(Yaw), 0) * velocity

而不是:

Position += Front * velocity;

但我不完全明白这是如何工作的?

这是当前的键盘输入代码:

void Camera::ProcessKeyboard(Camera_Movement direction, float deltaTime)
{
float velocity = MovementSpeed * deltaTime;
if (direction == FORWARD)
    Position += Front * velocity;
if (direction == BACKWARD)
    Position -= Front * velocity;
if (direction == LEFT)
    Position -= Right * velocity;
if (direction == RIGHT)
    Position += Right * velocity;
}

提示或帮助将不胜感激! 是的,此代码来自 LearnOpenGL.com 我们在这里做的是试图通过反向移动场景中的所有对象来模拟运动,给人一种我们正在移动的错觉。

要让相机保持在地面上,只需不要上下移动它

是啊,镜头上下移动的部分?您是编写该代码的人。删除它。

你没有说这个 Front 向量来自哪里。它来自一个考虑俯仰和偏航的地方。删除音调部分。

您朋友的建议 glm::vec3(glm::cos(Yaw), glm::sin(Yaw), 0) 是一种仅使用偏航计算 Front 的方法。

随着您的游戏变得更高级,您还可以实现跳跃和重力,这样玩家就可以在有限的范围内上下移动。

我要感谢大家帮助我!我现在更了解一切是如何运作的。我想在 x-z 平面内移动并且 y 必须为零(是的,我选择 Y-axis 作为“向上”或“天空”),因为我不希望相机向上移动或吃下。因此,当我继续前进时,我只想更改 glm 向量的 x 和 z 参数!

void Camera::ProcessKeyboard(Camera_Movement direction, float deltaTime)
{
    float velocity = MovementSpeed * deltaTime;
    if (direction == FORWARD) {
        // glm::vec3(X,Y,Z)!!! we only want to change the X-Z position
        Position += glm::vec3(glm::cos(glm::radians(Yaw)), 0, glm::sin(glm::radians(Yaw))) * velocity; //Y is not affected, Y is looking up
    }
    if (direction == BACKWARD) {
        // glm::vec3(X,Y,Z)!!! we only want to change the X-Z position
        Position -= glm::vec3(glm::cos(glm::radians(Yaw)), 0, glm::sin(glm::radians(Yaw))) * velocity; //Y is not affected, Y is looking up
    }
    if (direction == LEFT) {
        Position -= Right * velocity;
    }
    if (direction == RIGHT) {
        Position += Right * velocity;
    }

}

现在一切正常!