Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

Usando malhas de navegação

../../_images/nav_meshes.webp

As versões 2D e 3D da malha de navegação estão disponíveis como NavigationPolygon e NavigationMesh, respectivamente.

Nota

Uma malha de navegação apenas descreve uma área atravessável para a posição central de um agente. Quaisquer valores de raio que um agente possa ter são ignorados. Se você deseja que a busca de caminhos leve em consideração o tamanho (de colisão) de um agente, você precisa encolher a malha de navegação de acordo.

A navegação funciona de forma independente de outras partes da engine, como renderização ou física. As malhas de navegação são as únicas coisas consideradas ao fazer a busca de caminhos; por exemplo, os visuais e as formas de colisão são completamente ignorados pelo sistema de navegação. Se você precisar levar outros dados em consideração (como os visuais, por exemplo) ao fazer a busca de caminhos, precisará adaptar suas malhas de navegação de acordo. O processo de fatorar as restrições de navegação nas malhas de navegação é comumente chamado de geração (baking) de malha de navegação.

Comparação de polígono de malha de navegação convexo vs côncavo

Uma malha de navegação descreve uma superfície na qual um agente pode ficar de pé com segurança com o seu centro, em comparação com as formas físicas que descrevem os limites externos de colisão.

Se você tiver problemas de recorte (clipping) ou colisão ao seguir caminhos de navegação, lembre-se sempre de que você precisa dizer ao sistema de navegação quais são as suas intenções por meio de uma malha de navegação apropriada. Por si só, o sistema de navegação nunca saberá "isto é uma forma de colisão de árvore / rocha / parede ou uma malha visual", porque ele apenas sabe que "aqui me disseram que posso seguir o caminho com segurança porque está em uma malha de navegação".

A geração de malha de navegação pode ser feita usando um NavigationRegion2D ou NavigationRegion3D, ou usando a API do NavigationServer2D e NavigationServer3D diretamente.

Gerando uma malha de navegação com uma NavigationRegion

Passos para assar malha de navegação

Gerando uma malha de navegação com deslocamento do raio do agente a partir da geometria.

A geração de malha de navegação tornou-se mais acessível com o nó NavigationRegion. Ao gerar com um nó NavigationRegion, as etapas individuais de análise (parsing), geração (baking) e atualização de região são combinadas em uma única função.

Os nós estão disponíveis em 2D e 3D como NavigationRegion2D e NavigationRegion3D, respectivamente.

Dica

O source_geometry_mode da malha de navegação pode ser alterado para analisar nomes de grupos de nós específicos, de modo que os nós que devem ser gerados possam ser colocados em qualquer lugar da cena.

Quando um nó NavigationRegion2D é selecionado no Editor, as opções de geração, bem como as ferramentas de desenho de polígonos, aparecem na barra superior do Editor.

../../_images/nav_region_baking_01.webp

Para que a região funcione, um recurso NavigationPolygon precisa ser adicionado.

As propriedades para analisar e gerar uma malha de navegação fazem parte do recurso utilizado e podem ser encontradas no Inspetor do recurso.

../../_images/nav_region_baking_02.webp

O resultado da análise da geometria de origem pode ser influenciado pelas seguintes propriedades.

  • O parsed_geometry_type que filtra se objetos visuais, objetos de física ou ambos devem ser analisados a partir da SceneTree. Para mais detalhes sobre quais objetos são analisados e como, consulte a seção sobre análise de geometria de origem abaixo.

  • O collision_mask filtra quais objetos de colisão de física são incluídos quando o parsed_geometry_type inclui colisores estáticos (static colliders).

  • O source_geometry_mode que define em qual(is) nó(s) iniciar a análise e como percorrer a SceneTree.

  • O source_geometry_group_name é usado quando apenas um determinado grupo de nós deve ser analisado. Depende do source_geometry_mode selecionado.

Com a geometria de origem adicionada, o resultado do pré-cálculo(baking) pode ser controlado com as seguintes propriedades.

  • O cell_size define o tamanho da grade de rasterização e deve corresponder ao tamanho do mapa de navegação.

  • O agent_radius encolhe a malha de navegação gerada para ter margem suficiente para o tamanho (de colisão) do agente.

A geração do NavigationRegion2D também pode ser usada em tempo de execução com scripts.

var on_thread: bool = true
bake_navigation_polygon(on_thread)

Para testar rapidamente a geração 2D com as configurações padrão:

  • Adicione um NavigationRegion2D.

  • Adicione um recurso NavigationPolygon ao NavigationRegion2D.

  • Adicione um Polygon2D abaixo do NavigationRegion2D.

  • Desenhe 1 contorno de NavigationPolygon com la ferramenta de desenho do NavigationRegion2D selecionada.

  • Desenhe 1 contorno de Polygon2D dentro do contorno do NavigationPolygon com a ferramenta de desenho do Polygon2D selecionada.

  • Pressione o botão de geração do Editor e uma malha de navegação deverá aparecer.

../../_images/nav_region_baking_01.webp ../../_images/nav_mesh_mini_2d.webp

Assando uma malha de navegação com o NavigationServer

O NavigationServer2D e o NavigationServer3D possuem funções de API para chamar cada etapa do processo de geração de malha de navegação individualmente.

  • parse_source_geometry_data() pode ser usado para analisar a geometria de origem em um recurso reutilizável e serializável.

  • bake_from_source_geometry_data() pode ser usado para gerar uma malha de navegação a partir de dados já analisados, por exemplo, para evitar problemas de desempenho em tempo de execução com análise (redundante).

  • bake_from_source_geometry_data_async() é o mesmo, mas prepara a malha de navegação adiada com partes_paralelizáveis, não bloqueando a parte principal(main thread).

