0

ローカル軸を編集せずに、モデルの起動時にモデルを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)を実行するだけでも、ZではなくワールドのX軸に沿って移動します。

私はミサイルをローカルとグローバルの両方で動かそうとしましたが、次のように役に立ちませんでした。

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

Pls Halp!

4

1 に答える 1

2

平行移動と回転を適用する順序は重要です。回転をグローバルに適用する場合、最初に平行移動すると、オブジェクトを回転の中心から遠ざけるときに問題が発生します。その場合、回転してから平行移動する必要があります

ミサイルのローカルスペースで回転を適用する場合、回転を適用する順序も重要です。「ロール」、「ピッチ」、「ヨー」の順序で適用すると、6つの組み合わせすべてに「ピッチ」、「ヨー」、「ロール」の順序で適用した場合とは異なる結果が得られます。順序は、達成しようとしていることによって異なるため、6つすべてを実行し、パラメーターに基づいてどれを選択するかを選択できるメソッドを作成する必要がある場合があります。

于 2012-11-17T22:36:34.930 に答える