【问题标题】:Is this a correct perspective FOV matrix?这是一个正确的视角 FOV 矩阵吗?
【发布时间】:2011-08-28 22:41:10
【问题描述】:

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

谢谢。

【问题讨论】:

标签: matrix perspective fieldofview


【解决方案1】:

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

其次,OpenGL中透视投影的公式和你的有点不同。正如here 所指定的那样,它在分母中使用“近 - 远”而不是“远 - 近”。分子项也不同。稍微修改你的函数并从 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); }

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多