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

C# 如何在xna中移动和旋转多边形组?,c#,3d,xna,rotation,C#,3d,Xna,Rotation,在openGL中,我们可以创建一些多边形,并通过函数将它们作为一个组连接起来 “pushMatrix()”然后我们可以旋转它们并将它们作为一个对象移动 有没有办法用xna做到这一点?如果我有3个多边形,我想将它们作为一个组一起旋转和移动,我该怎么做 编辑: ‫我正在使用基本体形状来构建篮球运动员的骨架 这场比赛只会是一场对篮筐的决战,这意味着球员将被淘汰出局 只需移动他的手臂 我需要完全控制手臂部位,为了做到这一点,我需要移动 这只手臂是由原始形状和谐而成的。为了做到这一点, 我尝试过实现Mat

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

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

编辑: ‫我正在使用基本体形状来构建篮球运动员的骨架

这场比赛只会是一场对篮筐的决战,这意味着球员将被淘汰出局

只需移动他的手臂

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

这只手臂是由原始形状和谐而成的。为了做到这一点,

我尝试过实现MatrixStack来执行矩阵变换,但是


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

我将用基本的术语来回答这个问题,因为我无法从您的问题中看出您对XNA或图形开发的总体熟练程度。我甚至不知道你的问题在哪里;与OpenGL相比,XNA是代码、结构还是工作方式

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

在使用矩阵时,您在OpenGL和XNA/DX中所做的是完全相同的。使用pushMatrix实际上只是为了方便起见在堆栈上保留矩阵(转换)状态

将对象作为一个组进行连接仅仅是语义,实际上并没有以任何真实的方式将它们作为一个组进行连接。您要做的是设置一个渲染状态,GPU使用该状态为此后的每次绘制调用变换和绘制顶点,直到该状态再次更改。这可以在XNA/DX中以与OpenGL相同的方式完成

根据用于绘制对象的内容,有不同的应用变换的方法。根据您的描述,我猜您正在GraphicsDevice对象上使用DrawPrimitives(或类似的东西),但是无论您使用哪种,它都将使用以前应用的任何转换,通常是在效果上。其中最简单的是BasicFect,它有三个您感兴趣的成员:

  • 世界
  • 看法
  • 投影
如果使用BasicFect,则仅使用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();
Stack matrixStack=new Stack();
...
matrixStack.Push(armMatrix);
...
basicEffect.World=matrixStack.Peek();
foreach(在basicEffect.currentTechnical.passs中传递EffectPass)
{
pass.Apply();
graphics.GraphicsDevice.DrawPrimitives(…);
}
基本效果结束();
...
matrixStack.Pop();