AI pour déplacer des vaisseaux spatiaux de forme personnalisée (forme affectant le comportement de mouvement)

15

Je conçois un jeu de stratégie de combat de flotte spatiale 3D-6DOF en réseau au tour par tour qui repose fortement sur la personnalisation des navires. Permettez-moi d'expliquer un peu le jeu, car vous devez en savoir un peu pour poser la question.

Ce que je vise, c'est la possibilité de créer votre propre flotte de navires avec des formes personnalisées et des modules attachés (hélices, poutres de tracteur ...) qui donneraient des avantages et des inconvénients à chaque navire, vous avez donc beaucoup de distributions de flotte différentes. Par exemple, un long navire avec deux hélices sur le côté permettrait au navire de tourner facilement autour de cet avion, les plus gros navires se déplaceraient lentement à moins que vous placiez beaucoup d'hélices à l'arrière (dépensant ainsi plus de points de "construction" et d'énergie lors du déplacement, et il n'avance que dans cette direction.) Je prévois d'équilibrer tout le jeu autour de cette fonctionnalité.

Le jeu s'articulerait autour de deux phases: les ordres et la phase de combat. Pendant la phase des commandes, vous commandez les différents navires. Lorsque tous les joueurs ont terminé la phase d'ordre, la phase de combat commence et les ordres du navire sont résolus en temps réel pendant un certain temps, puis l'action s'arrête et il y a une nouvelle phase d'ordres.

Le problème vient quand je pense à l'entrée du lecteur. Pour déplacer un navire, vous devez activer ou désactiver différentes hélices si vous voulez diriger, avancer, freiner, tourner en place ... Ces hélices n'ont pas à fonctionner à leur pleine puissance, vous pouvez donc réaliser plus de mouvement combinaisons avec moins d'hélices.

Je pense que cette approche est un peu ennuyeuse. Le joueur ne veut pas jouer avec des moteurs ou quoi que ce soit, vous voulez juste BOUGER et TUER. La façon dont j'ai l'intention que le joueur donne des ordres à ces navires est par une destination et une rotation , puis l'IA calculera la puissance correcte de l'hélice pour réaliser ce mouvement et cette rotation. La propulsion ne doit pas être la même pendant tout le calcul du tour (après que les ordres ont été donnés), donc ce serait cool si les navires réagissaient en se déplaçant, ajustant la puissance des hélices à leurs besoins de manière dynamique, mais cela peut être trop difficile à mettre en œuvre et ce n'est pas vraiment nécessaire pour que le jeu fonctionne.

Dans les deux cas, comment cette IA déciderait-elle des hélices à activer pour la meilleure (ou du moins pas la pire) trajectoire à atteindre?

J'ai pensé à certaines approches:

  • Apprendre l'IA: Les types de vaisseaux apprendraient leurs mouvements par essais et erreurs, ajustant leur comportement avec plus d'utilisations et devenant finalement "intelligents". Je ne veux pas m'impliquer jusque-là dans le codage de l'IA, et je pense que cela peut être frustrant pour le joueur (même si vous pouvez le laisser apprendre sans jouer).
  • Mouvement temporel pré-calculé: Lors de la création du navire, TOUS les mouvements possibles sont calculés pour chaque configuration d'hélice et puissance pour un temps delta donné. Mémoire intensive, moche, mauvaise.
  • Trajectoires précalculées: les mêmes que ci-dessus mais pas pour chaque delta-temps mais l'ensemble de la trajectoire, qui serait alors ajustée autant que possible. Nécessite une configuration d'hélice fixe pour toute la phase de combat et est toujours gourmand en mémoire, laid et mauvais.
  • Forçage brutal continu: l'IA vérifie continuellement TOUTES les configurations d'hélices possibles tout au long de la phase de combat, précalcule quelques pas de temps et décide laquelle est la meilleure en fonction de cela. Inconvénients: ce qui est bien maintenant pourrait ne pas être aussi bon plus tard, et c'est trop gourmand en CPU, laid et mauvais aussi.
  • Forçage brut simple: idem que ci-dessus, mais uniquement forçage brut au début de la simulation, il nécessite donc une configuration d'hélice constante tout au long de la phase de combat.
  • Vérification de l'angle continu: Ce n'est pas une méthode de mouvement complet, mais peut-être un moyen d'éliminer les configurations d'hélices "stupides". Étant donné le vecteur normal de l'hélice actuelle et le vecteur final, vous pouvez approximer la puissance nécessaire pour l'hélice en fonction de l'angle. Vous devez le faire en continu pendant toute la phase de combat. J'ai compris celui-ci récemment, donc je n'y ai pas trop réfléchi. A priori, il a aussi l'inconvénient "ce qui est bien maintenant peut-être pas si bon plus tard", et il ne se soucie pas des autres hélices qui peuvent agir ensemble pour faire une meilleure configuration de propulsion.

