Estratégias para lidar com multidões em pontos de estrangulamento

9

Recentemente, mudei meu mecanismo de jogo dos comportamentos de direção para o movimento baseado em impulsos com uma resolução de colisão adequada com base no tempo. Isso resolveu muitos problemas (sem mais túneis, sim) e tornou a simulação muito mais estável. No entanto, com a estabilidade, surgiu um novo problema.

Problema de colisão na porta.

As três bolas começaram sua jornada perto da parte inferior da imagem, seu alvo era onde a bola rosa parou. No caminho, as bolas vermelhas e verdes ficaram presas no ponto de estrangulamento na parede.

Antes, eu podia confiar em erros de ponto flutuante e na instabilidade geral dos comportamentos de direcionamento para fazer as bolas verdes e vermelhas baterem umas nas outras até conseguirem passar pelo ponto de estrangulamento. Agora, com uma resolução de colisão adequada, as forças que atuam sobre as bolas se cancelam, o que resulta nas bolas permanecendo perfeitamente paradas.

Quais métodos são comumente usados ​​para resolver essas situações? Talvez algum tipo de sistema de enfileiramento prioritário funcione, embora eu possa vê-lo se tornar complexo quando precisar decidir a prioridade entre mais de 2 objetos.

Fibbles
fonte
Também estou decepcionado com a gestão de multidões. Você poderia adicionar alguns links sobre "movimento baseado em impulso" à pergunta?
Kromster
Um impulso é apenas força * tempo. O que eu estava tentando dizer era que havia mudado para um modelo fisicamente usando detecção de colisão contínua e não discreta. Comportamentos de direção realmente não respeitam coisas como as leis do movimento de Newton, eles foram projetados para imitar bandos de pássaros, em vez de serem uma simulação de física. Eu realmente não tenho nenhum link de gamedev para movimento, é realmente apenas física do ensino médio. No entanto, o livro de Christer Ericson, Real Time Collision Detection, é praticamente o código do jogo para detecção contínua de colisões.
Fibbles

Respostas:

3

Atribua a cada objeto móvel um índice exclusivo e proíba que um objeto com um índice mais alto mova um agente com um índice mais baixo. Isso permitirá que objetos 'mais antigos' deslizem objetos 'mais novos', mas não vice-versa e é menos sobrecarga que a fila. Essencialmente, o índice atua como uma prioridade de movimento.

Pikalek
fonte
11
Eu implementei isso e funciona em que as unidades não ficam mais presas, embora eu tenha que dizer que nem sempre é bonito. Algumas advertências: use apenas o índice para determinar a prioridade de objetos em movimento da mesma massa; objetos grandes devem empurrar objetos pequenos para fora do caminho naturalmente. Use apenas o índice para determinar a prioridade de objetos na mesma equipe. Um objeto inimigo não deve ser capaz de agir como um muro imóvel para um objeto jogador simplesmente porque foi gerado primeiro e, portanto, tem maior prioridade.
Fibbles
Eu não tinha considerado massa ou equipe; seus ajustes parecem a maneira lógica de corrigir minha resposta.
Pikalek
2

adicione tempo à localização do caminho

Aqui está um artigo que fala sobre esse cubo de tempo: http://www0.cs.ucl.ac.uk/staff/D.Silver/web/Applications_files/coop-path-AIWisdom.pdf

insira a descrição da imagem aqui

e aqui está uma implementação do Objective-C: http://allseeing-i.com/ASIPathFinder

insira a descrição da imagem aqui

Rakka Rage
fonte
11
Eu li e implementei isso antes. Mesmo com vários threads, não é muito útil na minha situação. Em um jogo RTS, pode haver centenas de unidades móveis e grades de mapas com mais de 500 quadrados de cada lado. A sobrecarga para calcular caminhos com base no tempo para cada unidade é muito alta. Só para acrescentar, não estou dizendo que a resposta do rakkarage está errada, é um algoritmo muito interessante. Só estou dizendo que as situações em que é útil são limitadas por sua complexidade.
Fibbles
ya eu apenas re-executar o meu algoritmo Encontrando o trajeto inteiro cada vez ao invés de compreender completamente e implementar isto, mas eu imagino que eu poderia ter que, eventualmente
Rakka Raiva
0

