Contrôle de l'IA pour un navire avec un modèle physique

19

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.

Petteri Hietavirta
la source
Je m'attends à rencontrer bientôt un problème similaire à celui-ci; J'ai hâte de voir des réponses à cela.
Bill

Réponses:

15

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.

bummzack
la source
+1. Pour un jeu spatial 2D, je recommanderais d'utiliser les comportements de pilotage comme cadre et d'utiliser l'une de mes réponses comme composant dans ce cadre.
tenpn
J'allais suggérer la même chose en lisant la question. J'ai beaucoup utilisé le comportement de direction, c'est facile et permet une assez bonne AI / motion.
dotminic
5

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.

tenpn
la source
1

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.

Ray Dey
la source
Le lien red3d.com ne fournit pas de sources directement , mais il y a un lien directement sur cette page vers OpenSteer ( opensteer.sourceforge.net ) qui est une implémentation open source des comportements de pilotage.
bummzack
Ahh ne le savait pas, merci. Cependant, j'ai regardé la source d'OpenSteer et j'ai trouvé plus facile de regarder le plus évident dans votre code de visage trouvé dans le livre de Buckland. Surtout au début.
Ray Dey
1

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):

    let h'' t =
        let h00'' t = 12.0 * t - 6.0
        let h10'' t = 6.0 * t - 4.0
        let h01'' t = -12.0 * t + 6.0
        let h11'' t = 6.0 * t - 2.0

        let t = (t - t0) / diff_t

        (sq (1.0 / diff_t)) *
        ((h00'' t * p0) +
         (h10'' t * diff_t * v0) +
         (h01'' t * p1) +
         (h11'' t * diff_t * v1))

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.

Joh
la source
-3

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.

zacharmarz
la source
3
-1 Il semble que Petteri Hietavirta sait comment utiliser un système de physique de base. Donc, votre réponse à cette question est que s'arrêter sur une cible est trop difficile?
AttackingHobo