1

私の 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に何か問題がありますか?

編集:これがlookAtです。cameraPosition、cameraDirection、および 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);
    }
4

0 に答える 0