共用方式為


轉換 (Direct3D 9)

透過固定函式幾何管線推送幾何的 Direct3D 部分是轉換引擎。 它會找出世界上的模型和查看器、投影螢幕上顯示的頂點,並將頂點裁剪到檢視區。 轉換引擎也會執行光源計算,以判斷每個頂點的擴散和反射元件。

幾何管線會採用頂點作為輸入。 轉換引擎會將世界、檢視和投影轉換套用至頂點、裁剪結果,並將所有專案傳遞至轉譯器。

在管線的前端,模型的頂點會相對於本機座標系統宣告。 這是本機來源和方向。 這種座標方向通常稱為模型空間,而個別座標稱為模型座標。

幾何管線的第一個階段會將模型的頂點從其本機座標系統轉換成場景中所有物件所使用的座標系統。 重新導向頂點的過程稱為世界轉換。 這個新方向通常稱為世界空間,而世界空間中的每個頂點都會使用世界座標宣告。

在下一個階段中,描述 3D 世界的頂點會針對相機進行導向。 也就是說,您的應用程式會為場景選擇一個檢視點,而世界空間座標會重新定位和旋轉相機的檢視,將世界空間變成相機空間。 這是檢視轉換。

下一個階段是投影轉換。 在管線的這個部分,物件通常與與觀眾的距離相關來縮放,以便讓場景的深度錯覺:close 物件會呈現大於遠距物件,依此顯示。 為了簡單起見,本檔是指頂點在投影轉換后存在作為投影空間的空間。 有些圖形書籍可能會將投影空間稱為透視后同質空間。 並非所有投影都會轉換場景中物件的大小。 這類投影有時稱為仿射或正交投影。

在管線的最後一個部分中,會移除畫面上看不到的任何頂點,讓點陣化程式不需要時間來計算永遠不會看到之事物的色彩和底紋。 此程序稱為裁剪。 裁剪之後,其餘頂點會根據檢視區參數進行調整,並轉換成螢幕座標。 當場景點陣化時,在螢幕上看到產生的頂點,存在於屏幕空間中。

轉換可用來將物件幾何從一個座標空間轉換成另一個座標空間。 Direct3D 使用矩陣來執行 3D 轉換。 本節說明矩陣如何建立 3D 轉換、描述轉換的一些常見用途,以及詳細說明如何結合矩陣來產生包含多個轉換的單一矩陣。

矩陣轉換

在使用 3D 圖形的應用程式中,您可以使用幾何轉換來執行下列動作:

  • 表示物件相對於另一個物件的位置。
  • 旋轉和調整物件大小。
  • 變更檢視位置、方向和檢視方塊。

