0

私はこの敵のクラスを持っています、そして私はそれをしたいです

1) 特定の場所にスポーン Vector3 pos

2) 自分のプレイヤーの位置に向きを変える

3) 前進する

このコードは現在、指定された場所 (pos) に表示され、ターゲット (targetShip) に面するように回転しようとします。このオフセットが原因で、ターゲットに正しく向くことができません。

値を変換に割り当てるコードを削除するか、pos を正規化すると、モデルが原点に表示され、回転して正しくターゲットに向かいます。

翻訳に関するコメントアウトコードのいずれかを使用して移動しようとすると、別の場所で開始されているように見え、決して見つけることができません。

ただし、回転に関連するコードを削除し、翻訳に関連するコードのコメントを外すと、前に進むことができます。

コツは、すべて一緒に行うことです。

class Enemy : BasicModel
{


    Matrix rotation = Matrix.Identity;
    Matrix translation = Matrix.Identity;
    public Vector3 pos, up, right, targetShip,dir;

    public Enemy(Model m, Vector3 pos)
        : base(m)
    {
        up = Vector3.Up;
        //sets the position to the Vector3 as it's spawn point.
        translation = Matrix.CreateTranslation(pos);

    }

    public override void Update()
    {
        //Glo is a global class, where I store the player world.
        targetShip = Glo.world.Translation;
        targetShip.Normalize();

      pos = transform.Translation;

      rotation = RotateToFace(targetShip, pos, Vector3.Up);
      //Attempt at moving the model forward. Causes it to go out of view
      //translation *= Matrix.CreateTranslation(this.GetWorld().Backward);
      //translation *= Matrix.CreateTranslation(pos);
    }

    public override Matrix GetWorld()
    {
        return rotation * world * translation ;

    }

    /*Params: O = Our target
     * P = Our position
     * U = up.
     * 
     * Code from some site I googled up.
      */
    Matrix RotateToFace(Vector3 O, Vector3 P, Vector3 U)
    {

        //The direction we're facing.
        Vector3 D = (O - P);
        //Our relative Right.
        Vector3 Right = Vector3.Cross(U, D);
        Vector3.Normalize(ref Right, out Right);
        //Our back
        Vector3 Backwards = Vector3.Cross(Right, U);
        Vector3.Normalize(ref Backwards, out Backwards);
        //Our relative up
        Vector3 Up = Vector3.Cross(Backwards, Right);
        //Make a matrix out of all of these.
        Matrix rot = new Matrix(Right.X, Right.Y, Right.Z, 0, Up.X, Up.Y, Up.Z, 0, Backwards.X, Backwards.Y, Backwards.Z, 0, 0, 0, 0, 1);
        return rot;
    }



}

}

----


やってみた

anathonlineの方法、そしてこれが私が今持っているものです うまくいきません。モデルがどこにも表示されません。

public override void Update()
        {
            targetShip = Glo.world.Translation;
            targetShip.Normalize();

            //Translate it to the origin
            translation = Matrix.Identity;
            //Orient it
            rot = RotateToFace(targetShip, translation.Translation, Vector3.Up);
            //Move it back to where it was originally;
            translation = Matrix.CreateTranslation(offset);
            //Calculate the front of the object
            Vector3 front = Vector3.Forward * translation.Translation;
            //normalize it
            Vector3.Normalize(ref front, out front);
            //multiply it
            front *= 2;
            //translate the object
            translation *= Matrix.CreateTranslation(front);



        }

        public override Matrix GetWorld()
        {
            return world * rot *  translation;

        }

----


2 回目の改訂: まだ機能しない

public override void Update()
    {
        targetShip = Glo.world.Translation;
        targetShip.Normalize();


         translation = Matrix.CreateLookAt(offset, targetShip, Vector3.Up);
        var amountToMove = 0.2f;
        var finalPos = Vector3.Lerp(targetShip, offset, amountToMove);
        rot = translation * Matrix.CreateTranslation(finalPos); 


    }

    public override Matrix GetWorld()
    {
        return world * rot * translation ;

    }
4

1 に答える 1

0

私はそれを修正しました、心配しないでください。とにかく、このコードはすべて廃止されています。

于 2012-05-05T03:48:32.967 に答える