Como gerar uma grade de navegação para um mundo 3D?


11

Estou tentando encontrar uma solução para esse problema. Estou tentando criar uma malha de navegação no formato de uma grade de vértices bloqueados para x, y coordenadas com piso em forma de quadrados para o espaço 3D. Mas estou tendo problemas para tentar descobrir uma maneira de fazer isso.

Tentei procurar na biblioteca de reformulação. É um método bastante robusto, mas aparentemente diminui a velocidade com mapas maiores e espaço aberto. Também não sei como eles geram vértices e arestas para o espaço mundial com o mapa de altura.

Meu próximo pensamento foi fazer o que o Unreal Engine 3 costumava fazer.

https://udn.epicgames.com/Three/NavigationMeshReference.html

Que era usar raycasts para gerar a malha. Eu não conseguia descobrir como parar o raycasts.

Então ... minha próxima opção foi caixa, possivelmente uma caixa moldada. Crie um volume subdividido com um tamanho que seja uma potência de 2. Alinhe a caixa à grade e atire prismas retangulares para baixo como um raio. Se ele cair em um pedaço de geometria que faz parte do solo e o retângulo não estiver sendo cruzado, deixe um quadrado ali. E continue até que os limites do volume sejam atingidos. Para verificar se as arestas precisam ser vinculadas, suponho que eu possa verificar se a inclinação entre dois pares de vértices está dentro da inclinação que pode ser percorrida, mesclá-las se isso for verdade.

Meus principais problemas são ... isso não parece ser o ideal. Sem pensar nisso, na estimativa, o processo é O (N ^ 3) para um nível de várias camadas. O que pode ficar bem desagradável.

E o último bit é para criar automaticamente grupos retangulares desses quadrados. Não tenho muita certeza de como fazer isso. A implementação Unreal os separa por declives. No entanto, estou tentando manter o formato da grade. Portanto, isso não é totalmente necessário. Ainda existe o problema de criar grandes blocos retangulares para dividir o processo de localização de caminhos em uma base por bloco. Os ladrilhos não podem ser muito grandes nem muito pequenos.

Então as perguntas são ...

Qual seria uma maneira eficiente de gerar essa navmesh cingida? E qual seria uma boa maneira de criar os azulejos?


Quando você espera gerar a malha? Tempo de compilação, tempo de carregamento ou tempo real? Lutamos com esse mesmo problema e acabamos decidindo que era um exagero para o nosso cenário (geração de tempo de carregamento em um jogo de tiro de cima para baixo sem caminhos sobrepostos), decidimos seguir uma abordagem baseada em quatro árvores. Isso funcionou bem o suficiente para nós. Então, eu acho que o que estou perguntando é: você realmente precisa disso ou qual é a solução mais fácil que atenda aos seus requisitos iniciais, pois isso pode levar um tempo todo. Se você gerencia uma boa solução, eu adoraria saber como você a corrigiu.
Niels

@ Niels Eu pretendo pré-construir e depois carregá-lo no jogo.
usar o seguinte

Então o consumo de tempo não deve ser uma desvantagem inicial, pois o jogador não estará esperando por isso. Você sempre pode otimizar depois de ter algo funcionando.
Niels

Qual é o tamanho do seu nível? Nós usamos reformulação em grandes jogos e não tinha problema - você simplesmente precisa ajustar os valores TIIE, etc.
Steven

Acho que você está perdendo a parte "quadriculada". O que não é exatamente o mesmo que os blocos que a reformulação usa. Estou tentando descobrir como redefinir a reformulação para fazer uma coisa dessas. Mas tem sido principalmente um pesadelo.
usar o seguinte

Respostas:


1

Um mundo 3D básico pode ser representado por uma malha de navegação que pode ser convenientemente construída na maioria dos mecanismos de jogos. O ator pode viajar ao longo das bordas dos polígonos.

Essa seria uma solução simples. Existem muitos algoritmos para encontrar caminhos e gerar uma navmesh.

Gostaria de compartilhar algo que li há um tempo atrás.

Exemplo01

Isso descreve uma possível solução em que podemos dividir nosso mundo de jogo em quadrados. sempre que uma peça quadrada é adicionada ao jogo (quando o jogador se aproxima de uma área / terreno processual), uma peça quadrada é adicionada. No entanto, não precisamos mais calcular toda a navmesh. apenas calculamos esse bloco e o adicionamos ao gráfico existente. Ganho significativo de desempenho lá.

Exemplo02

O próximo problema abordado é o movimento irregular do exemplo anterior. Eu posso entender que, considerando curvas futuras e generalizando a direção, reduziria muito o movimento em zigue-zague e tornaria o movimento fluido. Jogos com animação detalhada não revelam isso, mas você pode notar isso em alguns jogos de mundo aberto, onde eu diria que a navegação é feita principalmente.

Quanto à pergunta, eu recomendo que você verifique a resposta do Kromster em uma lista de algoritmos de geração de navmesh.

Verifique também os Sistemas de IA do Left 4 Dead, dos quais os exemplos fazem parte. Muitos tópicos mais interessantes abordados

Boa sorte.


0

existem muitas maneiras, por que não torná-lo local para o jogador, fazer uma pequena grade que segue o jogador e verificar em cada interseção se é ou não transversável, como se houvesse um piso lá e fazer um raio para ver se há uma parede / edifício em qualquer lado próximo ..


Uma boa ideia, mas não viável para os objetivos finais. Preciso apoiar um mundo grande e permitir que a IA navegue de um lado de um continente para outro lado do continente. Isso é possível, mas eu precisaria ter uma grade de navegação fixa para gerar os nós mais altos.
moonshineTheleocat

0

Este é um problema que eu já vi em todos os lugares. O truque é "separação de preocupações". "Diga o que?", Ouvi você pensar. O que é exibido na tela NÃO é o que é a "estrutura de dados". Manter o visual separado dos dados para construir o visual é importante. Fazer isso sempre "prova o futuro" do seu jogo quando novas versões de software subjacentes são lançadas.

Crie uma estrutura de dados (aka: model) que represente o seu mundo dos jogos. Em seguida, construa uma "visualização" do modelo de estrutura de dados. Se você deseja mudar o mundo de uma grade quadriculada para uma grade hexagonal, a estrutura de dados (modelo) permanece a mesma, mas a exibição "pintará" (renderizará) uma exibição diferente.


4
Embora separar as preocupações seja realmente uma boa prática em geral, atualmente esta resposta é clara sobre detalhes específicos para responder à pergunta (por exemplo, como gerar um modelo adequado de busca de caminhos com base em grade a partir de um determinado conjunto de geometria mundial). Você está certo de que, seja qual for esse modelo, ele provavelmente deve ser separado dos dados usados ​​para desenhar o nível, mas, para responder à pergunta, ainda precisamos de um método para gerar esse modelo de busca de caminhos.
DMGregory

-2

Faça uma matriz dupla. E então, se um objeto / objetos for impossível de passar, tenha um método para informar à matriz que a posição não é passável. Quando uma IA tenta se mover, eles olham para a matriz dupla e ver se é aceitável.


4
O método para preencher essa matriz é a parte mais difícil. ;)
DMGregory
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.