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

rwb*_*rwb 5 opengl directx 3d projection perspective

我正在尝试在光栅化3D点的过程中进行简单的透视投影.这是所有的矩阵和其他信息.所有矩阵都是行专业.坐标系是Right Handed.

相机位于[0,0,-1],点位于[0,0,0](矩阵运算时w = 1)

模型视图矩阵(凸轮矩阵的逆,即tx = 0; ty = 0; tz = 1):

[1 0 0 tx]
[0 1 0 ty]
[0 0 1 tz]
[0 0 0 1 ]
Run Code Online (Sandbox Code Playgroud)

透视矩阵:

[f/aspect,0,0,0]
0,f,0,0
0,0,-(near+far)/(near-far),2*far*near/(near-far)
0,0,1,0]
Run Code Online (Sandbox Code Playgroud)

aspect等于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
Run Code Online (Sandbox Code Playgroud)

现在我将模型视图矩阵然后投影矩阵应用于点向量,然后我得到一个新点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]之间.我想知道我的手术有什么问题.谢谢.

dat*_*olf 3

您体验到的是透视深度映射的非线性。对于平截头体投影矩阵,这遵循距视点距离的 1/x 定律。

\n\n

编辑:

\n\n

只是仔细检查了你的矩阵:你的视锥体矩阵错了。正确的平截头体矩阵是

\n\n
f/aspect, 0,                      0,                     0\n0,        f,                      0,                     0\n0,        0, -(far+near)/(far-near), 2*far*near/(far-near)\n0,        0,                      1,                     0\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果你接近原点,你仍然会遇到被零除的情况。只需将向量 (0,0,0,1) 穿过那个东西,就会在剪辑空间中得到 (x=0,y=0,z=2*far*near/(far-near),w=0) 。然后同质除法 {x,y,z}/(w=0) \xe2\x86\x90 爆炸。

\n