【问题标题】:A First Person Style Camera for LWJGL (Mouse Support)用于 LWJGL 的第一人称相机(鼠标支持)
【发布时间】:2017-10-06 19:35:16
【问题描述】:

我正在使用 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;
}

}

【问题讨论】:

    标签: java camera lwjgl frame-rate


    【解决方案1】:

    在计算偏航角和俯仰角时,你正在做整数除法,这很糟糕,因为结果也是整数。要更改这一点,您只需将一个值设为浮点数,如下所示:

    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 轴上的移动。

    如果你想专注于窗口,只需调用 Mouse.setGrabbed(true)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多