Atualmente, estou simulando forças de impacto físico para evitar unidades locais, mas esse método às vezes empurra as unidades para fora de formação e tem efeitos muito indesejáveis quando as unidades se aglomeram.
Para jogos RTS como Starcraft 2, como é feita a prevenção local? A física é simulada ou um controlador onipotente decide onde tudo deve estar? Sei que essa pergunta pode ser um pouco ampla, estou perguntando especificamente como obter os comportamentos locais de prevenção de Starcraft 2; embora qualquer coisa que funcione será muito apreciada.
Não estou procurando nenhum código - apenas recursos úteis ou explicações sobre como o Starcraft 2 (ou jogos similares) lida com a prevenção local.
Atualmente, tenho detecção de colisão (com vetor de penetração), forças de colisão e movimento por velocidade implementados. Cada unidade é comparada com outra em busca de uma colisão - se elas colidem, os objetos são imediatamente deslocados pelo vetor de penetração e a força de colisão é aplicada. Em seguida, outro loop move os objetos de acordo com suas velocidades e aplica um arrasto às velocidades. A compensação mitiga o problema de forças de colisão excessivas aplicadas em unidades agrupadas, mas as unidades ainda às vezes disparam.
A solução que estou procurando precisa atender aos seguintes requisitos (como no Starcraft 2):
- Objetos não devem se sobrepor; ou pelo menos as sobreposições devem ser eventualmente resolvidas.
- Os objetos não se afastam mais do que o necessário, para que duas unidades possam ficar em pé e se moverem juntas em uma formação.
- Não deve haver comportamentos estranhos quando os objetos se aproximam do mesmo destino.
- Pode suportar unidades de tamanhos diferentes e até formas convexas diferentes.
O que eu tenho pensado até agora é, em vez de detectar colisões, detectar colisões futuras para que a sobreposição nunca aconteça. Aplique a restrição, certificando-se de que as velocidades das duas unidades não as sobreponham. Ainda estou mexendo no algoritmo para restringir o movimento além da sobreposição.