Comparado a uma NavigationRegion, o NavigationServer oferece um controle mais fino sobre o processo de geração de malha de navegação. Por sua vez, é mais complexo de usar, mas também fornece opções mais avançadas.

Algumas outras vantagens do NavigationServer em relação a uma NavigationRegion são:

  • O servidor pode analisar a geometria de origem sem gerar, por exemplo, para armazená-la em cache para uso posterior.

  • O servidor permite selecionar manualmente o nó raiz no qual iniciar a análise da geometria de origem.

  • O servidor pode aceitar e gerar a partir de dados de geometria de origem gerados proceduralmente.

  • O servidor pode gerar múltiplas malhas de navegação em sequência enquanto (re)utiliza os mesmos dados de geometria de origem.

Para gerar malhas de navegação com o NavigationServer, a geometria de origem é necessária. A geometria de origem é o conjunto de dados geométricos que deve ser considerado em um processo de geração de malha de navegação. Ambas as malhas de navegação para 2D e 3D são criadas gerando-as a partir da geometria de origem.

As versões 2D e 3D dos recursos de geometria de origem estão disponíveis como NavigationMeshSourceGeometryData2D e NavigationMeshSourceGeometryData3D, respectivamente.

A geometria de origem pode ser uma geometria analisada a partir de malhas visuais, de colisão de física ou matrizes de dados criadas proceduralmente, como contornos (2D) e faces de triângulos (3D). Por conveniência, a geometria de origem é comumente analisada diretamente a partir de configurações de nós na SceneTree. Para gerações (re-bakes) de malhas de navegação em tempo de execução, esteja ciente de que a análise geométrica sempre acontece na thread principal.

Nota

A SceneTree não é thread-safe. A análise da geometria de origem a partir da SceneTree só pode ser feita na thread principal.

Aviso

Os dados de malhas visuais e polígonos precisam ser recebidos da GPU, interrompendo (stalling) o RenderingServer no processo. Para a geração em tempo de execução, prefira usar formas de física como geometria de origem analisada.

A geometria de origem é armazenada dentro de recursos para que a geometria criada possa ser reutilizada para múltiplas gerações. Por exemplo, gerar múltiplas malhas de navegação para diferentes tamanhos de agentes a partir da mesma geometria de origem. Isso também permite salvar a geometria de origem no disco para que possa ser carregada mais tarde, por exemplo, para evitar o custo de processamento de analisá-la novamente em tempo de execução.

Os dados geométricos devem ser, em geral, mantidos muito simples. Tantas arestas quantas forem necessárias, mas o mínimo possível. Especialmente em 2D, geometrias duplicadas e aninhadas devem ser evitadas, pois forçam o cálculo de buracos em polígonos, o que pode resultar em polígonos invertidos. Um exemplo de geometria aninhada seria uma forma menor de StaticBody2D colocada completamente dentro dos limites de outra forma de StaticBody2D.

Assando pedaços de malha de navegação para mundos grandes

Construindo pedaços de malha de navegação

Construindo e atualizando blocos (chunks) individuais de malha de navegação em tempo de execução.

Ver também

Você pode ver o assamento de pedaços de malha de navegação em ação nos projetos de demonstração Navigation Mesh Chunks 2D e Navigation Mesh Chunks 3D.

Para evitar arestas desalinhadas entre diferentes blocos de região, as malhas de navegação possuem duas propriedades importantes para o processo de geração de malha de navegação: o limite de geração (baking bound) e o tamanho da borda (border size). Juntos, eles podem ser usados para garantir arestas perfeitamente alinhadas entre os blocos de região.

Bloco de malha de navegação com limite de geração e tamanho da borda

Bloco de malha de navegação gerado com limite de geração ou gerado com tamanho de borda adicional.

O limite de geração, que é um Rect2 alinhado aos eixos para 2D e um AABB para 3D, limita a geometria de origem usada descartando toda a geometria que estiver fora dos limites.

As propriedades de NavigationPolygon baking_rect e baking_rect_offset podem ser usadas para criar e posicionar o limite de geração 2D.

As propriedades de NavigationMesh filter_baking_aabb e filter_baking_aabb_offset podem ser usadas para criar e posicionar o limite de geração 3D.

Com apenas o limite de geração definido, outro problema ainda existe. A malha de navegação resultante será inevitavelmente afetada por deslocamentos necessários como o agent_radius, o que faz com que as arestas não se alinhem corretamente.

Pedaços de malha de navegação com lacunas

Blocos de malha de navegação com lacunas perceptíveis devido ao deslocamento do raio do agente gerado.

É aqui que entra a propriedade border_size para malhas de navegação. O tamanho da borda é uma margem interna a partir do limite de geração. A característica importante do tamanho da borda é que ele não é afetado pela maioria dos deslocamentos e pós-processamentos, como o agent_radius.

Em vez de descartar a geometria de origem, o tamanho da borda descarta partes da superfície final da malha de navegação gerada. Se o limite de geração for grande o suficiente, o tamanho da borda pode remover as partes problemáticas da superfície, de modo que reste apenas o tamanho pretendido do bloco.

Pedaços de malha de navegação sem lacunas

Blocos de malha de navegação com arestas alinhadas e sem lacunas.

Nota

Os limites de geração precisam ser grandes o suficiente para incluir uma quantidade razoável de geometria de origem de todos os blocos vizinhos.

Aviso

Em 3D, a funcionalidade do tamanho da borda é limitada ao eixo xz.