相机旋转错误

时间:2014-10-11 13:24:47

标签: java camera

这使用了lwjgl库。

在这个3D引擎中,我创建了一个相机,它移动得很好,但旋转非常糟糕。首先,向左和向右斜向下,向上和向下移动,使物体伸展。

我使用相机的所有旋转代码:

public Vector3f rotate(float angle, Vector3f axis)
    {
        float sinHalfAngle = (float)Math.sin(Math.toRadians(angle / 2));
        float cosHalfAngle = (float)Math.cos(Math.toRadians(angle / 2));

        float rX = axis.getX() * sinHalfAngle;
        float rY = axis.getY() * sinHalfAngle;
        float rZ = axis.getZ() * sinHalfAngle;
        float rW = cosHalfAngle;

        Quaternion rotation = new Quaternion(rX, rY, rZ, rW);
        Quaternion conjugate = rotation.conjugate();

        Quaternion w = rotation.mul(this).mul(conjugate);

        x = w.getX();
        y = w.getY();
        z = w.getZ();


        return this;
    }

无法记住这是否与旋转有关,但对于相机而言

public Matrix4f ititProjection(float fov, float width, float height, float zNear, float zFar)
    {   
        float ar = width/height;
        float tanHalfFOV = (float)Math.tan(Math.toRadians(fov / 2));
        float zRange = zNear - zFar;

        m[0][0] = 1.0f / (tanHalfFOV * ar); m[0][1] = 0;                  m[0][2] = 0;                      m[0][3] = 0;
        m[1][0] = 0;                        m[1][1] =  1.0f / tanHalfFOV; m[1][2] = 0;                      m[1][3] = 0;
        m[2][0] = 0;                        m[2][1] = 0;                  m[2][2] = (-zNear - zFar)/zRange; m[2][3] = 2 * zFar * zNear / zRange;
        m[3][0] = 0;                        m[3][1] = 0;                  m[3][2] = 1;                      m[3][3] = 0;

        return this;
    }

    public Matrix4f initCamera(Vector3f forward, Vector3f up)
    {
        Vector3f f = forward;
        f.normalize();

        Vector3f r = up;
        r.normalize();
        r = r.cross(f);

        Vector3f u = f.cross(r);

        m[0][0] = r.getX(); m[0][1] = r.getY(); m[0][2] = r.getZ(); m[0][3] = 0;
        m[1][0] = u.getX(); m[1][1] = u.getY(); m[1][2] = r.getZ(); m[1][3] = 0;
        m[2][0] = f.getX(); m[2][1] = f.getY(); m[2][2] = f.getZ(); m[2][3] = 0;
        m[3][0] = 0;        m[3][1] = 0;        m[3][2] = 0;        m[3][3] = 1;

            return this;
    }

0 个答案:

没有答案