2016-04-12 32 views
0

私が作っている3Dゲームの敵クラスを書いており、敵をプレイヤーに従わせる作業をしています。私は基本的に、敵がフレームごとに少しずつプレーヤの方向に自分自身を回転させ、フレームごとに少し前進させたい。私はLerpingを使ってこれを以下のコードに示すようにしようとしましたが、動作させることができません。演奏するとき、敵は私の視界に現れたり、まったく私を追いかけることさえしません。下の敵クラスのコードです。C#とXNA - lerpを使って3Dモデルを別の3Dモデルに従う方法

注:pは私が追いかけているプレイヤーオブジェクトへの参照です。世界は敵オブジェクトのワールドマトリックスです。クォータニオンはこの敵オブジェクトのクォータニオンです。

私の現在の戦略は、自分の敵の前方ベクトルとプレイヤーの位置ベクトル3の間の方向ベクトルを見つけて、それを速度変数で決められた量だけ探します。次に、私は敵の前方ベクトルによって決定された平面への垂線ベクトルを見つけようとします。そして、新しいベクトルをmidVectorと呼んでいます。次に、垂直ベクトルについて回転させるための四元数を更新します。ここでは以下のコードは次のとおりです。

//here I get the direction vector in between where my enemy is pointing and where the player is located at 
     Vector3 midVector = Vector3.Lerp(Vector3.Normalize(world.Forward), Vector3.Normalize(Vector3.Subtract(p.position,this.position)), velocity); 
     //here I get the vector perpendicular to this middle vector and my forward vector 
     Vector3 perp=Vector3.Normalize(Vector3.Cross(midVector, Vector3.Normalize(world.Forward))); 

     //here I am looking at the enemy's quaternion and I am trying to rotate it about the axis (my perp vector) with an angle that I determine which is in between where the enemy object is facing and the midVector 

     quaternion = Quaternion.CreateFromAxisAngle(perp, (float)Math.Acos(Vector3.Dot(world.Forward,midVector))); 
     //here I am simply scaling the enemy's world matrix, implementing the enemy's quaternion, and translating it to the enemy's position 
     world = Matrix.CreateScale(scale) * Matrix.CreateFromQuaternion(quaternion) * Matrix.CreateTranslation(position); 


     //here i move the enemy forward in the direciton that it is facing 
     MoveForward(ref position, quaternion, velocity); 


    } 

    private void MoveForward(ref Vector3 position, Quaternion rotationQuat, float speed) 
    { 
     Vector3 addVector = Vector3.Transform(new Vector3(0, 0, -1), rotationQuat); 
     position += addVector * speed; 
    } 

私の質問は、(最初​​の部分がより重要である)私の現在の戦略/実装に間違っていると私はこれを達成するための簡単な方法がそこにあるもの、両方のですか?

答えて

0

フレーム間でオブジェクトの向きを保存していません。私はあなたが作成している四元数がオブジェクトの新しい方向を向いていると思っていると思います。しかし、実際には、全体の方向ではなく、最後のフレームと現在のフレームとの間の回転差のみを表す四元数です。

何が起こる必要があるかは、現在のフレームの向きを取得するために、新しいクオットを最後のフレームの向き四元数に適用する必要があることです。

つまり、最終的な向きの四元数ではなく、フレーム間更新四元数を作成しています。あなたはこのような何かする必要が

enemyCurrentOrientation = Quaternion.Concatenate(lastFrameQuat, thisNewQuat); 

おそらくありますが、もっと簡単な方法が、あなたのためにこの方法の作業、それを変更する必要はありません場合です。

+0

これは意味があり、それが助けになりました。ドットプロダクトの使用にはまだいくつかの問題があります。なぜなら、オブジェクトが揺れて混乱することがあるからです。私はそれが逆コサインの領域と関係があるとは思うが確かではない。 – computerscience32

関連する問題