Estradas processuais em Houdini e Unity

imagem

No meu jogo pós-apocalíptico de Frameshift, eu precisava preencher um mundo aberto muito grande com diversas cidades. Nossa equipe tem apenas 3 pessoas, então eu, é claro, usei o poder processual de Houdini!

Antes, quando eu não conhecia o Houdini, escrevi em C # minhas próprias ferramentas para geração de malhas procedurais para o Unity. A adição de novos recursos foi um processo muito longo, e quando ouvi dizer que o Houdini foi projetado para essas tarefas, mudei imediatamente para ele. Eu experimentei diferentes maneiras de gerar cidades e ruas e, neste artigo, falarei brevemente sobre a técnica que finalmente usei para o jogo.

Primeiro, criei uma ferramenta para gerar uma rede de ruas que poderia ser usada na cidade. Minha decisão é baseada nos conceitos apresentados aqui , bem como no artigo usado por referência. Fala-se muito em campos tensores e autovetores, e tudo é escrito muito tecnicamente, mas, em poucas palavras, pode ser explicado da seguinte forma: para o meu caso (gerar uma rede viária em relevo), eu precisava gerar linhas de alívio de contorno e linhas perpendiculares a eles.

Comecei com o relevo e, graças a uma pequena ajuda do exemplo de Houdini Gubbins, gerei vetores em cada ponto do relevo direcionado para o caminho e linhas de gradiente usando o VEX:

imagem

Vetores amarelos mostram linhas de contorno.

Então precisamos criar uma grade de ruas da cidade e misturar seus vetores com vetores repetindo as curvas naturais do relevo. Então, criaremos uma área que se assemelha a uma grade de ruas da cidade, combinando bem com o relevo. Aqui, colocamos a grade no relevo e, em seguida, fazemos a polyframing para que os normais se alinhem ao longo das linhas da grade, adicionem uma queda para uma mistura suave e finalmente definam um novo vetor de caminho, que é uma mistura de dois vetores:

imagem

Na imagem acima, você pode ver que dentro das bordas do retângulo, as linhas de contorno são mais como uma grade. Também realizo um processo semelhante para adicionar ao jogo a influência de estradas criadas manualmente. Eu introduzi um controle deslizante no Unity HDA para que a influência possa ser alterada criando ruas mais naturalmente localizadas ou mais "quadradas" dentro dos limites da cidade.

Em seguida, converterei os campos vetoriais em VDB para que você possa fazer uma amostra deles para criar estradas prontas. Com o rastreamento de volume SOP, você pode obter uma bela visualização:

imagem

Já está começando a parecer uma grade de ruas! Eles estão muito próximos um do outro, mas em geral já existem formas. Em seguida, realizamos muitas operações de amostragem a partir de velocidades VDB e vex para criar linhas de estradas prontas. O código vex essencialmente organiza as estradas para a distância certa e as termina se elas estiverem muito próximas de outras ou por muito tempo:

imagem

Em seguida, realizamos o pós-processamento para facilitar tudo, remover pequenas peças, aumentar os becos sem saída para criar cruzamentos realistas e colocar estradas no terreno. O resultado final é assim:

imagem

Ainda existem algumas partes irreais, mas uma pequena limpeza manual no Unity é aceitável, dado o tempo que economizamos nisso.

Assim, geramos processualmente uma rede de ruas da cidade, mas o resultado foi apenas um monte de curvas em Houdini. Agora, mostrarei como gerar a geometria da estrada para cada uma dessas curvas para criar malhas que você pode usar no Unity. Aqui estão nossos resultados anteriores portados para o Unity:

imagem

Primeiro, você precisa dizer como é realizada a transferência de dados entre o Houdini e o Unity. No caso de estradas, escrevo no arquivo JSON uma sequência de pontos, a largura da estrada e a predefinição da superfície da estrada. No Unity, criei ferramentas de editor para editar estradas manualmente usando curvas de Bezier:

imagem

Você pode encontrar muitos tutoriais nos mecanismos de pesquisa sobre a criação de um editor de curvas de Bezier no Unity. Para transferir dados de volta para o Houdini, eu uso o nó Python para ler o arquivo JSON:

imagem

Aqui você vê o resultado da criação de uma rede de ruas urbanas, obtida acima, mas desta vez é lida no arquivo JSON, porque agora é obtida no Unity com alterações manuais.

