投影轉換

投影轉換可控制相機內部項目,例如選擇相機的功能濾鏡。 這是三大轉換類型中最複雜的轉換。

投影矩陣通常為比例和透視圖投影。 投影轉換會將檢視範圍轉換為長方體形狀。 由於檢視範圍的近端會小於遠端,這會產生擴大接近相機之物件的效果;這也是將透視圖套用至場景的方式。

檢視範圍中,相機和檢視轉換空間原點之間的距離會透過任意方式定義為 D,因此,轉換矩陣會如下圖所示。

illustration of the projection matrix

檢視矩陣會透過將朝著 z 方向轉譯 - D 的方式,將相機轉譯為原點。轉譯矩陣會如下圖所示。

illustration of the translation matrix

將轉譯矩陣乘以投影矩陣 (T*P),即可得出複合投影矩陣,如下圖所示。

illustration of the composite projection matrix

透視圖轉換會將檢視範圍轉換為新的座標空間。 請注意,範圍會變成長方體,而且原點會從場景的右上角移動至中央,如下圖所示。

diagram of how the perspective transform changes the viewing frustum into a new coordinate space

在透視圖轉換中,x 和 y 方縣的上限為 -1 和 1。 而 z 方向在前方平面中的上限為 0,在後方平面中則為 1。

這個矩陣會根據相機至近裁剪平面的指定距離來轉譯和縮放物件,但不會將視野 (fov) 列入考量,此外,它針對遠處多個物件所產生的 z 值可能大同小異,導致難以進行深度比較。 下列矩陣會解決上述問題,並調整頂點以因應檢視器的長寬比,因此為透視圖投影的理想選擇之一。

illustration of a matrix for the perspective projection

在這個矩陣中,Zₙ 為近裁剪平面的 z 值。 變數 w、h 和 Q 具有下列意義。 請注意,fovw 和 fovₖ 代表檢視區的水平和垂直視野,單位為弧度。

equations of the variable meanings

針對您的應用程式,使用視野角度來定義 x 和 y 縮放係數,可能不像使用檢視區水平和垂直維度 (在相機空間中) 那麼方便。 在數學運算完成後,以下兩個 w 和 h 方程式會使用檢視區的維度,且等同先前的方程式。

equations of the w and h variable meanings

在這些公式中,Zₙ 代表近裁剪平面的位置,而 Vw 和 Vₕ 變數則代表檢視區在相機空間中的寬度和長度。

無論您決定使用哪個公式,請務必將 Zₙ 的值設成越大越好,因為極度靠近相機的 z 值並不會有太大的差異。 這會讓使用 16 位元 Z 緩衝區的深度比較變得有點複雜。

適合 w 的投影矩陣

Direct3D 可以使用已透過世界、檢視和投影矩陣轉換的頂點 w 元件,在深度緩衝區或霧效果中執行以深度為基礎的計算。 這類型的計算會要求您使用投影矩陣正規化 w,好讓其等於世界空間的 z。 簡而言之,如果您的投影矩陣包含一個不是 1 的 (3,4) 係數,則您必須使用 (3,4) 係數的反項來縮放所有係數,以產生適當的矩陣。 如果沒有提供相容的矩陣,就無法正確套用霧效果和深度緩衝。

下圖顯示不相容的投影矩陣,以及相同的矩陣透過縮放,以啟用與眼睛相關的霧效果。

illustrations of a noncompliant projection matrix and a matrix with eye-relative fog

上述矩陣會假設所有變數都為非零。 如需 W 架構深度緩衝的詳細資訊,請參閱深度緩衝區

Direct3D 會在自身的 W 架構深度計算中使用目前設定的投影矩陣。 有鑑於此,應用程式必須設定相容的投影矩陣,才能收到想要的 W 架構功能,即使不使用 Direct3D 進行轉換也一樣。

轉換