共用方式為


矩陣堆疊 (Direct3D 9)

注意

D3DX 公用程序連結庫已被取代。 建議您改用 DirectXMath,以及 GitHub 此標頭。

D3DX 公用程序連結庫提供 ID3DXMATRIXStack 介面。 它提供一個機制,讓矩陣能夠推入矩陣堆疊並從矩陣堆棧中彈出。 實作矩陣堆疊是周遊轉換階層時追蹤矩陣的有效方式。

D3DX 公用程式連結庫會使用矩陣堆疊,將轉換儲存為矩陣。 ID3DXMATRIXStack 介面的各種方法會處理目前矩陣,或位於堆棧頂端的矩陣。 您可以使用 ID3DXMATRIXStack::LoadIdentity 方法來清除目前的矩陣。 若要明確指定要載入為目前轉換矩陣的特定矩陣,請使用 ID3DXMATRIXStack::LoadMatrix 方法。 然後,您可以呼叫 ID3DXMATRIXStack::MultMatrix 方法或 ID3DXMATRIXStack::MultMatrixLocal 方法,將目前的矩陣乘以指定的矩陣。

ID3DXMATRIXStack::P op 方法可讓您返回上一個轉換矩陣,而 ID3DXMATRIXStack::P ush 方法會將轉換矩陣新增至堆棧。

矩陣堆疊上的個別矩陣會以 4x4 同質矩陣表示,由 D3DX 公用程式連結庫 D3DXMATRIX 結構所定義。

D3DX 公用程式連結庫會透過元件物件模型 (COM) 物件提供矩陣堆疊。

實作場景階層

矩陣堆疊可簡化階層式模型的建構,其中複雜物件是從一系列較簡單的物件建構而來。

場景或轉換階層通常以樹狀結構數據結構表示。 樹狀結構中的每個節點都包含矩陣。 特定矩陣代表座標系統的變更,從節點的父系變更到節點。 例如,如果您要建立人類手臂的模型,您可以實作下圖所示的階層。

人類手臂階層的 圖表

在此階層中,Body 矩陣會將本文放在世界上。 UpperArm 矩陣包含肩部旋轉、LowerArm 矩陣包含肘部旋轉,而 Hand 矩陣包含手腕的旋轉。 若要判斷手與世界相對的位置,您可以將所有矩陣從身體向下乘以手。

先前的階層過於簡單,因為每個節點只有一個子系。 如果您開始更詳細地建立手部模型,您可能會新增手指和拇指。 每個數位都可以新增至階層做為 Hand 的子系,如下圖所示。

人手階層的 圖表

如果您以深度優先順序周遊手臂的完整圖形 - 在移至下一個路徑之前盡可能向下周游一個路徑 - 繪製場景,您可以執行一連串的分段轉譯。 例如,若要轉譯手部和手指,您可以實作下列模式。

  1. 將手部矩陣推送至矩陣堆疊。
  2. 畫手。
  3. 將 Thumb 矩陣推送至矩陣堆疊。
  4. 繪製拇指。
  5. 從堆疊中彈出 Thumb 矩陣。
  6. 將手指 1 矩陣推送至矩陣堆疊。
  7. 繪製第一根手指。
  8. 將手指 1 矩陣從堆疊中彈出。
  9. 將手指 2 矩陣推送至矩陣堆疊。 您會以這種方式繼續,直到轉譯所有手指和拇指為止。

完成轉譯手指之後,您會將手部矩陣從堆疊中彈出。

您可以使用下列範例,在程式碼中遵循這個基本程式。 當您在深入搜尋樹狀結構時遇到節點時,請將矩陣推送至矩陣堆疊的頂端。

MatrixStack->Push();

MatrixStack->MultMatrix(pNode->matrix);

當您完成節點時,請將矩陣從矩陣堆疊頂端快顯出來。

MatrixStack->Pop();

如此一來,堆疊頂端的矩陣一律代表目前節點的世界轉換。 因此,在繪製每個節點之前,您應該設定 Direct3D 矩陣。

pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(0), *MatrixStack->GetTop());

如需您可以在 D3DX 矩陣堆疊上執行之特定方法的詳細資訊,請參閱 ID3DXMATRIXStack 參考主題。

頂點管線