2014-03-12 81 views
0

我一直在試圖找出這種關係,但我不能,也許我只是沒有尋找正確的東西。如果我使用Vector3.Project投影世界空間座標來裁剪空間,則X和Y座標有意義,但我無法弄清楚它是如何計算Z(0..1)座標的。例如,如果我的近平面爲1,遠平面爲1000,則我將(0,0,500)的Vector3(相機中心,距離平面的距離的50%)投影到我獲得的屏幕空間(1050,500,.9994785)Direct3D中投影和未投影的Z值之間的關係

產生的X和Y座標是非常有意義的,但我不明白它在哪裏得到Z值。

我需要這個,因爲我實際上是在嘗試UNPROJECT屏幕空間座標,我需要能夠選擇一個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 

回答

1

標準透視投影創建場景深度和深度緩衝器值時,不是線性的一個之間的相互關係。這導致更高的緩衝精度百分比被應用到更接近近平面的對象上,而遠離平面的對象則更多。至於實際的數學,這裏的擊穿:

右下方的2x2的元件(對應於Z和W)的投影矩陣是:

[far/(far - near)  ] [1] 
[-far * near/(far - near)] [0] 

這意味着乘以z' = z * far/(far - near) - far * near/(far - near)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'') 
+0

謝謝!我最終解決了一個黑客,但這會讓我做對了。 – HypnoToad