Actuellement, je simule des forces d'impact physiques pour éviter localement les unités, mais cette méthode pousse parfois les unités hors de la formation et a des effets très indésirables lorsque les unités se regroupent.
Pour les jeux RTS comme Starcraft 2, comment l'évitement local se fait-il? La physique est-elle simulée ou un contrôleur omnicient décide où tout devrait être? Je sais que cette question pourrait être un peu large, donc je demande spécifiquement comment obtenir les comportements d'évitement locaux de Starcraft 2; bien que tout ce qui fonctionne sera très apprécié.
Je ne cherche pas de code - juste des ressources utiles ou des explications sur la façon dont Starcraft 2 (ou des jeux similaires) gère l'évitement local.
Actuellement, j'ai la détection de collision (avec vecteur de pénétration), les forces de collision et le mouvement par vitesse implémentés. Chaque unité est comparée à une autre pour une collision - si elles entrent en collision, les objets sont immédiatement décalés par le vecteur de pénétration, puis la force de collision est appliquée. Ensuite, une autre boucle déplace les objets par leurs vitesses et applique un glissement aux vitesses. Le décalage atténue le problème des forces de collision excessives appliquées aux unités regroupées, mais les unités tirent parfois encore.
La solution que je recherche doit répondre aux exigences suivantes (comme dans Starcraft 2):
- Les objets ne doivent pas se chevaucher; ou au moins les chevauchements doivent être finalement résolus.
- Les objets ne s'écartent pas plus que nécessaire, donc 2 unités peuvent se tenir debout et se déplacer l'une à côté de l'autre dans une formation.
- Il ne devrait pas y avoir de comportements étranges lorsque des objets s'agglutinent vers la même destination.
- Peut supporter des unités de différentes tailles et même de différentes formes convexes.
Ce à quoi j'ai pensé jusqu'à présent, c'est au lieu de détecter les collisions, de détecter les collisions futures afin que le chevauchement ne se produise jamais. Ensuite, appliquez la contrainte, en vous assurant que les vitesses des 2 unités ne les font pas se chevaucher. Je bricole toujours l'algorithme pour restreindre le mouvement au-delà du chevauchement.