【问题标题】:Camera movement according to rotation along the y axis沿 y 轴旋转的相机移动
【发布时间】:2019-03-29 14:57:01
【问题描述】:

位置沿 x 和 z 轴很好地更新。但是当我转动它时它停止工作;

https://streamable.com/2eabe

我尝试重新编写结构,但没有成功。

private static final float RUN_SPEED = 20;
private static final float TURN_SPEED = 20;

private float currentSpeed = 0;
private float currentSidewaysSpeed = 0;
private float currentTurnSpeed = 0;

public void checkInputs(){
    if(Keyboard.isKeyDown(Keyboard.KEY_W)) {
        this.currentSpeed = -(RUN_SPEED);
    }else if(Keyboard.isKeyDown(Keyboard.KEY_S)) {
        this.currentSpeed = RUN_SPEED/2;
    }else{
        this.currentSpeed = 0;
    }

    if(Keyboard.isKeyDown(Keyboard.KEY_D)){
        this.currentTurnSpeed = -TURN_SPEED;
    }else if(Keyboard.isKeyDown(Keyboard.KEY_A)){
        this.currentTurnSpeed = TURN_SPEED;
    }else{
        this.currentTurnSpeed = 0;
    }

}

public void move(){
    checkInputs();
    float xDistance = currentSpeed * MainGameHandler.getFrameTimeSeconds();
    float zDistance = currentTurnSpeed * MainGameHandler.getFrameTimeSeconds();
    float distance = xDistance + zDistance;
    float dx = (float) (xDistance * Math.sin(Math.toRadians(-getRotY())));
    float dz = (float) (zDistance * Math.sin(Math.toRadians(-getRotY())));
    System.out.println(dx + " " + dz);
    increasePosition(dx, 0, dz);
}

假设是在任何方向上工作。我 99.9% 确信我遗漏了一两行代码。提前感谢您的帮助

【问题讨论】:

  • 想想吧。当你旋转 0°,即 getRotY() 为 0 时,sin(0°) 会是什么?是的,0。这意味着 dx 和 dz 都将为 0,您将无法移动到任何地方。只有当您旋转 90° 或 270° 时,您才能全速移动。您需要将一个 sin() 更改为 cos(),这样当您旋转时一个分量减小,另一个分量会增大。
  • 你推荐哪一个?? ??????

标签: camera lwjgl


【解决方案1】:

好吧,我用旧运动中的一些代码弄清楚了,这是最终版本:

private static final float RUN_SPEED = 20;
private static final float TURN_SPEED = 20;

private float currentSpeed = 0;
private float currentSidewaysSpeed = 0;
private float currentTurnSpeed = 0;

public void checkInputs(){
    if(Keyboard.isKeyDown(Keyboard.KEY_A)) {
        this.currentSpeed = -(RUN_SPEED);
    }else if(Keyboard.isKeyDown(Keyboard.KEY_D)) {
        this.currentSpeed = RUN_SPEED;
    }else{
        this.currentSpeed = 0;
    }

    if(Keyboard.isKeyDown(Keyboard.KEY_W)){
        this.currentTurnSpeed = -TURN_SPEED;
    }else if(Keyboard.isKeyDown(Keyboard.KEY_S)){
        this.currentTurnSpeed = TURN_SPEED/2;
    }else{
        this.currentTurnSpeed = 0;
    }

}

public Vector3f move(){
    Vector4f movement = new Vector4f();
    Vector3f position = new Vector3f();
    checkInputs();
    float xDistance = currentSpeed * MainGameHandler.getFrameTimeSeconds();
    float zDistance = currentTurnSpeed * MainGameHandler.getFrameTimeSeconds();
    float distance = xDistance + zDistance;
    float dx = xDistance;
    float dz = zDistance;
    System.out.println(dx + " " + dz);
    movement.x += dx;
    movement.z += dz;
    Matrix4f invertedViewMatrix = new Matrix4f();
    Matrix4f.invert(viewMatrix,invertedViewMatrix);
    Matrix4f.transform(invertedViewMatrix,movement,movement);
    position.x+=movement.x;
    position.z+=movement.z;
    return position;
}

只是为所有也开始使用 opengl lwjgl 并需要帮助的人发帖 =)

【讨论】:

    猜你喜欢
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多