我将用基本的术语回答这个问题,因为我不能从你的问题中看出你对 XNA 或一般图形开发的精通程度。我什至不确定您的问题出在哪里;与 OpenGL 相比,是代码、结构还是 XNA 的工作方式?
简短的回答是没有内置矩阵堆栈。
在使用矩阵时,您在 OpenGL 和 XNA/DX 中所做的事情是完全相同的。为了方便起见,您对 pushMatrix 所做的实际上只是将矩阵(转换)状态保留在堆栈上。
将对象作为一个组连接只是语义,您实际上并没有以任何真实的方式将它们连接为一个组。您正在做的是设置一个渲染状态,GPU 使用该渲染状态来为之后的每个绘图调用转换和绘制顶点,直到该状态再次改变。这可以在 XNA/DX 中以与在 OpenGL 中相同的方式完成。
根据您用于绘制对象的内容,有不同的应用转换方式。根据您的描述,我猜您在 GraphicsDevice 对象上使用了 DrawPrimitives(或类似的东西),但无论您使用的是什么,它都会使用之前应用的任何转换,通常是在效果上。其中最简单的是 BasicEffect,它包含您感兴趣的三个成员:
如果您使用 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();