C# Direct3D中投影和未投影Z值之间的关系
我一直在试图弄清楚这段关系,但我做不到,也许我只是没有寻找正确的东西。如果我使用Vector3.project投影一个世界空间坐标来剪裁空间,那么X和Y坐标是有意义的,但是我不知道它是如何计算Z(0..1)坐标的。例如,如果我的近平面是1,远平面是1000,我将一个向量3(0,0500)(相机中心,到远平面距离的50%)投影到我得到的屏幕空间(1050500,.9994785) 得到的X和Y坐标非常合理,但我不知道从哪里得到的Z值 我需要这个,因为我实际上正在尝试取消投影屏幕空间坐标,我需要能够选择一个Z值来告诉它我想要的世界空间坐标到相机的距离,但我不理解剪辑空间Z(0-1)和世界空间Z(近平面-远平面)之间的关系 如果这有帮助,我的转换矩阵是:C# Direct3D中投影和未投影Z值之间的关系,c#,vector,direct3d,projection,C#,Vector,Direct3d,Projection,我一直在试图弄清楚这段关系,但我做不到,也许我只是没有寻找正确的东西。如果我使用Vector3.project投影一个世界空间坐标来剪裁空间,那么X和Y坐标是有意义的,但是我不知道它是如何计算Z(0..1)坐标的。例如,如果我的近平面是1,远平面是1000,我将一个向量3(0,0500)(相机中心,到远平面距离的50%)投影到我得到的屏幕空间(1050500,.9994785) 得到的X和Y坐标非常合理,但我不知道从哪里得到的Z值 我需要这个,因为我实际上正在尝试取消投影屏幕空间坐标,我需要能够
World = Matrix.Identity;
//basically centered at 0,0,0 looking into the screen
View = Matrix.LookAtLH(
new Vector3(0,0,0), //camera position
new Vector3(0,0,1), //look target
new Vector3(0,1,0)); //up vector
Projection = Matrix.PerspectiveFovLH(
(float)(Math.PI / 4), //FieldOfViewY
1.6f, // AspectRatio
1, //NearPlane
1000); //FarPlane
标准透视投影会在场景深度和深度缓冲区值之间创建一个倒数关系,而不是线性关系。这会导致将更高百分比的缓冲区精度应用于距离近平面较近的对象,而不是距离远平面较近的对象,这通常是需要的。至于实际的数学计算,下面是细分: 投影矩阵的右下角2x2元素(对应于z和w)为:
[far / (far - near) ] [1]
[-far * near / (far - near)] [0]
这意味着相乘后,z'=z*far/(远-近)-远*近/(远-近)
和w'=z
。在这一步之后,是透视图分割,z'=z'/w'
在您的具体案例中,计算结果与您得到的值相符:
z = 500
z' = z * 1000 / (1000 - 999) - 1000 / (1000 - 999) = 499.499499499...
w' = z = 500
z'' = z' / w' = 0.998998998...
要恢复原始深度,只需反转操作:
z = (far / (far - near)) / ((far / (far - near)) - z'')
非常感谢。我最终决定进行黑客攻击,但这将允许我正确地进行攻击。