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

时间:2011-05-19 14:23:49

标签: matrix perspective fieldofview

我有一个透视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
            );
    }

感谢。

2 个答案:

答案 0 :(得分:7)

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

其次,OpenGL中透视投影的公式与您的略有不同。根据指定here,它在分母中使用“near-far”而不是“far-near”。分子术语也不同。稍微修改你的函数并从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);
}

答案 1 :(得分:3)

对于像这样的问题,我建议一个很好的资源: http://scratchapixel.com/lessons/3d-advanced-lessons/perspective-and-orthographic-projection-matrix/ 它真正涉及投影矩阵的细节。他们是关于相机,构建相机光线等课程的更多课程。你需要做一些挖掘。