我试图在光栅化3D点的过程中进行简单的透视投影。这是所有的矩阵和其他信息。所有矩阵都是行专业。坐标系是右手。
相机位于[0,0,-1],点位于[0,0,0](矩阵运算时w = 1)
模型视图矩阵(Cam矩阵的逆,即tx = 0; ty = 0; tz = 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]
由于视口是方形,因此方面等于1。远= 100且接近= 0.1 f = 1 / tan(fovDegress * 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 / w;和z' = z / w; X'和y'只要该点在平截头体中,它总是位于[-1,1]之间。但z'的情况并非如此。随着接近相机的点,z'值呈指数增长。当点位于[0,0,0] z'值等于-1。
现在,我需要修剪一些线条,所以我需要z'值介于[1,-1]之间。我想知道我的手术有什么问题。谢谢。
答案 0 :(得分:3)
您所经历的是透视深度映射的非线性。对于平截头体投影矩阵,它遵循距离视点距离的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,1)放在那个东西上,这会在剪辑空间中产生(x = 0,y = 0,z = 2 * far * near /(far-near),w = 0) 。然后均匀分裂{x,y,z} /(w = 0)←爆炸。