これは古い質問であることがわかりますが、これまでの回答では見逃されていたものがあると思います。元の質問では、ミサイル(または何でも)はターゲットの位置に向かって加速するように言われました。これは間違っているといくつかの回答が指摘しているので、後ほどターゲットが置かれると思われる場所に向かって加速すべきです。これは良いですが、まだ間違っています。
あなたが本当にやりたいことは、目標に向かって加速するのではなく、目標に向かって移動することです。これについて考える方法は、目標に向けられた希望の速度を設定し(または目標の位置の投影)、最適な加速を見つけ出すことです(制限がある場合、つまりミサイルはおそらく加速できません)直接逆に)目的の速度を達成する(速度はベクトルであることを思い出してください)。
以下は、今朝実装した実際の例です。私の場合、スポーツシミュレーションゲームのプレーヤーAIで、プレーヤーが相手を追いかけようとしています。動きは、速度を更新するためにタイムステップの開始時に加速度が適用される標準の「キックドリフト」モデルによって管理され、その後、オブジェクトはタイムステップの持続時間にわたってその速度でドリフトします。
この派生物を投稿しますが、このサイトでは数学のマークアップはサポートされていません。ブー!これは最適なソリューションであると信頼する必要がありますが、加速方向には制限がありませんが、ミサイルタイプのオブジェクトには当てはまらないため、追加の制約が必要になります。
コードはpythonで記述されていますが、あらゆる言語の背景で読めるはずです。簡単にするために、各タイムステップの長さは1であると仮定し、それを反映する適切な単位で速度と加速度を表します。
self.x = # current x co-ordinate
self.y = # current y co-ordinate
self.angle = # current angle of motion
self.current_speed = # current magnitude of the velocity
self.acc # Maximum acceleration player can exert on themselves
target_x = # x co-ordinate of target position or projection of it
target_y = # y co-ordinate of target position or projection of it
vx = self.current_speed * math.cos(self.angle) # current velocity x component
vy = self.current_speed * math.sin(self.angle) # current velocity y component
# Find best direction to accelerate
acc_angle = math.atan2(self.x + vx - target_x,self.y + vy - target_y)
atan2(a、b)関数はa / bの逆タンを計算しますが、角度が円の正しい象限に収まるようにするため、aとbの両方の符号を知る必要があることに注意してください。
私の場合、加速度を取得したら、それを適用して速度を更新します
vx_new = vx + self.acc * math.cos(acc_angle)
vy_new = vy + self.acc * math.sin(acc_angle)
self.current_speed = math.sqrt( vx_new**2 + vy_new**2)
self.angle = math.atan2(vy_new,vx_new)
また、プレーヤーに依存する最大速度に対して新しい速度を確認し、その上限を設定します。ミサイル、車、または最大回転率(1ティックあたりの度数)のあるものの場合、計算された理想に対する現在の動きの角度を単純に見ることができ、この変化が許容よりも大きい場合は、角度を理想に向かって可能な限り。
これの派生に興味がある人のために、私はティムステップ後のプレイヤーとターゲットの間の距離を、初期位置、速度、加速率、および加速角に関して書き留め、その後、加速角に関する微分を取りました。これをゼロに設定すると、加速角の関数としてタイムステップ後のプレーヤーとターゲットの距離の最小値が見つかります。これはまさに知りたいことです。興味深いことに、加速率は元々方程式に含まれていましたが、実際にどれだけ加速できるかに関係なく、最適な方向を打ち消します。