2012-10-26 36 views
1

在OpenGL中,我们可以创建一些多边形和功能 “pushMatrix()”将它们连接为一组,然后我们可以旋转并把它们移动作为一个对象..如何在xna中移动和旋转多边形组?

有没有办法做到这一点的XNA?如果我有3个多边形,并且我想旋转并将它们作为一个整体一起移动,那么我该怎么做?

编辑: 我使用Primitives形状来构建一个篮球运动员的骨架。

游戏将只能是拍出来的游戏到篮下,这意味着玩家

将只需要移动他的胳膊。

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

这是从原始的形状Harmonicaly内置了ARM。为了做到这一点,

我试过执行矩阵变换但

没有成功实施MatrixStack。任何建议?

回答

2

我会基本回答这个问题,因为我无法从你的问题中得到很多关于XNA或图形开发的精通。我甚至不知道你的问题在哪里。它是代码,结构还是XNA与OpenGL相比的工作原理?

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

与矩阵的工作,当你在OpenGL和XNA/DX做的是同样的事情。为了方便起见,使用pushMatrix所做的实际上只是保留堆栈上的矩阵(转换)状态。

将对象作为一个组连接仅仅是语义上的,你并没有真正将它们连成一个组。你正在做的是设置一个渲染状态,GPU使用它渲染每个绘制调用的顶点,直到该状态再次被改变。这可以在XNA/DX中以与OpenGL相同的方式完成。

根据您使用的绘制对象的方式,应用转换的方式有多种。从你的描述中,我猜你正在GraphicsDevice对象上使用DrawPrimitives(或类似的东西),但无论你使用什么,它都会使用以前应用的任何转换,通常在Effect上。其中最简单的是BasicEffect,它有三个成员你有兴趣

  • 世界
  • 查看
  • 投影

如果你使用BasicEffect,你只是你的应用使用世界成员中的矩阵进行转换。在将变换应用到当前效果之后绘制的任何内容都将使用这些变换。如果您使用的是自定义效果,除非您如何设置矩阵效果(使用参数集合),否则您可以执行某些操作。看一看:

如果你是之后是一个实际的变换堆栈,你必须实现一个自己,虽然这是很简单的。类似这样的:

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();