gpt4 book ai didi

opengl - 透视分割后的 3D 投影问题 : Z Value doesn't lie in [1, -1]

转载 作者:行者123 更新时间:2023-12-02 02:22:51 26 4
gpt4 key购买 nike

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

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

模型 View 矩阵(凸轮矩阵的逆矩阵,即 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,因为视口(viewport)是正方形。远 = 100,近 = 0.1f = 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

现在我将模型 View 矩阵和投影矩阵应用于点向量,然后得到一个新点 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,1) 穿过那个东西,就会在剪辑空间中得到 (x=0,y=0,z=2*far*near/(far-near),w=0) 。然后同质除法 {x,y,z}/(w=0) ← 爆炸。

关于opengl - 透视分割后的 3D 投影问题 : Z Value doesn't lie in [1, -1],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5883523/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com