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

LWJGL(鼠标支持)的第一人称相机

阚吕恭
2023-03-14

我正在用LWJGL开发一个3D游戏,我想添加一个支持鼠标的第一人称相机。我现在有一个,但它并不顺利,一点也不好用。我真的希望窗口也能聚焦,这样鼠标就可以启动,而不是在窗口上悬停。我如何实现这一点?

以下是我当前的摄像头实现:

public class Camera {

private Vector3f position = new Vector3f(0,5,0);
private float pitch = 10;
private float yaw;
private float roll;

private float speed = 0.2f;

public Camera() {

}

public void move() {

    yaw =  - (Display.getWidth() - Mouse.getX() / 4);
    pitch =  (Display.getHeight() / 1000) - Mouse.getY();

    if (pitch >= 90) {
        pitch = 90;
    }
    else if (pitch <= -90) {
        pitch = -90;
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_W)) {

        position.z += -(float)Math.cos(Math.toRadians(yaw)) * speed;
        position.x += (float)Math.sin(Math.toRadians(yaw)) * speed;

    }
    else if (Keyboard.isKeyDown(Keyboard.KEY_S)) {

        position.z -= -(float)Math.cos(Math.toRadians(yaw)) * speed;
        position.x -= (float)Math.sin(Math.toRadians(yaw)) * speed;

    }

    if (Keyboard.isKeyDown(Keyboard.KEY_D)) {

        position.z += (float)Math.sin(Math.toRadians(yaw)) * speed;
        position.x += (float)Math.cos(Math.toRadians(yaw)) * speed;

    }
    else if (Keyboard.isKeyDown(Keyboard.KEY_A)) {

        position.z -= (float)Math.sin(Math.toRadians(yaw)) * speed;
        position.x -= (float)Math.cos(Math.toRadians(yaw)) * speed;

    }

    if (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) {

        position.y -= speed;

    }

    if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)) {

        position.y += speed;

    }

    if (Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) {
        System.exit(0);
    }

}

public Vector3f getPosition() {
    return position;
}

public float getPitch() {
    return pitch;
}

public float getYaw() {
    return yaw;
}

public float getRoll() {
    return roll;
}

}

共有1个答案

宗鸿博
2023-03-14

在计算偏航和俯仰时,您正在进行整数除法,这很糟糕,因为结果也将是整数。要更改此设置,您只需使一个值像这样浮动:

yaw =  - (Display.getWidth() - Mouse.getX() / 4f);
pitch =  (Display.getHeight() / 1000f) - Mouse.getY();

现在,结果将更加精确。

虽然我建议使用此代码计算俯仰和偏航:

float rotationSpeed = 1.0; //You probably need to change this factor
yaw -= Mouse.getDX() / rotationSpeed;
pitch += Mouse.getDY() / rotationSpeed;

getDX/Y()返回自上次调用getDX/Y()以来x/Y轴上的移动。

如果你想专注于窗口,只需调用鼠标。设置抓取(true)。

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

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

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

  • 编辑:因为人们仍然从google登陆这里,你必须在OpenGL环境中调用每一个OpenGL方法。因此,在使用GL做任何事情之前,请确保您在一个上下文中。 我试图用lwjgl在我的屏幕上呈现一个简单的文本,但是每次都失败了!当我启动游戏时,它崩溃了,并向我抛出错误: 我需要使用现代openGL还是什么?我真的需要帮助

  • 我正在使用键盘上的箭头键实现一个第一人称相机,在场景中移动。当我只绕一个轴(X或Y)旋转时,它似乎工作正常,但是如果我绕两个轴旋转,它也会绕第三个轴Z旋转。我敢肯定,问题在于我的相机不是绕着全局轴旋转,而是绕着局部轴旋转,当我只需要偏航和俯仰时,就会产生“滚动”。在我的代码中,我从X和Y旋转推导出一个前向向量,存储在两个变量中。最相关的代码片段如下: 功能由功能补充: } 其中,相当于偏航,相当于

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