5

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

相机在 [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 ]

透视矩阵:

[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.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' = y/w; z' = z/w; x' 和 y' 始终位于 [-1,1] 之间,只要该点位于平截头体中。但 z' 的情况并非如此。随着该点靠近相机,z' 值呈指数增长。当点位于 [0,0,0] 时,z' 值等于 -1。

现在,我需要剪掉一些线,所以我需要 z' 值介于 [1,-1] 之间。我想知道我的程序有什么问题。谢谢你。

4

1 回答 1

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

于 2011-05-04T14:32:25.617 回答