Je sais que la question est ancienne, mais je pense que quelque chose a été oublié dans les réponses données jusqu'à présent. Dans la question initiale, le missile (ou autre chose) devait accélérer pour atteindre la position de la cible. Plusieurs réponses ont indiqué que cela était faux et que vous devriez accélérer vers l'endroit où vous pensez que la cible se situera à un moment ultérieur. C'est mieux mais toujours faux.
Ce que vous voulez vraiment faire, ce n’est pas d’ accélérer vers la cible, mais de vous rapprocher de la cible. Pour ce faire, définissez la vitesse désirée en fonction de la cible (ou une projection de l'emplacement de la cible), puis déterminez quelle accélération vous pouvez le mieux appliquer (quelles que soient vos restrictions, par exemple, un missile ne peut probablement pas accélérer.) directement en sens inverse) pour obtenir la vélocité souhaitée (en se rappelant que la vélocité est un vecteur).
Voici un exemple concret que j'ai implémenté ce matin, dans mon cas pour un joueur IA dans un jeu de simulation de sport, où le joueur essaie de chasser son adversaire. Le mouvement est régi par un modèle standard de "dérive de kick", dans lequel les accélérations sont appliquées au début d'un pas de temps pour mettre à jour les vitesses, puis les objets dérivent à cette vitesse pendant la durée du pas de temps.
Je voudrais poster la dérivation de cela, mais j'ai trouvé qu'il n'y a pas de balisage mathématique pris en charge sur ce site. Huer! Vous devrez simplement avoir confiance que c'est la solution optimale, sachant que je n'ai aucune restriction quant à la direction de l'accélération, ce qui n'est pas le cas pour un objet de type missile, de sorte que des contraintes supplémentaires seraient nécessaires.
Le code est en python, mais doit être lisible avec tous les antécédents linguistiques. Par souci de simplicité, je suppose que chaque pas de temps a une longueur de 1 et exprime la vitesse et l’accélération en unités appropriées pour refléter cela.
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)
Notez que la fonction atan2 (a, b) calcule le tan inverse de a / b, mais assure que les angles se situent dans le quadrant correct d'un cercle, ce qui nécessite de connaître le signe de a et de b.
Dans mon cas, une fois que j'ai l'accélération, je l'applique pour mettre à jour la vitesse en
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)
Je vérifie également la nouvelle vitesse par rapport à une vitesse maximale dépendant du joueur et la limite à cela. Dans le cas d'un missile, d'une voiture ou de quelque chose avec une vitesse de rotation maximale (en degrés par tick), vous pouvez simplement regarder l'angle de mouvement actuel par rapport à l'idéal calculé et si ce changement est supérieur à celui autorisé, il suffit de changer l'angle de vue. autant que possible vers l'idéal.
Pour ceux qui sont intéressés par cette dérivation, j’ai noté la distance entre le joueur et la cible après le pas de temps, en termes de position initiale, de vitesse, de taux d’accélération et d’angle d’accélération, puis j’ai pris la dérivée par rapport à l’angle d’accélération. Définissez-le sur zéro pour trouver les minima de la distance joueur-cible après le pas de temps en fonction de l'angle d'accélération, ce qui correspond exactement à ce que nous voulons savoir. Fait intéressant, même si le taux d’accélération se trouvait à l’origine dans les équations, la direction optimale n’est pas prise en compte, indépendamment de la capacité réelle d’accélération.