在openGL中,我们可以创建一些多边形并通过函数将它们作为一个组连接起来 'pushMatrix()'然后我们可以旋转它们并将它们作为一个对象移动..
有没有办法用xna做到这一点?如果我有3个多边形,我想旋转并将它们作为一组一起移动,我该怎么做?
编辑: 我正在使用Primitives Shapes来构建篮球运动员的骨架。
游戏只会是篮下的射门游戏,这意味着玩家
只需移动他的手臂。
我需要完全控制Arm部件,为了做到这一点,我需要移动
由原始形状Harmonicaly建造的手臂。为了做到这一点,
我已尝试使用
实现MatrixStack以执行矩阵转换没有成功。有什么建议吗?
答案 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();