我试图在栅格化3D点的过程中做一个简单的透视投影。这是所有的矩阵和其他信息。所有矩阵都是行主矩阵。坐标系为右手坐标系
相机在[0,0,-1]处,点在[0,0,0]处(对于矩阵运算w=1)
模型视图矩阵(凸轮矩阵的逆,即tx = 0;ty = 0;z = 1):
[1 0 0 tx]
[0 1 0 ty]
[0 0 1 tz]
[0 0 0 1 ]
透视矩阵:
[f/aspect,0,0,0]
0,f,0,0
0,0,-(near+far)/(near-far),2*far*near/(near-far)
0,0,1,0]
aspect等于1,因为视口是正方形的。远= 100,近= 0.1f = 1/tan(fovdegree *M_PI/360);
得到的矩阵是:
1.94445, 0, 0, 0
0, 1.944445, 0, 0
0, 0, 1.020202, -2.020202
0, 0, 1, 0
现在我将模型视图矩阵和投影矩阵应用于点向量然后我得到一个新的点Pv = {x,y,z,w}然后得到归一化坐标x' = x/w;Y ' = Y/w;z' = z/w;X '和y'总是在[-1,1]之间,只要该点在截锥体内。但z'就不是这样了。当点靠近相机时,z值呈指数增长。当点在[0,0,0]处时,z的值等于-1。
现在,我需要剪辑一些线,所以我需要z的值在[1,-1]之间。我想知道我的程序出了什么问题。谢谢你。
你所经历的是透视深度映射的非线性。对于截锥体投影矩阵,它遵循与视点距离有关的1/x定律。
编辑:再次检查你的矩阵:你把截锥体矩阵搞错了。正确的截锥体矩阵为
f/aspect, 0, 0, 0
0, f, 0, 0
0, 0, -(far+near)/(far-near), 2*far*near/(far-near)
0, 0, 1, 0
如果你接近原点,你仍然会遇到除以0的情况。只要把向量(0,0,0,1)放进去,结果就是(x=0,y=0,z=2*far*near/(far-near),w=0)在剪辑空间中。然后齐次除法{x,y,z}/(w=0)←爆发