共用方式為


投影轉換 (Direct3D 9)

您可以將投影轉換視為控制相機內部:這類似於為相機選擇鏡頭。 這是三種轉換類型中最複雜的。 投影轉換的討論會組織成下列主題。

投影矩陣通常是縮放比例和透視投影。 投影轉換會將檢視 frustum 轉換成小行星圖形。 由於檢視 Frustum 的接近尾端小於遠端,因此其效果是展開靠近相機的物件:這就是將檢視方塊套用至場景的方式。

檢視 frustum中,相機與檢視轉換空間原點之間的距離會任意定義為 D,因此投影矩陣看起來像下圖。

投影矩陣圖例

檢視矩陣會藉由 - D 在 z 方向轉譯,將相機轉譯為原點。轉譯矩陣如下圖所示。

翻譯矩陣圖例

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

複合投影矩陣 圖例

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

檢視方塊如何將檢視範圍轉換成新座標空間的圖表

在檢視方塊轉換中,x 和 y 方向的限制 -1 和 1。 z 方向的限制為0,前平面為0,後平面為1。

這個矩陣會根據從相機到接近裁剪平面的指定距離來轉譯和縮放物件,但不會考慮檢視範圍(fov),以及針對距離中對象產生的 z 值幾乎相同,使得深度比較變得困難。 下列矩陣會解決這些問題,並調整頂點以考慮檢視區的外觀比例,使其成為檢視方塊投影的絕佳選擇。

檢視方塊投影矩陣的 圖例

在此矩陣中,Zn 是接近裁剪平面的 z 值。 變數 w、h 和 Q 具有下列意義。 請注意,fovw 和 fovk 代表檢視區的水準和垂直檢視欄位,以弧度為單位。

變數的 方程式表示

針對您的應用程式,使用視野角度來定義 x 和 y 縮放係數可能不像使用檢視區的水準和垂直維度(在相機空間中)那麼方便。 當數學運算完成時,w 和 h 的下列兩個方程式會使用檢視區的維度,而且相當於上述方程式。

w 和 h 變數的 方程式表示

在這些公式中,Zn 代表接近裁剪平面的位置,而 Vw 和 Vh 變數則代表相機空間中檢視區的寬度和高度。

對於C++應用程式,這兩個維度會直接對應至 D3DVIEWPORT9 結構的 Width 和 Height 成員。

無論您決定使用何種公式,請務必將 Zn 設定為盡可能大的值,因為非常接近相機的 z 值不會因太多而有所不同。 這會使使用16位 z緩衝區的深度比較有些複雜。

如同世界和檢視轉換,您可以呼叫 IDirect3DDevice9::SetTransform 方法來設定投影轉換。

設定投影矩陣

下列 ProjectionMatrix 範例函式會設定前後裁剪平面,以及檢視角度的水準和垂直字段。 檢視欄位應小於 pi 弧度。

D3DXMATRIX 
ProjectionMatrix(const float near_plane, // Distance to near clipping 
                                         // plane
                 const float far_plane,  // Distance to far clipping 
                                         // plane
                 const float fov_horiz,  // Horizontal field of view 
                                         // angle, in radians
                 const float fov_vert)   // Vertical field of view 
                                         // angle, in radians
{
    float    h, w, Q;

    w = (float)1/tan(fov_horiz*0.5);  // 1/tan(x) == cot(x)
    h = (float)1/tan(fov_vert*0.5);   // 1/tan(x) == cot(x)
    Q = far_plane/(far_plane - near_plane);

    D3DXMATRIX ret;
    ZeroMemory(&ret, sizeof(ret));

    ret(0, 0) = w;
    ret(1, 1) = h;
    ret(2, 2) = Q;
    ret(3, 2) = -Q*near_plane;
    ret(2, 3) = 1;
    return ret;
}   // End of ProjectionMatrix

建立矩陣之後,請使用 IDirect3DDevice9::SetTransform 指定D3DTS_PROJECTION加以設定。

D3DX 公用程序連結庫提供下列函式,可協助您設定投影矩陣。

W 易記投影矩陣

Direct3D 可以使用世界、檢視和投影矩陣所轉換頂點的 w 元件,在深度緩衝區或霧效果中執行深度計算。 這類計算需要您的投影矩陣正規化 w,才能等於 world-space z。 簡言之,如果您的投影矩陣包含非 1 的 (3,4) 係數,您必須根據 (3,4) 係數的反轉來調整所有係數,才能建立適當的矩陣。 如果您未提供相容的矩陣,則不會正確套用霧效果和深度緩衝。

下圖顯示不符合規範的投影矩陣,並調整相同的矩陣,以便啟用眼睛相對霧。

不符合規範的投影矩陣和具有眼睛相對霧的矩陣圖例

在上述矩陣中,所有變數都會假設為非零。 如需眼部相對霧的詳細資訊,請參閱 Eye-Relative 與 Z 型深度。 如需 w 型深度緩衝的詳細資訊,請參閱 深度緩衝區 (Direct3D 9)

Direct3D 會在其 w 型深度計算中使用目前設定的投影矩陣。 因此,應用程式必須設定相容的投影矩陣,才能接收所需的 w 型功能,即使它們不使用 Direct3D 進行轉換也一樣。

轉換