Ok, alors considérons que nous avons un véhicule comme celui que j'ai décrit dans ma réponse à cette question , avec une position 2D, une vitesse, une vitesse angulaire et une traînée / friction. Il peut accélérer et casser d'une quantité variable, mais pas s'arrêter instantanément ou atteindre la vitesse de pointe instantanément. Comment puis-je le faire se déplacer vers un point particulier et s'arrêter - dans le temps le plus rapide possible - sans dépassement ni oscillation?
Je pensais à quelque chose comme:
- tourner vers la position cible.
- accélérer
- regardez 1 tick en avant, demandant "Si j'appliquais les breaks au tick suivant, est-ce que je dépasserais la cible?"
- S'il surpassait, appliquez maintenant les pauses d'un certain montant.
Je suis sûr que c'est un problème résolu et il existe probablement une meilleure méthode que celle que j'ai décrite.
En utilisant le calcul, si vous connaissez votre vitesse et votre taux de décélération maximal, vous pouvez connaître votre distance d'arrêt minimale. Dans cet esprit, vous pouvez savoir exactement quand vous devez appliquer les freins (erreurs d'arrondi / quantification mises à part) pour vous arrêter à un certain point.
Maintenant, j'espère que quelqu'un de meilleur en mathématiques que moi affichera la formule actuelle ...
la source
finalPositionDelta = -0.5 * sqr(currentSpeed) / maximumDeceleration
Cependant, cela suppose que votre décélération est une constante, ce qui, selon la profondeur de votre simulation, peut ne pas être le cas. J'irais avec la solution de Ranieri. (whoops désolé c'est la décélération DIV, pas mul)C'est un problème de contrôle. Vous devez varier vos entrées proportionnellement à une sorte de mesure "d'erreur", comme la distance à la cible. Voir également les réponses à cette question.
Suivi de cible: Quand accélérer et ralentir une tourelle rotative?
la source
Parfois, dans le développement de jeux, vous devez prendre des raccourcis. Le raccourci ici est appelé une impulsion, qui, physiquement parlant, est une très grande force appliquée en très peu de temps. Au lieu de l'intégrer dans le temps, il vous suffit de l'appliquer au paramètre comme un changement direct: définissez la vitesse sur 0.
La question est: voulez-vous utiliser le raccourci ou non?
la source