OpenGL第一人称逼真键盘移动

cngwdvgl  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(182)

所以我在制作这款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我们在这里所做的是试图通过反向移动场景中的所有对象来模拟移动,给人一种我们正在移动的错觉。

3qpi33ja

3qpi33ja1#

要使相机停留在地面上,只需 * 不要上下移动相机 *。
是的,摄像机上下移动的部分?你是写代码的人。删掉。
你没有说这个Front矢量是从哪里来的。它来自一个考虑了俯仰和偏航的地方。删除俯仰部分。
你朋友的建议glm::vec3(glm::cos(Yaw), glm::sin(Yaw), 0)是一种只使用偏航角来计算Front的方法。
随着你的游戏越来越高级,你也可以实现跳跃和重力,所以玩家可以在有限的范围内上下移动。

bgtovc5b

bgtovc5b2#

我想感谢大家对我的帮助!我现在更好地理解了一切是如何工作的。我想在x-z平面上移动,y必须为零(是的,我选择了Y轴为“向上”或“天空”),因为我不希望相机向上或向下移动。所以当我前进时,我只想改变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;
    }

}

现在一切都很好!

相关问题