matrix - 这是一个正确的透视 FOV 矩阵吗?

标签 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
            );
    }

谢谢。

最佳答案

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

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

静态无效 my_PerspectiveFOV(双视野,双方面,双近,双远,双* mret){
双 D2R = M_PI/180.0;
双yScale = 1.0/tan(D2R * fov/2);
双 xScale = yScale/方面;
double Nearmfar = 近 - 远;
双 m[] = {
xScale, 0, 0, 0,
0, yScale, 0, 0,
0, 0, (远 + 近)/Nearmfar, -1,
0, 0, 2*far*near/nearmfar, 0
};
geom_matrix4_copy(m, mret);
}

关于matrix - 这是一个正确的透视 FOV 矩阵吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6060169/

相关文章:

java - 为 glsl 准备模型、 View 和投影矩阵

math - 在透视中计算 3D 对象的 2D 角度

android - 在 Android 上的某些情况下,将图像扭曲成四边形会失败

iPhone SDK - 获取/计算相机视野 (FOV)(增强现实)

arrays - 根据第一列中的标签将第二列中的元素相乘

matlab - MATLAB 中的通用分块对角矩阵

opengl - 计算 FOVX (openGL)

matlab - 来自坐标向量的二维逻辑矩阵(Basic matlab)

cocoa - 对所有 CALayer 元素应用相同的透视和旋转(与 Coverflow 不同)