私が作っている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;
}
私の質問は、(最初の部分がより重要である)私の現在の戦略/実装に間違っていると私はこれを達成するための簡単な方法がそこにあるもの、両方のですか?
これは意味があり、それが助けになりました。ドットプロダクトの使用にはまだいくつかの問題があります。なぜなら、オブジェクトが揺れて混乱することがあるからです。私はそれが逆コサインの領域と関係があるとは思うが確かではない。 – computerscience32