Je suis vraiment coincé ici. Des idées?

kaoD
la source
Avez-vous étudié les comportements de pilotage?
stonemetal
1
@stonemetal bien sûr. Le problème ici est que les comportements de pilotage sont généralement modélisés en supposant un contrôle total de la position et de la rotation de l'objet et de certaines contraintes (ou du moins c'est ce que j'ai trouvé sur le Web.) L'IA ici n'a pas le contrôle total sur l'entité , mais uniquement sur des éléments (hélices) qui font bouger l'entité. J'ai du mal à relier ces comportements de pilotage à la locomotion réelle du vaisseau spatial.
kaoD
c'est la même raison pour laquelle les comportements de direction ne fonctionnent pas trop bien sur les voitures de course. Les comportements de pilotage sont excellents mais ils ne sont pas la solution universelle à tout.
tenpn
@haoD Je pensais à quelque chose dans le sens de ce que ghostonline a répondu. Laissez-les construire quoi que ce soit, puis traduisez-le en contraintes pour un comportement de pilotage. Bien que d'après votre réponse, il semble que les comportements de pilotage ne soient probablement pas assez flexibles tels quels.
stonemetal
1
Je sais que c'est super vieux, mais ce que vous cherchez s'appelle la planification de mouvement
cinodynamique

Réponses:

4

Désolé, nous n'avons pas de solution éprouvée, mais cela ne peut-il pas être résolu mathématiquement?

Compte tenu de l'hélice et de son décalage par rapport au centre de gravité, vous pouvez calculer le plan dans lequel vous pouvez tourner.

Pour tout mouvement, vous pouvez utiliser 1 ou plusieurs hélices. Chaque hélice peut être interrogée pour voir si son avion peut contribuer à l'orientation cible, combien d'efforts il faudrait de l'hélice pour contribuer (les hélices éloignées du CoM peuvent utiliser moins d'énergie pour générer plus de virage), et à quelle distance cela se ferait vous à l'oritentation cible. Ensuite, vous A * à travers cet espace de recherche jusqu'à ce que vous trouviez une solution à faible coût, qui pourrait être le moins d'énergie totale utilisée ou le mouvement le plus rapide.

Continuez à réévaluer cela à mesure que vous terminez le virage et modérez la puissance à l'approche de la cible, peut-être avec un contrôleur PID.

Pour le mouvement vers l'avant, une solution simple vous conduirait toujours vers l'avant, diminuant votre vitesse cible lorsque vous vous approchez de la cible. Comme vous disposez d'un espace 3D pour jouer, vous pouvez éviter les routines de virage complexes à 3 points. Vous auriez besoin de prendre en compte la sortie des hélices choisies pour la vitesse en ligne droite dans vos calculs de virage, comme une sorte d'état initial.

C'est très en retrait, mais je ne vois aucun défaut majeur. Juste beaucoup de travail acharné et de peaufinage des nombres. :)

tenpn
la source
C'est ce que je cherchais, une solution mathématique ... merci! J'espère que cela deviendra aussi simple qu'il y paraît.
kaoD
7

