Actualmente, estoy simulando las fuerzas de impacto de la física para evitar las unidades localmente, pero este método a veces empuja a las unidades fuera de la formación y tiene efectos muy indeseables cuando las unidades se agrupan.
Para juegos RTS como Starcraft 2, ¿cómo se hace la evasión local? ¿Se simula la física o un controlador omniciente decide dónde debe estar todo? Sé que esta pregunta puede ser un poco amplia, por lo que pregunto específicamente cómo lograr los comportamientos locales de evitación de Starcraft 2; aunque cualquier cosa que funcione será muy apreciada.
No busco ningún código, solo recursos útiles o explicaciones de cómo Starcraft 2 (o juegos similares) maneja la evasión local.
Actualmente, tengo implementada la detección de colisión (con el vector de penetración), las fuerzas de colisión y el movimiento por velocidad. Cada unidad se compara con otra para una colisión: si chocan, los objetos se compensan inmediatamente por el vector de penetración y luego se aplica la fuerza de colisión. Luego, otro bucle mueve los objetos por sus velocidades y aplica resistencia a las velocidades. El desplazamiento mitiga el problema de las fuerzas de colisión excesivas aplicadas en unidades agrupadas, pero las unidades a veces aún disparan.
La solución que busco debe cumplir los siguientes requisitos (como en Starcraft 2):
- Los objetos no deben superponerse; o al menos las superposiciones deben resolverse finalmente.
- Los objetos no se alejan más de lo necesario para que 2 unidades puedan pararse y moverse una al lado de la otra en una formación.
- No debería haber ningún comportamiento extraño cuando los objetos se agrupan hacia el mismo destino.
- Puede soportar unidades de diferentes tamaños, e incluso diferentes formas convexas.
En lo que he estado pensando hasta ahora es en lugar de detectar colisiones, detectar colisiones futuras para que la superposición nunca ocurra. Luego aplique la restricción, asegurándose de que las velocidades de las 2 unidades no hagan que se superpongan. Todavía estoy jugando con el algoritmo para restringir el movimiento más allá de la superposición.