XNAまたはグラフィックス開発全般にどれだけ精通しているのか、あなたの質問からはよくわからないので、基本的な言葉でこれに答えます。あなたの問題がどこにあるのかさえわかりません。それはコード、構造、またはOpenGLと比較したXNAの動作方法ですか?
簡単に言うと、マトリックススタックは組み込まれていません。
OpenGLとXNA/DXで行うことは、マトリックスを操作するときとまったく同じです。pushMatrixで行うことは、実際には、便宜上、スタック上の行列(変換)状態を保持することだけです。
オブジェクトをグループとして接続することは単なるセマンティクスであり、実際にはオブジェクトをグループとして接続することはありません。あなたがしているのは、GPUがレンダリング状態を設定することです。これは、その後、その状態が再び変更されるまで、描画呼び出しごとに頂点を変換および描画するために使用されます。これは、OpenGLと同じ方法でXNA/DXで実行できます。
オブジェクトの描画に使用しているものに応じて、変換を適用するさまざまな方法があります。あなたの説明から、GraphicsDeviceオブジェクトでDrawPrimitives(またはそのようなもの)を使用していると思いますが、どちらを使用していても、以前に適用された変換、通常はEffectで使用されます。これらの中で最も単純なのはBasicEffectで、これには3つのメンバーがあります。
BasicEffectを使用する場合は、Worldメンバーのマトリックスを使用して変換を適用するだけです。変換を現在の効果に適用した後に描画するものはすべて、それらの変換を使用します。カスタムエフェクトを使用している場合は、エフェクトにマトリックスを設定する方法(パラメーターコレクションを使用)を除いて、これと非常によく似た操作を行います。見て:
求めているのが実際の変換スタックである場合、これは非常に単純ですが、自分で実装する必要があります。このようなもの:
Stack<Matrix> matrixStack = new Stack<Matrix>();
...
matrixStack.Push( armMatrix );
...
basicEffect.World = matrixStack.Peek();
foreach (EffectPass pass in basicEffect.CurrentTechnique.Passes)
{
pass.Apply();
graphics.GraphicsDevice.DrawPrimitives(...);
}
basicEffect.End();
...
matrixStack.Pop();