共用方式為


轉換概觀

矩陣轉換處理許多 3D 圖形的低階數學運算。

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

轉換和空間 說明
模型空間中的模型座標 在管線的前端,模型的頂點會相對於局部座標系統定義。 這是一個本地起點和一個方向。 這個座標方向通常稱為 模型空間。 個別座標稱為 模型座標
世界轉型為世界空間 幾何管線的第一個階段是將模型的頂點從其局部坐標系統轉換為場景中所有物件共用的坐標系統。 重新導向頂點的過程稱為 World transform,它會將模型空間轉換成稱為 world space的新方向。 世界空間中的每個頂點都會以 的世界座標宣告。
視圖轉換成視圖空間(相機空間) 在下一個階段中,描述 3D 世界的頂點會在相機參照下進行定位。 也就是說,您的應用程式會為場景選擇一個檢視點,而世界空間座標會重新定位並繞著相機的視線旋轉,將世界空間變成 檢視空間(也稱為 相機空間)。 這是 檢視轉換,將世界空間轉換為檢視空間。
投影轉換成投影空間 下一個階段是 投影轉換,它會將視空間轉換成投影空間。 在管線的這個部分,物件通常會根據與觀眾的距離進行縮放,以營造場景的深度錯覺;近的物件會顯示得比遠的物件更大。 為了簡單起見,本文件將頂點在投影轉換後存在的空間稱為 投影空間。 某些圖形書籍可能會將投影空間稱為 透視後齊性空間。 並非所有投影變換都會縮放場景中物件的大小。 這類投影有時稱為仿射正交投影
在螢幕空間中裁剪 在管線的最後一個部分中,會移除畫面上看不到的任何頂點,讓點陣化程式不需要時間來計算永遠不會看到之事物的色彩和底紋。 此過程稱為 裁剪。 裁剪之後,其餘頂點會根據視窗參數進行縮放,並轉換成螢幕座標。 螢幕上顯示的頂點是場景點陣化後產生的,且存在於 螢幕空間

 

轉換可用來將物件幾何從一個座標空間轉換成另一個座標空間。 Direct3D 使用矩陣來執行 3D 轉換。 矩陣會建立 3D 轉換。 您可以結合矩陣來產生包含多個轉換的單一矩陣。

您可以在模型空間、世界空間和檢視空間之間轉換座標。

矩陣轉換

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

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

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

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

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

新點 的 方程式

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

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

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

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

D3DMATRIX scale = {
    5.0f,            0.0f,            0.0f,            0.0f,
    0.0f,            5.0f,            0.0f,            0.0f,
    0.0f,            0.0f,            5.0f,            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

縮放比例

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

新點 尺規矩陣的方程式

旋轉

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

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

x 旋轉矩陣的新點 的 方程式

以下方程式會繞著y軸旋轉該點。

y 旋轉矩陣的方程式,用於新點

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

z 旋轉矩陣的 方程式,針對新點

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

下列程式代碼顯示處理 X 軸旋轉的函式。

    // Inputs are a pointer to a matrix (pOut) and an angle in radians.
    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 是個別矩陣。 在大部分情況下,只有兩個或三個矩陣會串連,但沒有限制。

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

根據旋轉矩陣和平移矩陣的旋轉方程式

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

相乘矩陣的順序很重要,因為與相乘兩個純量值不同,矩陣乘法不是通勤的。 若將矩陣以相反順序相乘,其視覺效果是先將飛碟移動到其世界空間位置,然後圍繞世界原點進行旋轉。

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

轉換