Platform SDK: DirectX

シーン階層の実装

行列スタックを使用すれば、階層モデルの構築が容易になるので、より単純な一連のオブジェクトから複雑なオブジェクトを構築できる。

シーン (または変換) 階層は、通常ツリー データ構造により表される。ツリー データ構造の各ノードに、行列が 1 つずつ格納されている。特定の行列は、ノードの親から子への座標系における変化を表している。たとえば、人間の腕をモデリングする場合は、次の階層を実装する。

この階層で、Body 行列は身体をワールドに配置する。UpperArm 行列には肩の回転、LowerArm 行列には肘の回転、そして Hand 行列には手首の回転が格納される。ワールドに対する手の相対的位置を判定するには、ただ Body から Hand までの行列をすべて乗算するだけでよい。

この階層は、各ノードに子ノードが 1 つずつしかなく、とても単純である。手をもっと細かくモデリングする場合は、5 本の指を追加する。それぞれの指は、Hand の子として階層に追加できる。

ここで、シーンを描画するために深度優先順序 (1 つのパスをできる限り深いノードまでたどり、それから別の分岐先をたどる) で腕の形状全体をたどる場合は、セグメント化されたレンダリングのシーケンスを実行する。たとえば、手と指をレンダリングするには、次のパターンを実装する。

  1. 行列スタックに Hand 行列をプッシュする。
  2. 手を描画する。
  3. 行列スタックに Finger 1 行列をプッシュする。
  4. 第 1 指を描画する。
  5. Finger 1 行列をスタックからポップする。
  6. 行列スタックに Finger 2 行列をプッシュする。
  7. 第 2 指を描画する。
  8. Finger 2 行列をスタックからポップする。
  9. 行列スタックに Finger 3 行列をプッシュする。このように、すべての指をレンダリングするまで処理を続ける。

指のレンダリングが完了したら、Hand 行列をスタックからポップする。

例として、この基本処理のコードを示す。ツリー データ構造の深度優先検索時にノードが出現したら、その行列を行列スタックの一番上にプッシュする。

MatrixStack->Push();
MatrixStack->MultMatrix(pNode->matrix);

ノードの操作が終了したら、その行列を行列スタックの一番上からポップする。

MatrixStack->Pop();

このように、行列スタックの一番上の行列が常にカレント ノードのワールド トランスフォームを表している。そのため、各ノードを描画する前に、Direct3D 行列を設定する必要がある。

pD3DDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, *MatrixStack->GetTop());

Direct3DX 行列スタックで実行可能な特定のメソッドの詳細については、「ID3DXMatrixStack」を参照すること。