4

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

谢谢。

4

2 回答 2

8

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

其次,OpenGL中透视投影的公式和你的有点不同。正如这里所指定的,它在分母中使用“近-远”而不是“远-近”。分子项也不同。稍微修改您的函数并从 Java 转换为 C,我生成了一个与 gluPerspective() 给出的投影矩阵相同的投影矩阵,其内容如下:

静态无效my_PerspectiveFOV(双视场,双方面,双近,双远,双* mret){
    双 D2R = M_PI / 180.0;
    双 yScale = 1.0 / tan(D2R * fov / 2);
    双 xScale = yScale / 方面;
    double nearmfar = 近 - 远;
    双米[] = {
        xScale, 0, 0, 0,
        0, yScale, 0, 0,
        0, 0, (远 + 近) / nearmfar, -1,
        0, 0, 2*far*near / nearmfar, 0
    };
    geom_matrix4_copy(m, mret);
}
于 2012-05-25T17:15:27.317 回答
3

对于这样的问题,我会建议一个很好的资源: https ://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix 它确实涉及投影矩阵的细节. 它们是关于相机、构建相机光线等主题的更多课程。您需要进行一些挖掘。

于 2013-09-22T22:50:55.820 回答