如何在xna中移动和旋转多边形组?

时间:2012-10-26 10:12:14

标签: c# 3d xna rotation

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

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

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

游戏只会是篮下的射门游戏,这意味着玩家

只需移动他的手臂。

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

由原始形状Harmonicaly建造的手臂。为了做到这一点,

我已尝试使用

实现MatrixStack以执行矩阵转换

没有成功。有什么建议吗?

1 个答案:

答案 0 :(得分:3)

我将以基本术语回答这个问题,因为我无法从您的问题中深入了解您对XNA或图形开发的精通程度。我甚至不确定你的问题在哪里;它是代码,结构或XNA与OpenGL相比如何工作?

简短的回答是没有内置矩阵堆栈。

在使用矩阵时,您在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();