1

在openGL中,我们可以创建一些多边形并通过函数'pushMatrix()'将它们连接为一个组,然后我们可以旋转它们并将它们作为一个对象移动......

有没有办法用 xna 做到这一点?如果我有 3 个多边形并且我想将它们作为一个组一起旋转和移动,我该怎么做?

编辑:我正在使用 Primitives Shapes 构建篮球运动员的骨架。

这场比赛将只是一场对篮筐的射门比赛,这意味着球员

只需要移动他的手臂。

我需要完全控制手臂部件,为了做到这一点,我需要移动

由原始形状和谐构建的手臂。为了做到这一点,

我已经尝试实现 MatrixStack 以执行矩阵转换,但使用

没有成功。有什么建议吗?</p>

4

1 回答 1

3

我将用基本的术语回答这个问题,因为我不能从你的问题中看出你对 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();
于 2012-10-26T13:59:12.760 回答