Também importo um alívio do Unity, lendo seus dados brutos. Provavelmente hoje em dia isso pode ser feito de forma nativa com a ajuda do HDA, porque o Houdini Engine melhorou o suporte ao terreno do Unity, mas quando eu fiz esse trabalho, ele ainda não era tão bom.

Então criamos as interseções. O trabalho principal aqui é realizado pelo SOP de ponto de interseção, mas também usei o VEX para alongar levemente as estradas, caso elas não se cruzassem completamente, e removi as extremidades curtas para que as interseções em T fossem criadas corretamente.

imagem

Em seguida, crio um grupo de interseções usando falloff da interseção, em que a distância de atenuação é igual à maior na interseção da estrada. Em seguida, expanda esse grupo de arestas nos casos em que o ângulo entre duas estradas é menor que 45 graus, para que haja espaço suficiente entre as duas extremidades da interseção para criar uma malha da largura desejada:

imagem

Os cálculos no nó VEX encontram a hipotenusa de um triângulo retângulo (podemos assumir que cada parte individual da interseção consiste em dois triângulos retos):

imagem

Como sabemos qual deve ser a largura das estradas do grupo de interseção (indicado na figura acima como A) e sabemos o ângulo a, podemos calcular C para encontrar a distância pela qual precisamos expandir o grupo de interseção para dividi-los pela largura desejada.

Em seguida, criamos grupos de pontes, destacando trechos de estradas que estão acima de uma certa distância acima do solo. Isso é feito usando o Ray SOP com "distância de interseção do ponto" ativada e "pontos de transformação" desativados. Em seguida, para criar curvas prontas para a geometria de fechamento, usamos o Polycut para cortar os grupos de interseção e ponte para que apenas as estradas comuns permaneçam.

imagem

E agora estamos finalmente começando a criar malhas reais. A sub-rede que cria as malhas de interseção é uma versão modificada do tutorial Solving Intersections . A sub-rede que cria a geometria da estrada também fecha a linha e cria UV. Há outro ótimo tutorial criado pelo HoudiniSimon. Ele mostra como gerar UV para dobrar uma curva fechada, mas a primeira parte do tutorial pode ser aplicada para abrir curvas.

imagem

Depois, criei alguns grupos para aplicar os materiais para usar o atributo roadPreset retirado das minhas curvas no Unity.

Em seguida, criamos a geometria das pontes. A rede mostrada abaixo iterativamente passa por todos os grupos de pontes criados anteriormente e, dependendo da altura acima do solo, comprimento e tortuosidade, insere uma ponte em massa ou em arco. Considerarei a criação de uma ponte em arco em um tutorial separado, e a ponte em massa usa o excelente SOP Gamedev Sweep Geometry com grupos de início e término incluídos para fechar a geometria da ponte criada anteriormente ao longo da curva da ponte.

imagem

Resultado:

imagem

Essas malhas de ponte consistem em seções de início / fim / meio modeladas manualmente, deformáveis ​​e duplicadas ao longo de uma curva usando o SOP da Gamedev Sweep Geometry. Veja como são a geometria e os grupos criados manualmente:

imagem

O grupo central é selecionado e as extremidades estão nos grupos bridgeStart e bridgeEnd, que são usados ​​pelo nó de fechamento da geometria.

Concluímos a ponte extrudando-a um pouco para criar um aterro na estrada em que a textura do cascalho será aplicada; Várias variáveis ​​booleanas também são definidas para cruzamentos de certos tipos de estradas. Por exemplo, se uma estrada de terra cruzar com uma estrada, ela será truncada.

imagem

No final, economizamos toda a geometria para uso no Unity e em ferramentas adicionais do Houdini. Dividimos as malhas da estrada em fragmentos menores e exportamos como FBX e também salvamos os dados em arquivos .bgeo para que possam ser usados ​​posteriormente.

imagem

Na unidade:

imagem

imagem

imagem

Espero que você tenha gostado desta breve descrição do nosso processo de criação de geometria de estradas Houdini. No próximo post, falarei sobre a criação de marcações nas estradas e o nivelamento do terreno para que ele se aproxime mais das estradas.

Source: https://habr.com/ru/post/pt478516/


All Articles