【问题标题】:How do I rotate a model without rotating it's local axis?如何在不旋转局部轴的情况下旋转模型?
【发布时间】:2012-11-17 21:47:03
【问题描述】:

我只需要在模型启动时将其旋转 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();
        }

请停下!

【问题讨论】:

  • 你如何移动导弹?
  • 我的回答已经在问题中更新了:)
  • 您的moveWorld 方法应该按您的意愿工作 - 只需将导弹移动到您希望它去的地方。不过,我并不完全理解您的 setOrientation 方法。为什么你有一个单一的方向值。 4x4 矩阵可以更清晰地描述位置和方向。
  • mOrientation 不是 4x4 矩阵吗?
  • 是吗?你还没有展示它的声明。

标签: c# matrix xna rotation


【解决方案1】:

应用平移和旋转的顺序很重要。如果您在全局范围内应用旋转,那么当您将对象从其旋转中心移开时,首先平移会导致问题。在这种情况下,您需要旋转并然后翻译。

在导弹的局部空间中应用旋转时,应用旋转的顺序也很重要。以“Roll”、“Pitch”、“Yaw”的顺序应用它们将产生与所有六种组合以“Pitch”、“Yaw”、“Roll”等顺序应用它们不同的结果。顺序取决于您要实现的目标,因此您可能必须创建一个可以完成所有六项的方法,并根据参数选择哪一个。

【讨论】:

  • 就是这样!第一部分!在我的绘图功能中,我交换了 Matrix.CreateTranslation(mPosition) * mOrientation;到 mOrientation * Matrix.CreateTranslation(mPosition);而现在这一切都是笨拙的!
猜你喜欢
  • 1970-01-01
  • 2016-10-06
  • 2012-08-05
  • 2021-02-10
  • 2018-12-03
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
相关资源
最近更新 更多