当前位置: 首页 > 知识库问答 >
问题:

OpenGL第一人称真实键盘运动

通俊发
2023-03-14

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

共有2个答案

荆鸿畅
2023-03-14

我要感谢所有帮助我的人!我现在更了解一切的运作方式。我想在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;
    }

}

现在一切都很好!

范振海
2023-03-14

为了让相机保持在地面上,不要上下移动。

是的,摄像机上下移动的部分?是你写的代码。删除它。

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

你朋友的建议glm::vec3(glm::cos(偏航),glm::sin(偏航),0)是一种只使用偏航计算前方的方法。

随着你的游戏越来越先进,你也可以实施跳跃和重力,所以玩家可以在有限的范围内上下移动。

 类似资料:
  • 我最近完成的opengl程序中有一个“相机”。然而,我注意到每当我旋转然后再次移动时,x、y和z的角度都会改变。例如,当我按下“w”键时,我沿着“z”轴向前移动。如果我然后旋转相机90度,当我按下“W”键时,我实际上会沿着“x”轴向右移动。为什么会发生这种情况是有道理的,我只是想知道为什么会发生。这是旋转函数: 键盘功能: 以及我的翻译功能: 有没有办法解决这个问题?

  • 我正在使用LWJGL和OpenGL 3.2为OpenGL编写java游戏引擎。每当移动鼠标旋转相机时,它都会添加滚动、俯仰和偏航。 摄像头代码 四元数代码

  • 该类是 FlyControls 的另一个实现。 例子 webgl / geometry / terrain 构造函数 FirstPersonControls( object : Camera, domElement : HTMLDOMElement ) object: 被控制的摄像机。 domElement: 用于事件监听的HTML元素。 创建一个新的 FirstPersonControls 实例

  • 我正在使用GLM库实现一个第一人称相机,它为我提供了一些有用的函数,可以计算透视和“注视”矩阵。我也在使用OpenGL,但这不会对代码产生影响。 在这张图片中,你可以看到四个摄像头的位置。标有1的是在运动之前,标有2的是在运动之后。红色三角形表示沿z轴笔直向前的相机。蓝色三角形代表一个相机,该相机已沿x轴(向左)旋转向后看。当我按下“向前移动键”时,相机在两种情况下都会沿z轴向前移动,而不考虑相机

  • 可以在 Illustrator 中使用键盘快捷键来提高工作效率。可以使用 Illustrator 中包含的默认快捷键,或添加和自定所需的快捷键。