我有一个透视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
);
}
感谢。
答案 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/ 它真正涉及投影矩阵的细节。他们是关于相机,构建相机光线等课程的更多课程。你需要做一些挖掘。