10

私はXNAを初めて使用し、簡単なゲームを作成しています。申し訳ありませんが、これはおそらく本当に簡単ですが、私はそれについての助けを見つけることができません。私がBlenderで作ったゲームには船があり、船のX、Y、Z軸を回転させることで船を制御できるようにしたいと思っています。これが私が持っているコードです:

protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);
  RotationMatrix = Matrix.CreateRotationY(MathHelper.PiOver2) * Matrix.CreateRotationY    (rotationY) * Matrix.CreateRotationX(rotationX) * Matrix.CreateRotationZ(rotationZ);

        Matrix shipTransformMatrix = RotationMatrix * Matrix.CreateTranslation(ship.Position);

                        DrawModel(ship.Model, shipTransformMatrix, ship.Transforms);
        // TODO: Add your drawing code here


        base.Draw(gameTime);
    }

    public  void DrawModel(Model model, Matrix modelTransform, Matrix[] absoluteBoneTransforms)
    {
        //Draw the model, a model can have multiple meshes, so loop
        foreach (ModelMesh mesh in model.Meshes)
        {
            //This is where the mesh orientation is set
            foreach (BasicEffect effect in mesh.Effects)
            {

                effect.World = absoluteBoneTransforms[mesh.ParentBone.Index] * modelTransform;
                effect.Projection = projectionMatrix;
                effect.View = viewMatrix;

            }

            //Draw the mesh, will use the effects set above.
            mesh.Draw();
        }
    }

これにより船は回転しますが、船の軸に沿って回転することはありません。(rotationYの値を変更して)Y軸を回転させると、船はY軸に沿って回転します。しかし、X軸またはZ軸を回転させると、船はそれ自体ではなく、世界のX軸とZ軸に従って回転します。船が独自の軸を中心に回転するようにするにはどうすればよいですか?行列で何か違うことをする必要がありますか?ありがとう

4

3 に答える 3

6

CreateRotationX、CreateRotationY、およびCreateRotationZを使用すると、すべてワールド軸またはグローバル軸の周りに回転が適用されます。つまり、オブジェクトは、オブジェクトのローカル軸ではなく、ワールド/グローバル軸を中心にのみ回転します。

CreateFromAxisAngleを使用すると、船自体のローカル軸を含め、必要な回転軸を入力できます。

ただし、たとえば船のアップなどの任意の軸を中心に回転すると、3つの角度値のいずれかが一度に変更される可能性があるため、全体的な回転パラダイムをシフトする必要があります。不必要に難しいことすべてを追跡すること。より簡単な方法があります:

回転を3つの角度ではなく、行列(またはクォータニオン)形式で保存するだけです。

于 2012-06-11T15:59:36.023 に答える
2

編集:ここで以下のスティーブにクレジットを与えます(素晴らしい答えの仲間、私がたくさんの3D数学をしたのでしばらく経ちました)。

ここでのこのチュートリアルは、スティーブが提案したものをセットアップする方法を示します!

http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series1/Rotation_-_translation.php

元の投稿:

BasicEffectループでエフェクトを作成する必要があると思います。

これらはすべて、MSDNの基本的なチュートリアルで説明されていると思います。あなたのコードはそこから来たようにさえ見えます。

http://msdn.microsoft.com/en-us/library/bb203897(v=xnagamestudio.31)

そうでない場合は、このリンクをチェックしてください。Reimerは、開始することを知っておく価値のある3Dのすべてをカバーしています。

http://www.riemers.net/eng/Tutorials/XNA/Csharp/series1.php

于 2012-06-11T15:20:24.910 に答える
1

他の誰かが私のように立ち往生した場合に備えて、私がやったことは次のとおりです。

Matrix RotationMatrix;
//every time I wanted to rotate around an axis, I would do something like this:
protected void rotateY()
    {
        RotationMatrix *= Matrix.CreateFromAxisAngle(RotationMatrix.Up, MathHelper.ToRadians(1.0f));
        //For the X axis I used RotationMatrix.Right, and for the Z RotationMatrix.Forward
    }
protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);


    Matrix shipTransformMatrix = RotationMatrix * Matrix.CreateTranslation(ship.Position);

                    DrawModel(ship.Model, shipTransformMatrix, ship.Transforms);
    // TODO: Add your drawing code here


    base.Draw(gameTime);
}

public  void DrawModel(Model model, Matrix modelTransform, Matrix[] absoluteBoneTransforms)
{
    //Draw the model, a model can have multiple meshes, so loop
    foreach (ModelMesh mesh in model.Meshes)
    {
        //This is where the mesh orientation is set
        foreach (BasicEffect effect in mesh.Effects)
        {

            effect.World = absoluteBoneTransforms[mesh.ParentBone.Index] * modelTransform;
            effect.Projection = projectionMatrix;
            effect.View = viewMatrix;

        }

        //Draw the mesh, will use the effects set above.
        mesh.Draw();
    }
}
于 2012-06-11T22:02:15.903 に答える