0

行列を操作して、船の速度を加速度が適用される方向に保つにはどうすればよいですか?

現在のコードは、加速度を適用してから回転を適用すると、加速度が変化するという点で機能しません。

ここでは、飛行機ではなく宇宙船の効果を探しています。

どんな助けでも大歓迎です - 私はこれがあなたのゲームプログラマーにとって初歩的なものであることを知っています!

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using System;

namespace AsteroidsWindowsGAme
{
    public class ShipModel
    {
        Model model;
        Matrix[] boneTransforms;
        ModelBone shipModelBone;
        Matrix shipTransform;
        TimeSpan lastTime;

        public void Load(ContentManager content)
        {
            model = content.Load<Model>("Ship");
            shipModelBone = model.Bones["Ship"];
            shipTransform = shipModelBone.Transform;
            boneTransforms = new Matrix[model.Bones.Count];
        }

        public void UpdateVelocity(GameTime gameTime)
        {
            if (AccelerationX != 0 || AccelerationY != 0 || AccelerationZ != 0)
            {
                if (lastTime == null)
                {
                    lastTime = gameTime.TotalGameTime;
                }
                else
                {
                    TimeSpan elapsedTime = gameTime.TotalGameTime - lastTime;
                    float elapsedSeconds = (float)elapsedTime.TotalSeconds;
                    VelocityX += AccelerationX * elapsedSeconds;
                    VelocityY += AccelerationY * elapsedSeconds;
                    VelocityZ += AccelerationZ * elapsedSeconds;
                }
            }
        }

        public void UpdatePosition(GameTime gameTime)
        {
            if(VelocityX != 0 || VelocityY != 0 || VelocityZ != 0)
            {
                if (lastTime == null)
                {
                    lastTime = gameTime.TotalGameTime;
                }
                else
                {
                    TimeSpan elapsedTime = gameTime.TotalGameTime - lastTime;
                    float elapsedSeconds = (float)elapsedTime.TotalSeconds;
                    PositionX += VelocityX * elapsedSeconds;
                    PositionY += VelocityY * elapsedSeconds;
                    PositionZ += VelocityZ * elapsedSeconds;
                }
            }
        }

        public void Draw(Matrix world, Matrix view, Matrix projection)
        {
            model.Root.Transform = world;

            Matrix shipRotationMatrix =
                Matrix.CreateTranslation(PositionX, PositionY, PositionZ) *
                Matrix.CreateRotationX(RotationX) *
                Matrix.CreateRotationY(RotationY) *
                Matrix.CreateRotationZ(RotationZ);

            shipModelBone.Transform = shipTransform * shipRotationMatrix;

            model.CopyAbsoluteBoneTransformsTo(boneTransforms);

            foreach (ModelMesh mesh in model.Meshes)
            {
                foreach (BasicEffect effect in mesh.Effects)
                {
                    effect.World = boneTransforms[mesh.ParentBone.Index];
                    effect.View = view;
                    effect.Projection = projection;
                    effect.EnableDefaultLighting();
                }
                mesh.Draw();
            }
        }

        public float RotationX { get; set; }
        public float RotationY { get; set; }
        public float RotationZ { get; set; }
        public float PositionX { get; set; }
        public float PositionY { get; set; }
        public float PositionZ { get; set; }
        public float VelocityX { get; set; }
        public float VelocityY { get; set; }
        public float VelocityZ { get; set; }
        public float AccelerationX { get; set; }
        public float AccelerationY { get; set; }
        public float AccelerationZ { get; set; }
    }
}
4

1 に答える 1

0

私はこれを理解しました:解決策は、次のように変換行列にビュー行列を掛けることです:

    public void Draw(Matrix world, Matrix view, Matrix projection)
    {
        model.Root.Transform = world;

        Matrix shipRotationMatrix =

            Matrix.CreateRotationX(RotationX) *
            Matrix.CreateRotationY(RotationY) *
            Matrix.CreateRotationZ(RotationZ);

        shipModelBone.Transform = shipTransform * shipRotationMatrix;

        model.CopyAbsoluteBoneTransformsTo(boneTransforms);

        foreach (ModelMesh mesh in model.Meshes)
        {
            foreach (BasicEffect effect in mesh.Effects)
            {
                effect.World = boneTransforms[mesh.ParentBone.Index];
                effect.View = view * Matrix.CreateTranslation(PositionX, PositionY, PositionZ);
                effect.Projection = projection;
                effect.EnableDefaultLighting();
            }
            mesh.Draw();
        }
    }
于 2012-10-30T05:56:18.120 に答える