Pathfinding e Navegação de IA com SDF

EN NL ES PT-BR


A IA de jogos precisa responder perguntas espaciais constantemente. Onde está a cobertura mais próxima? Qual a distância que esta unidade pode percorrer antes de atingir um obstáculo? Que direção um inimigo em movimento lateral deve tomar para manter uma distância específica do jogador? SDFs transformam cada uma dessas perguntas em uma avaliação de campo: um número fornece a folga e um gradiente fornece a direção. Este artigo aborda as três principais cargas de trabalho de navegação: campos de distância ambientais para consultas de folga e posicionamento, direção baseada em gradiente para evitar obstáculos e campos de fluxo para movimento de multidões, e compara toda a abordagem com malhas de navegação tradicionais.

Para os fundamentos de como sinal e gradiente funcionam, comece com a visão geral de Campos de Distância com Sinal . Para o contexto do motor como um todo, veja SDFs no desenvolvimento de jogos .

Campos de Distância Ambiental como Dados de Navegação

Uma malha de navegação tradicional armazena regiões poligonais transitáveis com informações de conectividade. Um campo de distância armazena, em cada ponto do espaço, a distância até o obstáculo mais próximo. Essa informação adicional permite consultas que uma navmesh não consegue responder eficientemente.

O campo mais útil para navegação é o campo de distância sem sinal da geometria de obstáculos, o campo de distância ambiental (EDF, do inglês environmental distance field). Em qualquer posição do mundo, o EDF retorna a distância até a parede ou obstáculo mais próximo. Um valor de 2.0 significa que o agente tem 2 metros de folga em todas as direções. Observe que aqui o campo não tem sinal: a navegação só precisa saber a que distância um ponto está do obstáculo mais próximo, não se está dentro de um, porque o espaço transitável é definido como estar fora de todos os obstáculos.

Isso dá suporte direto a:

  • Consultas de folga: uma unidade de raio rr pode ocupar uma posição sem intersectar nenhum obstáculo? Verifique se EDF(p)r\text{EDF}(\mathbf{p}) \geq r.
  • Seleção de cobertura: amostre posições candidatas e escolha a que tiver a melhor combinação de distância ao inimigo, distância à superfície de cobertura mais próxima e propriedades de linha de visada.
  • Caminhos de flanqueamento: calcule um caminho que mantenha uma distância mínima de um obstáculo em vez de seguir rente ao seu limite.

Cada uma dessas exigiria buscas repetidas do ponto mais próximo contra uma malha. Contra um EDF, são avaliações únicas, e é por isso que assar um EDF para a geometria estática do nível e consultá-lo por agente é o padrão.

Direção Baseada em Gradiente

O gradiente do campo de distância ambiental aponta para o obstáculo mais próximo. Para uma unidade que deseja manter uma distância fixa de uma parede, a força de direção pode combinar atração ao longo do caminho de navegação com repulsão das superfícies de obstáculos:

vec3 obstacleSteering(vec3 position, SDF environment, float preferredDistance) {
    float d = evaluateSDF(position, environment);
    if (d > preferredDistance * 2.0) return vec3(0.0);  // Too far to care

    vec3 gradient = normalize(gradientSDF(position, environment));

    // Push away if too close, pull toward if too far
    float error = d - preferredDistance;
    float strength = clamp(abs(error) / preferredDistance, 0.0, 1.0);
    return strength * sign(error) * gradient;
}

Quando a unidade está mais próxima do que a distância preferida, o erro é negativo e a força a empurra para longe do obstáculo. Quando está mais longe, a força a puxa em direção ao obstáculo. A magnitude aumenta linearmente de zero na distância preferida até a força total quando o erro de distância é igual à distância preferida. Isso cria um comportamento suave e natural de seguir paredes, sem segmentos de caminho explícitos.

Um exemplo trabalhado: distância preferida 1.0. Em uma posição onde o EDF lê 0.7, a unidade está 0.3 mais próxima do que o preferido, o erro é -0.3, a força é 0.3 e a força resultante é 0.3 unidades na direção oposta ao obstáculo. Com uma leitura de EDF de 1.4, a unidade está 0.4 longe demais, o erro é +0.4 e a força a puxa 0.4 unidades de volta em direção ao obstáculo. Entre os dois extremos, a força passa exatamente por zero na distância preferida, então a unidade se estabiliza em um deslocamento fixo: sem oscilação, porque a magnitude da força diminui conforme o erro diminui.

