如何在不旋转局部轴的情况下旋转模型?

时间:2012-11-17 21:47:03

标签: c# matrix xna rotation

我只需要在启动时将模型旋转90度,而不需要编辑其局部轴。 我有一个导弹在隧道侧面向下飞行90度,我需要它在面向隧道的同时保持其运动方向。我试过了:

virtual public void setOrientationWorld(float x, float y, float z)
{
    mOrientation *= Matrix.CreateRotationX(MathHelper.ToRadians(x));
    mOrientation *= Matrix.CreateRotationY(MathHelper.ToRadians(y));
    mOrientation *= Matrix.CreateRotationZ(MathHelper.ToRadians(z));
}

setOrientationWorld(0,-90,0);

我试过了:

virtual public void setOrientationLocal(float x, float y, float z)
{                                                                  
    mOrientation *= Matrix.CreateFromAxisAngle(mOrientation.Right, MathHelper.ToRadians(x));
    mOrientation *= Matrix.CreateFromAxisAngle(mOrientation.Up, MathHelper.ToRadians(y));
    mOrientation *= Matrix.CreateFromAxisAngle(mOrientation.Forward, MathHelper.ToRadians(z));
}

setOrientationLocal(0,-90,0);

但是他们都破坏了一切。当我做任何一个时,导弹旋转,所有轴都改变。即使只是去setPosition(0,0,-1)也会使它沿着世界的X轴而不是它的Z轴移动。

我曾尝试在本地和全球范围内移动导弹,但无济于事,如下:

virtual public void moveLocal(float x, float y, float z)
{
    mPosition += mOrientation.Right * x;
    mPosition += mOrientation.Up * y;
    mPosition += mOrientation.Forward * z;
}

virtual public void moveWorld(float x, float y, float z)
{
    mPosition.X += x;
    mPosition.Y += y;
    mPosition.Z += z;
}

我能想到的另一个相关的事情是绘制功能,它可能与它有关:

        foreach (BasicEffect effect in mesh.Effects)
        {
            effect.EnableDefaultLighting();
            effect.World = Matrix.Identity *
                Matrix.CreateScale(mScale) *
                transforms[mesh.ParentBone.Index] *
                Matrix.CreateTranslation(mPosition) *
                mOrientation;
            effect.View = game1.getView();
            effect.Projection = game1.getProjection();
        }

请停下来!

1 个答案:

答案 0 :(得分:2)

您应用翻译和轮换的顺序非常重要。如果要全局应用旋转,则首先进行平移会导致问题,因为您正在将对象移离旋转中心。在这种情况下,您需要旋转并然后翻译。

当在导弹的局部空间中应用旋转时,应用旋转的顺序也很重要。按照“滚动”,“俯仰”,“偏航”的顺序应用它们将产生不同的结果,以按照“俯仰”,“偏航”,“滚动”等顺序对所有六种组合应用它们。顺序取决于您要实现的目标,因此您可能必须创建一个可以执行所有六个方法并根据参数选择哪个方法。