C# Direct3D中投影和未投影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值 我需要这个,因为我实际上正在尝试取消投影屏幕空间坐标,我需要能够

我一直在试图弄清楚这段关系,但我做不到,也许我只是没有寻找正确的东西。如果我使用Vector3.project投影一个世界空间坐标来剪裁空间,那么X和Y坐标是有意义的,但是我不知道它是如何计算Z(0..1)坐标的。例如,如果我的近平面是1,远平面是1000,我将一个向量3(0,0500)(相机中心,到远平面距离的50%)投影到我得到的屏幕空间(1050500,.9994785)

得到的X和Y坐标非常合理,但我不知道从哪里得到的Z值

我需要这个,因为我实际上正在尝试取消投影屏幕空间坐标,我需要能够选择一个Z值来告诉它我想要的世界空间坐标到相机的距离,但我不理解剪辑空间Z(0-1)和世界空间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'')

非常感谢。我最终决定进行黑客攻击,但这将允许我正确地进行攻击。