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) 物件。

實作場景階層

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

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

人類 Arm 階層的圖表

在此階層中,本文矩陣會將本文放在世界。 UpperArm 矩陣包含手部旋轉、LowerArm 矩陣包含橢圓形旋轉,而 Hand 矩陣則包含手部旋轉。 若要判斷手部相對於世界的位置,您可以將本文中的所有矩陣乘以手部。

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

人類手部階層的圖表

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

  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 參考主題。

頂點管線