Étant donné que vous souhaitez abandonner un peu de contrôle du joueur pour la jouabilité à l'aide d'une IA, vous voudrez peut-être également envisager de simplifier l'effet du virement sur les hélices et de modifier les dimensions du navire en paramètres moins faciles à gérer pour un algorithme informatique. Le joueur est toujours autorisé à ajouter des hélices sur une partie donnée du navire, mais une fois terminé, il est «compressé» en paramètres.

Chaque hélice affecte le taux de virage du navire ou, combinée à une hélice placée parallèlement, affecte le taux de déplacement dans une dimension spécifique. Combinez ces paramètres pour chaque hélice et vous obtenez la vitesse de rotation et la vitesse maximales pour un navire. Combinez ces deux paramètres pour chaque hélice et ensemble d'hélices dans le taux de virage et de vitesse maximum pour le navire dans son ensemble, pour toutes les dimensions disponibles (haut, bas, gauche, droite, avant, arrière).

En utilisant le taux de virage et la vitesse pour chaque dimension, vous disposez de suffisamment d'informations pour permettre au navire de se déplacer vers une destination. Le joueur verra l'effet de sa configuration d'hélice, mais sous le capot, son entrée est considérablement simplifiée. Vous pouvez proposer plus d'une stratégie de vol en fonction de la distance que le navire doit parcourir, pour rendre le vol plus naturel et augmenter le sentiment du joueur qu'il a exercé un contrôle sur le mouvement du navire. Mais au final, comme vous l'avez dit, peu importe comment le navire arrive à destination et si son itinéraire est optimal, il doit juste être là et son heure d'arrivée est influencée par la configuration de l'hélice.

Pour les dimensions du navire, vous pouvez les prendre en compte une fois que vous avez les valeurs de vitesse compressées pour un effet approximatif, ou les utiliser lors du calcul pour un effet plus précis. Vous voudrez probablement tester si la méthode précise en vaut la peine, car la différence pourrait ne pas affecter le sentiment de contrôle du joueur.

fantôme
la source
Pas exactement ce que je cherchais, mais pourrait faire l'affaire si j'en ai vraiment besoin. Vote positif pour l'idée :)
kaoD
0

Dans l'espace, la forme n'affecte pas le mouvement. Pas d'air pour traîner.

C'est le navire et la masse totale des modules complémentaires qui comptent. C'est un problème de gravité de poussée de masse plus simple. Vous pouvez donc faire ces calculs ou comme c'est un jeu au tour par tour, développer un système de mouvement comme les RPG comme Traveler.

gnoll110
la source
Bienvenue sur GD.SE! Cette question a déjà une réponse acceptée et a été posée il y a 2 ans - vous pourriez peut-être répondre à certaines des questions les plus récentes sur le site.
Polar
Oui, tout à fait vrai, mais je suppose toujours que d'autres tomberont dessus plus tard (comme je l'ai fait) et le trouveront d'une certaine utilité. hehe, je ne suis pas venu ici pour répondre aux questions… comme la plupart, chercher des solutions à mes propres problèmes.
gnoll110
Affiche @Polar question ici. J'ai trouvé sa réponse très intéressante! Je suis heureux qu'il soit revenu pour répondre, et je pense que l'ajout de valeur des années plus tard est l'une des parties les plus précieuses de SO.
kaoD
@ gnoll110 Je peux me tromper ici. Il n'y a pas de traînée, d'accord, mais l'angle que le vecteur de poussée forme avec le centre de masse affecte la façon dont le navire se déplace ou tourne ... n'est-ce pas? Par exemple: un moteur aligné avec le centre de masse se traduit, tout en le déplaçant hors du centre de masse ajoutera une composante tournante au navire.
kaoD
@kaoD Désolé si cela est apparu un peu dur - évidemment, beaucoup de SO ajoute de la valeur plus tard. Je suggérais simplement qu'il pourrait également répondre à de nouvelles questions - plus il y a de réponses, mieux c'est!
Polar