3D投影问题:Z值在透视分割后不在[1,-1]中

时间:2011-05-04 12:40:18

标签: opengl directx 3d projection perspective

我试图在光栅化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]之间。我想知道我的手术有什么问题。谢谢。

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)←爆炸。