Je recherche des idées pour implémenter le suivi dans l'espace 2D. Malheureusement, je ne sais pas encore grand chose sur l'IA / la recherche de chemin / le contrôle autonome.
Disons que ce navire peut se déplacer librement mais qu'il a une masse et un élan. De plus, des forces externes peuvent l'affecter (explosions, etc.). Le joueur peut fixer un objectif pour le navire à tout moment et il doit atteindre cet endroit et s'arrêter.
Sans physique, ce serait simple, il suffit de pointer la direction et de partir. Mais comment faire face à l'élan existant puis s'arrêter sur place? Je ne veux pas modifier directement l'emplacement du navire.
edit: Juste pour être clair, les mathématiques liées à la physique du navire lui-même ne sont pas le problème.
la source
Réponses:
Jetez un œil aux comportements de pilotage . Surtout la recherche et l' arrivée peuvent être intéressantes pour vos besoins. Ces comportements fonctionneront également lorsque d'autres influences comme une explosion modifient temporairement la position du navire.
la source
Ce n'est pas un problème facile d'obtenir exactement ce qu'il faut. Vous avez deux choix, bien que les spécificités de chaque solution varient:
Une solution mathématique. Si votre système physique est assez simple, vous pouvez créer la forme fermée de votre mouvement et calculer quand vous devez commencer à appliquer une force de freinage pour vous arrêter à un point. Si votre force de freinage est constante et que vous n'avez aucune résistance à l'air, cela devrait se décomposer en quadratique.
Une solution emperique. Vous pouvez utiliser un contrôleur PID réglé à la main ou enregistrer les distances de freinage de votre navire dans votre système physique: dans un banc d'essai, freinez le navire de la vitesse maximale jusqu'à l'arrêt, en enregistrant la distance parcourue et la vitesse à chaque petit pas de temps. Stockez le graphique distance / vitesse résultant dans un répertoire de données.
Au moment de l'exécution, reconstruisez le graphique et branchez votre vitesse actuelle et votre vitesse cible pour obtenir une distance. À cette distance de votre point cible, vous devez être au maximum.
L'avantage de cette approche est que vous pouvez l'utiliser pour freiner exactement à n'importe quelle vitesse. L'inconvénient est que si vos freins doivent être activés ou désactivés, vous ne serez jamais exactement sur la courbe.
la source
Comme dit précédemment, cette situation est parfaite pour les comportements de pilotage, mais je voudrais juste l'étendre légèrement. Le comportement Arrive serait parfait pour ce scénario. Vous pouvez également prendre en compte les obstacles. Vous pouvez également utiliser le comportement d'évitement d'obstacles ici.
Malheureusement, http://www.red3d.com/cwr/steer/ ne fournit pas de code source pour les comportements. Cependant, la programmation de Game AI par exemple fait et explique les comportements en morceaux faciles à comprendre. Si vous ne pouvez pas obtenir le livre, vous pouvez toujours obtenir le code source ici: http://www.wordware.com/files/ai/
De plus, si vous souhaitez étendre votre mouvement pour inclure la recherche de chemin, vous pouvez avoir une classe de pathfinder qui calcule le chemin (peut-être comme une collection de vecteurs 2D) et utiliser le comportement de direction Path Follow pour l'ajouter également dans le mix.
Le code source auquel j'ai lié fournit également trois méthodes différentes de combinaison de ces comportements de pilotage.
J'espère que cela pourra aider.
la source
Se diriger vers une position n'est pas trop difficile, mais j'ai personnellement lutté pendant un moment avec le problème de se diriger vers une position et de l'atteindre à une vitesse spécifique, ou de suivre un chemin avec des contraintes de vitesse.
J'ai résolu le problème en utilisant une courbe Hermite . Réglez p0 et m0 sur la position et les vitesses de votre navire, p1 et m1 sur votre position et vitesse cible. Cela suppose que vous souhaitez que le vaisseau suive une seconde après la cible. Calculez la dérivée seconde de p (0), qui vous donnera l'accélération à appliquer à votre vaisseau.
Voici le code de la dérivée seconde (en F #, j'espère que vous pourrez l'adapter à la langue de votre choix; sq () calcule le carré, les guillemets simples non interprétés comme des guillemets mais comme des caractères, ils font partie de l'identifiant):
Notez que si votre vaisseau est soumis à des forces externes (par exemple la gravité des planètes), vous devrez en tenir compte lors du calcul de la poussée à partir de l'accélération.
la source
Trouvé récemment - les comportements de pilotage dans JavaScript et le traitement:
http://shawnldoria.com/works/steering-behaviors.html
la source
Je pense que votre vaisseau devrait avoir des paramètres comme: la position et la vitesse.
La vitesse est dans chaque trame somme de toutes les forces (comme la gravité, les explosions, les entrées de l'utilisateur, etc.) et peut également avoir une sorte d'humidité.
La position est calculée à partir de la dernière position plus la vitesse * time_step.
Cependant, avec cela, il peut être difficile d'implémenter l'arrêt sur la cible.
la source