这是一个正确的视角FOV矩阵吗?

Nar*_*use 4 matrix fieldofview perspective

我有一个透视FOV,但是在旋转时,它看起来并不正确 - 更远的物体比更近的物体移动更快,将它们传递到屏幕中间.

那么:这是对的吗?使用右手坐标,如果重要吗?

    public static Matrix4x4 PerspectiveFOV(float fov, float aspect, float near, float far)
    {
        float yScale = 1.0F / (float)Math.Tan(fov / 2);
        float xScale = yScale / aspect;
        float farmnear = far - near;
        return new Matrix4x4(
            xScale, 0, 0, 0,
            0, yScale, 0, 0,
            0, 0, far / (farmnear), 1,
            0, 0, -near * (far / (farmnear)), 1
            );
    }
Run Code Online (Sandbox Code Playgroud)

谢谢.

Wil*_*ght 7

我看到了几个问题.首先,tan()的参数应该从度转换为弧度.

其次,OpenGL透视投影的公式与你的略有不同.如此处所述,它在分母中使用"近 - 远"而不是"远近".分子术语也不同.稍微修改你的函数并从Java转换为C,我生成了一个与gluPerspective()给出的投影矩阵相同的投影矩阵,如下所示:

static void my_PerspectiveFOV(double fov, double aspect, double near, double far, double* mret) {
    double D2R = M_PI / 180.0;
    double yScale = 1.0 / tan(D2R * fov / 2);
    double xScale = yScale / aspect;
    double nearmfar = near - far;
    double m[] = {
        xScale, 0, 0, 0,
        0, yScale, 0, 0,
        0, 0, (far + near) / nearmfar, -1,
        0, 0, 2*far*near / nearmfar, 0 
    };
    geom_matrix4_copy(m, mret);
}