您可以使用 4x4 矩陣,將任何點 (x,y,z) 轉換成另一個點 (x', y', z'),如下列方程式所示。

將任何點轉換成另一個點的方程式 方程式

在 (x, y, z) 和矩陣上執行下列方程式,以產生點 (x', y', z') 。

新點方程式

最常見的轉換是翻譯、旋轉和調整。 您可以將產生這些效果的矩陣結合成單一矩陣,一次計算數個轉換。 例如,您可以建置單一矩陣來平移和旋轉一系列點。

矩陣是以數據列數據行順序撰寫。 沿著每個軸平均縮放頂點的矩陣,稱為統一縮放比例,會使用數學表示法來表示下列矩陣。

矩陣的 方程式,用於統一縮放

在 C++ 中,Direct3D 會使用 D3DMATRIX 結構,將矩陣宣告為二維陣列。 下列範例示範如何初始化 D3DMATRIX 結構,以做為統一縮放矩陣。

// In this example, s is a variable of type float.

D3DMATRIX scale = {
    s,               0.0f,            0.0f,            0.0f,
    0.0f,            s,               0.0f,            0.0f,
    0.0f,            0.0f,            s,               0.0f,
    0.0f,            0.0f,            0.0f,            1.0f
};

翻譯

下列方程式會將點 (x, y, z) 轉譯為新點 (x', y', z')。

新點的轉譯矩陣 方程式

您可以在 C++中手動建立翻譯矩陣。 下列範例顯示建立矩陣以轉譯頂點之函式的原始程式碼。

D3DXMATRIX Translate(const float dx, const float dy, const float dz) {
    D3DXMATRIX ret;

    D3DXMatrixIdentity(&ret);
    ret(3, 0) = dx;
    ret(3, 1) = dy;
    ret(3, 2) = dz;
    return ret;
}    // End of Translate

為了方便起見,D3DX 公用程式連結庫會提供 D3DXMatrixTranslation 函式。

規模

下列方程式會將 x、y、z 中的任意值縮放到新點 (x'、y'、z')。

新點 尺規矩陣的方程式

旋轉

此處所述的轉換適用於左側座標系統,因此可能與您在其他地方看到的轉換矩陣不同。

下列方程式會在 x 軸周圍旋轉點 (x, y, z), 產生新點 (x', y', z') 。

新點方程式

下列方程式會在Y軸周圍旋轉點。

新點的 y 旋轉矩陣 方程式

下列方程式會繞 z 軸旋轉點。

新點方程式

在這些範例矩陣中,希臘字母 theta 代表旋轉角度,以弧度為單位。 沿著旋轉軸向原點看時,會順時針測量角度。

在C++應用程式中,使用 D3DXMatrixRotationXD3DXMatrixRotationYD3DXMatrixRotationZ D3DX 公用程序連結庫所提供的函式來建立旋轉矩陣。 以下是 D3DXMatrixRotationX 函式的程式代碼。

D3DXMATRIX* WINAPI D3DXMatrixRotationX
    ( D3DXMATRIX *pOut, float angle )
{
#if DBG
    if(!pOut)
        return NULL;
#endif

    float sin, cos;
    sincosf(angle, &sin, &cos);  // Determine sin and cos of angle

    pOut->_11 = 1.0f; pOut->_12 =  0.0f;   pOut->_13 = 0.0f; pOut->_14 = 0.0f;
    pOut->_21 = 0.0f; pOut->_22 =  cos;    pOut->_23 = sin;  pOut->_24 = 0.0f;
    pOut->_31 = 0.0f; pOut->_32 = -sin;    pOut->_33 = cos;  pOut->_34 = 0.0f;
    pOut->_41 = 0.0f; pOut->_42 =  0.0f;   pOut->_43 = 0.0f; pOut->_44 = 1.0f;

    return pOut;
}

串連矩陣

使用矩陣的其中一個優點是,您可以將兩個或多個矩陣的效果乘以結合。 這表示,若要旋轉模型,然後將它轉譯為某個位置,您不需要套用兩個矩陣。 相反地,您會將旋轉和轉譯矩陣相乘,以產生包含其所有效果的複合矩陣。 這個程式稱為矩陣串連,可以使用下列方程式撰寫。

矩陣串連方程式

在此方程式中,C 是所建立的複合矩陣,而 M₁ 到 Mn 是個別矩陣。 在大部分情況下,只有兩個或三個矩陣會串連,但沒有限制。

使用 D3DXMatrixMultiply 函式來執行矩陣乘法。

執行矩陣乘法的順序非常重要。 上述公式會反映矩陣串連的由左至右規則。 也就是說,您用來建立複合矩陣的矩陣的可見效果會以由左至右的順序發生。 下列範例顯示一般世界矩陣。 想像一下,你正在為陳規定型飛碟創造世界矩陣。 您可能會想要旋轉飛碟在其中心 - 模型空間的 Y 軸 - 並轉譯到場景中的一些其他位置。 若要完成此效果,請先建立旋轉矩陣,然後將它乘以轉譯矩陣,如下列方程式所示。

根據旋轉矩陣和轉譯矩陣 旋轉的方程式

在此公式中,Ry 是 y 軸旋轉的矩陣,而 Tw 是世界座標中某個位置的轉譯。

相乘矩陣的順序很重要,因為與相乘兩個純量值不同,矩陣乘法不是通勤的。 將矩陣乘以相反的順序,具有將飛碟翻譯成其世界空間位置的視覺效果,然後繞世界原點旋轉。

無論您所建立的矩陣類型為何,請記住由左至右的規則,以確保您達到預期的效果。

用戶入門