1

船の移動の前後方向の位置を適切な速度で更新するための2つの適切なキーをコーディングしようとしていますが、思いついたのは次のとおりです。

//Update method
        public void Update(Vector3 position, Vector3 orientation)  
        {

            //TO DO - Create an updated version of this.local matrix


            this.local *= Matrix.CreateFromYawPitchRoll(orientation.Y, orientation.X, orientation.Z);

            this.local *= Matrix.CreateTranslation(position.X, position.Y, position.Z);
        }

Game1 より:

 protected override void Update(GameTime gameTime)
    {
        // Allows the game to exit
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            this.Exit();

        // TODO: Add your update logic here
        //Update the camera
        camera.Update();

       KeyboardState keyState = Keyboard.GetState();

        // The time since Update was called last.
        float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds;

        float RotationAngle = 0;
        RotationAngle += elapsed;
        float circle = MathHelper.Pi * 2;
        RotationAngle = RotationAngle % circle;

        Vector3 orientation = new Vector3(0, 0, 0);
        Vector3 position = new Vector3(0, 0, 0);


        if (keyState.IsKeyDown(Keys.W))
            orientation.X = RotationAngle;

        if (keyState.IsKeyDown(Keys.S))
            orientation.X = -RotationAngle;

        if (keyState.IsKeyDown(Keys.A))
            orientation.Y = RotationAngle;

        if (keyState.IsKeyDown(Keys.D))
            orientation.Y = -RotationAngle;

        if (keyState.IsKeyDown(Keys.Z))
            orientation.Z = RotationAngle;

        if (keyState.IsKeyDown(Keys.X))
            orientation.Z = -RotationAngle;


        //TO DO - Code two suitable keys to update position in the forward/backward direction of Ship travel at a suitable velocity


        if (keyState.IsKeyDown(Keys.F))
            position.Z = 1f;
        if (keyState.IsKeyDown(Keys.B))
            position.Z = 1f;


        //Update the first model i.e. the Ship
        scene[0].Update(position, orientation);

        base.Update(gameTime);
    }

問題は、船の機首を左右に回転させても、これらのボタンは私 (カメラ) に向かって前後に機能します。船の「鼻」、船の方向の前後に動かすには何を追加しますか?

答え!!!!それを機能させるために私がしなければならなかったのは、行列を異なる方法で乗算することだけでした.Translateよりも最初に回転し、最後にローカル!!! 回答ありがとうございます。それは本当に私の頭の上に座っていました!

this.local = Matrix.CreateFromYawPitchRoll(orientation.Y, orientation.X, orientation.Z) * Matrix.CreateTranslation(position.X, position.Y, position.Z) * this.local;
4

4 に答える 4

0

AS3でこれを行ったので、私は正しくないかもしれません。

船を回転させるときは、船の動きを再計算する必要があります。

簡単にするために、とだけがXありY、そのキーを押すと10単位移動します(単位が何であれ(ピクセルなど))。船をある角度に回転させるときは、軸XY軸の両方で船の動きを再計算する必要があります。

彼の移動機能は次のようになります。

Ship.X += Math.Cos(currentAngle) * Ship.DefaultMoveUnits;
Ship.Y += Math.Sin(currentAngle) * Ship.DefaultMoveUnits;

の場合も同じですXYZ

于 2012-11-19T10:36:44.590 に答える
0

学校での数学の授業を思い出してください!あなたの「船」は一点にあり、それを動かしたい速度/距離と角度があります。役立つ疑似コードを次に示します。

float a = math.rad(angle);
float newX = currentX + math.sin(a) * distanceToMove;
float newZ = currentZ - math.cos(a) * distanceToMove;

これは基本的なベクトル計算ですが、今のところ軸についてはよくわかりませんが、X、Y、Z を少しいじればわかるはずです。上記の式が間違っている場合は申し訳ありませんが、実際にこのような計算を行ったのはかなり前です;)

于 2012-11-19T10:33:23.810 に答える
0

それを機能させるために私がしなければならなかったのは、行列の乗算を変更することだけでした:

this.local = Matrix.CreateFromYawPitchRoll(orientation.Y、orientation.X、orientation.Z) * Matrix.CreateTranslation(position.X、position.Y、position.Z) * this.local;

于 2012-11-20T19:52:29.483 に答える