A direção baseada em gradiente se combina com o seguimento de caminho: o caminho fornece uma direção, a direção do EDF fornece o deslocamento do obstáculo, e os dois vetores são misturados com pesos. Unidades seguindo a parede de um corredor simplesmente se direcionam ao longo dela, e o parâmetro de distância preferida também funciona como controle de espaçamento de multidão quando as unidades compartilham o mesmo valor.

Campos de Fluxo para Movimento de Multidões

Para grandes números de agentes, calcular caminhos individuais se torna caro. Um campo de fluxo substitui o pathfinding por agente por um único campo vetorial global que todos os agentes seguem. O campo de fluxo é construído resolvendo a equação Eikonal a partir das localizações dos objetivos, o que produz um campo de distância a partir do objetivo. Em uma grade, isso é calculado com o algoritmo de Dijkstra ou um método fast marching: cada célula armazena o custo de viagem acumulado até o objetivo, e a direção do fluxo em uma célula aponta para o vizinho de menor custo, em direção ao objetivo.

Os agentes simplesmente leem a direção do fluxo em sua posição atual e se movem. Verificações de distância no objetivo os param quando chegam. O campo é recalculado apenas quando obstáculos ou objetivos mudam, o que o torna muito mais barato do que executar buscas A* individuais para centenas de unidades.

Essa técnica é usada em jogos de estratégia em tempo real, jogos de tower defense e qualquer cenário com multidões densas de unidades se movendo de forma independente. O fio condutor é que o campo de distância faz dupla função: seus valores codificam o comprimento do caminho até o objetivo, e seu gradiente codifica a direção do próximo passo.

Campos de Distância vs Malhas de Navegação para Pathfinding

PropriedadeMalha de navegaçãoCampo de distância
Consulta de distância ao obstáculo mais próximoBusca do ponto mais próximo em polígonosAvaliação de campo única
Folga em um pontoAproximada ou por polígonoExata a partir do campo
PathfindingA* sobre grafo de polígonosDijkstra ou A* sobre grade, ou campo de fluxo
MemóriaDados poligonais compactosAmostras de grade, dependente da resolução
Obstáculos dinâmicosReconstruir regiõesRecalcular ou atualizar localmente o campo
Comportamento de seguir paredesTruques de suavização de caminhosDireção natural por gradiente

As duas representações são complementares na prática. Navmeshes se destacam em pathfinding de longo horizonte com grafos esparsos e eficientes, e são a escolha padrão quando os agentes precisam de regiões transitáveis exatas com links, portas e escadas. Campos de distância se destacam em decisões locais: verificações de folga, deslocamento de obstáculos e roteamento de multidões densas. Um sistema de IA de produção costuma usar ambos: uma navmesh para rotas globais e um EDF assado para direção e posicionamento locais.

A principal limitação da abordagem de campo de distância é o custo de memória e atualização. Um EDF 3D sobre um nível grande consome memória dependente da resolução da grade, e assá-lo é uma etapa de pré-processamento que precisa ser repetida quando o nível muda. São as mesmas compensações abordadas em campos de distância com sinal assados , aplicadas aqui a dados de navegação em vez de dados de renderização.

Resumo

A navegação converte o contrato do SDF em três cargas de trabalho de IA:

  • Consultas de folga e posicionamento leem valores do EDF diretamente: este lugar é seguro para uma unidade de raio rr?
  • Direção baseada em gradiente usa o gradiente do EDF como um sinal de erro com sinal que empurra unidades muito próximas para longe e puxa unidades muito distantes em direção ao deslocamento preferido.
  • Campos de fluxo transformam a equação Eikonal em um único campo vetorial global que roteia multidões inteiras.

A mesma representação de campo assado alimenta as consultas de colisão que rodam sobre a mesma geometria estática do nível, então uma única gravação serve tanto para o sistema de IA quanto para o sistema de física.