Na verdade, acho que você não deveria consertar. Se (eu acho) as setas indicam vetores de força aplicados a qualquer esfera, em qualquer posição da grade (provavelmente interpolada "bi-linearmente" ou da mesma forma, ou de alguma forma mais "analógica" do que apenas ser 0/1), então o o comportamento é fisicamente correto e você deve se felicitar por ter uma solução bem comportada.

As duas esferas estão em bom equilíbrio, pois ficam sentadas e se odeiam. Aparentemente, se eles se moverem um pouco para a direita, a "flecha de força" para a direita afeta um pouco mais a esfera do lado direito (e vice-versa na esfera do lado esquerdo; um pouco menos), e então eles voltam ao equilíbrio. Assim é como deve ser.

Imho, o que deve ser consertado é a parede, ou o tamanho da esfera, ou qualquer outra coisa entre as próprias pedras de compilação. Você criou uma impossibilidade e o comportamento correto nessa situação é, consequentemente, um impasse (desculpe-me por usar palavras incorretas, espero que você as entenda de qualquer maneira :-)).

Talvez, em vez disso, desative as setas de força esquerda / direita mais próximas ou organize-as de outra maneira que não seja simétrica e não incentive o equilíbrio ?

Eu acho que seria uma solução ruim corrigi-lo artificialmente ... ficaria peludo muito cedo.

Ventobravo
fonte
Isso não responde à pergunta. Entendo sua motivação, mas no final das contas a questão é como lidar com a situação. Nós não sabemos as intenções de jogo, então julgar se isso é um problema ou não depende de Fibbles. Mudar a parede pode mudar a finalidade do ponto de estrangulamento. A questão é um problema válido que pode ser resolvido.
Felsir 19/05/19
Minha resposta é basicamente: (re) organize as forças ou reorganize outra coisa no cenário, mas não embaralhe o solucionador de física (" Imho, o que deve ser consertado é a parede, o tamanho da esfera ou algo mais entre as pedras de compilação eles mesmos. "). A pergunta é " Quais métodos são comumente usados ​​para resolver essas situações?" Eu acho que meu A é muito um "método comumente usado" e muito uma solução para o problema. Por exemplo, jogos de minigolfe online (que o Q lembra muito) sufocam as bolas, se o ambiente está pedindo que isso aconteça. A física errática é uma maneira ruim, imo.
Stormwind
Concordo que o solucionador de física deve permanecer intacto. A pergunta indica que as esferas devem buscar o alvo, basicamente como alterar os comportamentos dos agentes (portanto, não a física ou o layout do nível). Alterar o layout do nível pode resolver essa ocorrência, mas pode aparecer em um layout diferente. Portanto, a questão é diferente do exemplo de minigolfe que você fornece, pois nesse caso a questão é evitar especificamente um impasse.
Felsir
Como você vê, também proponho reorganizar as forças na resposta. Parece ser pouco depois disso :-).
Stormwind
Reorganizar as paredes ou alterar o tamanho da esfera não é viável no meu caso, embora possa ser em outros. A captura de tela é do modo de depuração de um mecanismo RTS. Existem muitos tamanhos de unidades diferentes e as paredes podem ser colocadas à vontade pelo jogador. As setas que você vê são geradas pelo meu algoritmo Fast Flow Fields. São vetores normalizados que são usados ​​para influenciar a direção de deslocamento das unidades móveis. Não é possível alterar o comprimento dos vetores, porque todas as unidades móveis no grupo compartilham o mesmo campo de fluxo.
Fibbles