Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java lwjgl(OpenGL)摄像机旋转不正确_Java_Opengl_Lwjgl_Trigonometry - Fatal编程技术网

Java lwjgl(OpenGL)摄像机旋转不正确

Java lwjgl(OpenGL)摄像机旋转不正确,java,opengl,lwjgl,trigonometry,Java,Opengl,Lwjgl,Trigonometry,My Camera类具有以下方法: public void strafeLeft(float speed){ cameraPosition = Vector3f.add(cameraPosition, new Vector3f(-cameraRight.x * speed, -cameraRight.y * speed, -cameraRight.

My Camera类具有以下方法:

public void strafeLeft(float speed){
        cameraPosition = Vector3f.add(cameraPosition, 
                new Vector3f(-cameraRight.x * speed, 
                        -cameraRight.y * speed, 
                        -cameraRight.z * speed), 
                        null);
        lookAt(cameraPosition, Vector3f.add(cameraPosition, cameraDirection, null), up);
    }

    public void strafeRight(float speed){
        cameraPosition = Vector3f.add(cameraPosition, 
                new Vector3f(cameraRight.x * speed, 
                        cameraRight.y * speed, 
                        cameraRight.z * speed), 
                        null);
        lookAt(cameraPosition, Vector3f.add(cameraPosition, cameraDirection, null), up);
    }

    public void moveForwards(float speed){
        cameraPosition = Vector3f.add(cameraPosition, 
                new Vector3f(cameraDirection.x * speed, 
                        cameraDirection.y * speed, 
                        cameraDirection.z * speed), 
                        null);
        lookAt(cameraPosition, Vector3f.add(cameraPosition, cameraDirection, null), up);
    }

    public void moveBackwards(float speed){
        cameraPosition = Vector3f.add(cameraPosition, 
                new Vector3f(-cameraDirection.x * speed, 
                        -cameraDirection.y * speed, 
                        -cameraDirection.z * speed), 
                        null);
        lookAt(cameraPosition, Vector3f.add(cameraPosition, cameraDirection, null), up);
    }

    public void rotateCamera(int deltaX, int deltaY){
        cameraVerticalAngle -= deltaY * cameraSensitivity;
        cameraHorizontalAngle += deltaX * cameraSensitivity;

        cameraDirection.x = (float)(Math.cos(cameraVerticalAngle) * Math.sin(cameraHorizontalAngle));
        cameraDirection.y = (float)(Math.sin(cameraVerticalAngle));
        cameraDirection.z = (float)(Math.cos(cameraVerticalAngle) * Math.cos(cameraHorizontalAngle));

        cameraRight.x = (float)(Math.sin(cameraHorizontalAngle - 3.14f/2.0f));
        cameraRight.y = (float)(Math.sin(cameraVerticalAngle));
        cameraRight.z = (float)(Math.cos(cameraHorizontalAngle - 3.14f/2.0f));

        up = Vector3f.cross(cameraRight, cameraDirection, null);

        lookAt(cameraPosition, Vector3f.add(cameraPosition, cameraDirection, null), up);
    }
使用测试客户机,我得到了非常奇怪的行为,这更容易用图像来解释。一个立方体被渲染到屏幕上,相机可以用WASD和鼠标四处移动和旋转

问题是,当相机向右旋转时,相机位置似乎已移动或模型位置已移动

我不知道为什么会这样。我在模型矩阵中使用了一个单位矩阵,所以我猜这是我的视图矩阵的一个问题,但我不知道为什么。。。rotateCamera有什么问题吗

编辑:看这里。因为cameraPosition、CameradDirection和up都是类变量,所以我已经去掉了lookAt中的参数

public void lookAt() {
        Vector3f f = normalize(cameraDirection); 
        Vector3f s = normalize(cameraRight); 
        Vector3f u = normalize(up); 

        Matrix4f result = new Matrix4f();

        result.m00 = s.x;
        result.m10 = s.y;
        result.m20 = s.z;
        result.m01 = u.x;
        result.m11 = u.y;
        result.m21 = u.z;
        result.m02 = -f.x;
        result.m12 = -f.y;
        result.m22 = -f.z;


        viewMatrix = Matrix4f.translate(new Vector3f(-cameraPosition.x, -cameraPosition.y, -cameraPosition.z),  result, null);
    }

你看这个方法做什么?谢谢你的回复!我已经在帖子中添加了要查看的代码。我是否正确,当你向右移动鼠标时,它会向左移动,当你向左移动鼠标时,它会向右移动?不,没有发生这种情况,控件没有反转。您注意到我的代码中有什么奇怪的地方吗?您需要将cameraPosition与CameradDirection相乘,而不是将它们相加。