Pathfinding: Malha de Navegação Baseada em Mosaico

8

Estou desenvolvendo um RTS baseado em blocos em tempo real. Este é um exemplo de mapa:

Mapa

Este mapa consiste em 4 regiões com 256 blocos cada. Azulejos azuis representam obstáculos. As unidades podem se mover nas oito direções padrão. As unidades são ligadas a blocos; um bloco pode conter uma unidade.

Estes são alguns exemplos dos caminhos ideais que estou procurando. Material típico A *:

insira a descrição da imagem aqui

Minha pergunta é: Uma malha de navegação é aplicável a um RTS baseado em bloco? Eu só vi mapas de navegação usados ​​em jogos em que as unidades são livres e não estão ligadas a uma grade de peças. Como seria a malha de navegação neste mapa em particular? Um exemplo de imagem seria excelente.

mario_sunny
fonte
Pelo que vale a pena, lembro-me de ouvir que algumas das "estranhezas" dos caminhos de Starcraft I foram devidas à decisão tardia de mudar de 2d para 3d isométrico - todo o código de caminho foi escrito esperando ter terreno 2d!
Raven Dreamer

Respostas:

10

Sim, malhas de navegação ainda são aplicáveis ​​a jogos baseados em blocos. Embora, eles seriam usados ​​principalmente como uma otimização. Por exemplo, converti a parte inferior esquerda da sua imagem para usar uma malha de navegação:

insira a descrição da imagem aqui

Nesse caso, cada quadrado verde seria um nó de navegação. Como você pode ver, isso reduz drasticamente o número de nós que o A * precisa processar. As unidades podem simplesmente seguir o caminho para o centro de cada um desses nós.

A geração desses nós é um problema diferente. Pode ser complexo decidir como formar os nós. Existem algumas perguntas no site em que você pode encontrar algumas idéias sobre como gostaria de implementar isso:

Subdividir um polígono em caixas de tamanhos variados

Identificando padrões quad em uma matriz bidimensional

/programming/20220215/minimum-number-of-rectangles-in-shape-made-from-rectangles

Essa malha de navegação também pode ser essencialmente usada como um caminho de "primeira passagem". Se um caminho for encontrado através da malha de navegação, você saberá que existe um caminho. Este é um teste mais rápido para verificar se dois pontos estão conectados.

MichaelHouse
fonte
11
Estou tendo dificuldade para entender como isso é superior ao A * puro. Como sua navmesh otimizaria o cálculo de localização de caminhos para o caminho verde na resposta original, por exemplo?
Mario_sunny 15/02
4
O caminho verde possui 15 nós, o caminho da malha possui 5. Isso nem inclui o número de becos sem saída que precisam ser analisados ​​ao encontrar esse caminho. O objetivo da malha de navegação não é necessariamente fazer as rotas mais diretas, é reduzir a quantidade de nós que o A * precisa pesquisar, aumentando drasticamente a velocidade do A *. Existem estratégias para colocar nós na malha de navegação que podem encontrar um equilíbrio entre caminhos diretos e menos nós (por exemplo, nós em cada canto de todos os obstáculos). Também há otimizações que podem ser executadas no caminho finalizado.
MichaelHouse
Estou começando a entender. O caminho verde pareceria diferente com a otimização de navmesh? Você parece estar sugerindo que a unidade se moverá para o centro de cada retângulo a caminho do ponto final. Você está sugerindo que as otimizações pós-A * encurtariam o caminho?
Mario_sunny 15/02
3
Sim, se você usasse o centro de cada nó, o caminho pareceria diferente. No entanto, você pode optar por usar algo diferente do centro (como se pudesse usar os cantos de cada nó). Ou você pode fazer com que seus nós não sejam maiores que quatro quadrados (criando menos nós, mas fazendo com que os nós sigam a geometria mais perto). Ou você pode executar algumas otimizações no caminho para ser mais direto depois de encontrá-lo. Você pode até usar o nav-mesh como primeira passagem e, em seguida, usar A * para percorrer cada nó (permitindo "percorrer conforme você avança") enquanto a unidade está em movimento, espalhando o impacto no desempenho ao longo do tempo.
MichaelHouse