Como são feitos os motores de terreno voxel?

53

Alguns dias atrás, encontrei algo chamado terreno voxel e acho que eles são bem legais. Mas eu não sei de nada que os gera. Você o modela no seu software de modelagem ou usa algo como um mapa de altura? Li na wikipedia que os voxels são como pixels 3d ou pixels volumétricos.

Depois de criar o terreno dos voxel, como posso pegar esses voxels e torná-los destruíveis / escaváveis ?


Vou escolher a melhor resposta com base em:

  1. código e algoritmos. de preferência com base em C #
  2. explicações. Sou iniciante em algoritmos, mas estou familiarizado com programação orientada a objetos
  3. demonstrações passo a passo. Não apenas conceito, mas direção.
  4. diagramas / ilustrações. Não, não capturas de tela de outros mecanismos.


Eu sei que este é um assunto complicado. Mas, obrigado por qualquer ajuda!

Não, não estou tentando criar um clone de minecraft.


Editar

Obrigado a todos por sua grande ajuda (especialmente Nick Wiggill)! Isso é o que eu consegui fazer (Trabalho em andamento).

Daniel Pendergast
fonte
[unidade] e C ? Isso ... faz pouco sentido.
Martin Sojka
Eu entendo C.
Daniel Pendergast
8
Você tem muita fé na comunidade com um pedido tão ousado. Quero dizer, um artigo completo em um terreno voxel totalmente dinâmico para o hardware de hoje com bom FPS, deve ser fácil, certo? Bem, o tópico é tão amplo e difícil que duvido que você veja uma solução genérica e, mesmo assim, pode ser completamente inútil para o seu caso. Mas quem sabe, pode ser possível, dependendo do seu modelo. Você quer um terreno de Crysis 2 voxel ou um Delta Force ? Talvez você esteja fazendo um clone do Minecraft ou apenas precise de uma simulação de areia para um jogo de escavação? Defina um escopo, por favor.
EnoughTea
2
Confira este middleware: forum.unity3d.com/threads/… . Particularmente a demo
Tetrad
11
GPU Gems 3 tem um capítulo sobre o terreno voxel: http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html
Tamschi

Respostas:

58

Para gerar um terreno voxel

(a) Um método comum é gerar um mapa de altura usando ruído Perlin. Um mapa de altura é basicamente uma imagem monocromática que representa diferentes alturas pela escuridão ou claridade de seus pixels.

insira a descrição da imagem aqui

Você verá pixels individuais neste mapa de altura para criar "pilhas" de voxels com alturas diferentes (eixo z) em locais diferentes (x, y), de acordo com o brilho desse pixel na imagem do mapa de altura. Como uma imagem de ruído Perlin é suave (sem bordas nítidas da luz contra a escuridão), você terá um terreno de rolamento suave.

(b) Você pode construí-lo de forma incremental criando a paisagem de diferentes poliedros. Crie uma forma vetorial poliédrica que se aproxime da forma de voxel desejada. Usando qualquer método de ponto 3D no poliedro (na maioria das vezes, casco ponto-no-convexo), verifique quais pontos da sua grade mundial estão dentro desse volume poliédrico. Por exemplo, defina uma pirâmide no espaço. Depois de verificar todos os pontos na região local do espaço do mundo em relação a esse volume piramidal, você saberá quais pontos se enquadram nele e poderá definir essas células como "presentes", o que significa que elas se tornam voxels em vez de espaço vazio. Agora você tem uma pirâmide de voxel no seu espaço. Você pode continuar adicionando formas de qualquer tipo, dessa maneira, até formar um terreno.

(c) (Realmente o mesmo que b ) Escreva uma ferramenta de modelagem. Voxatron mostra como isso ficaria. Isso é apenas criar os formulários voxel em um mundo substituto (o editor) e depois importá-los para o mundo real dos jogos em tempo de execução. Eu acredito que o Voxlap teve o primeiro editor de código aberto para voxels. Você pode colocar voxels individuais ou usar um "pincel" de voxel com diferentes formas / volumes para desenhar voxels em seu mundo.


O que você precisa para construir seu próprio jogo baseado em voxel

Incluo esta seção porque a estrada voxel não é fácil, pelo menos não no momento. Ultimamente, muitas pesquisas estão sendo colocadas novamente nos mecanismos de voxel pelos grandes players, para aplicações de renderização e física.

A simplicidade pode ser um problema, porque construir dinamicamente um mundo a partir de voxels brutos é uma abordagem processual para a construção do mundo e isso não é inerentemente simples . Desculpe, haverá alguns termos técnicos aqui. Escrever um mecanismo voxel é uma tarefa bastante séria e requer conhecimento em várias áreas do desenvolvimento de mecanismos de jogos, principalmente em termos de conceitos espaciais, e isso significa entender a matemática do vetor 3D, matrizes e cálculo básico a um nível razoável.

Dito isto, sua "geração de um terreno voxel" requer um contexto no qual trabalhar, já que os motores voxel não são exatamente comuns. Vamos proceder a uma descrição básica de como funciona um mecanismo voxel.

Os voxels são os blocos de construção básicos do seu mundo. Suas posições são definidas por uma grade 3D indexada por número inteiro (matriz) em vez de um espaço de ponto flutuante contínuo (conforme usado em jogos 3D baseados em vetor). Estes serão os "átomos" do seu mundo. Eles podem ter um metro de altura, como em jogos como Minecraft, ou podem ser menores do que os olhos do seu personagem virtual podem ver, a menos que estejam agrupados em grandes números - um pouco mais como moléculas. Existem dois tipos:

  • Voxels baseados em malha cúbica ( exemplo ) - estes são um tipo mais recente, usado por simplicidade e facilmente utilizável em conjunto com a tecnologia gráfica moderna. Usado em jogos como MineCrat e Dungeon Keeper.
  • Voxels de ponto ( exemplo , exemplo ) - o voxel original. Cada um deles é um ponto colidível individual no espaço, embora possa estar cercado por um volume delimitador esférico. Eles são mais simples, então você pode ter muitos mais em seu mundo e, portanto, pode torná-los menores, o que geralmente é favorável. Dois jogos que os usaram foram Comanche e o remake de Lords of Midnight dos anos 90.

De qualquer maneira, sua abordagem para manipular voxels em seu mundo é praticamente a mesma, como segue.

Para construir e mover objetos em seu mundo, você precisará das ferramentas matemáticas mencionadas acima. Por exemplo, para criar uma parede: Construa uma caixa com as dimensões apropriadas no espaço 3D, usando vetores. Use a matemática da matriz para transformar sua caixa na rotação e posição que você deseja no seu mundo 3d (em espaço vetorial contínuo). Para um mecanismo voxel, a etapa adicional é agora usar um algoritmo 3D point-in-polyhedron para determinar quais dos seus voxels caem dentro desse espaço rotativo.

Essencialmente, é dessa maneira que você construiria a maioria dos objetos em seu mundo. Além disso, você pode escrever suas próprias ferramentas para "modelar" um personagem da maneira que você pode dizer, Maya ou 3DS Max. Mas como você está modelando seu personagem com voxels, em vez de pontos, arestas e faces, seus métodos serão substancialmente diferentes. Se você decidisse rotacionar esses objetos em seu mundo, seria necessário usar as transformações de matriz da mesma forma.

Terrenos destrutíveis são tão simples quanto remover um voxel de cada vez, de acordo com algum método de sua escolha, ou usar operações CSG (Constructive Solid Geometry) em grandes volumes de voxels para removê-los de acordo com um volume predefinido; por exemplo, se disparar um feixe de laser através de uma rocha, você poderá usar um volume cilíndrico para subtrair os voxels aqui onde o feixe está disparando através da rocha. O CSG é um processo relativamente simples, usando as grades espaciais 3D que formam seu mundo voxel e verificando todas as células em uma seção de uma grade base (neste caso, a rocha) contra outra grade (nesse caso, o raio laser)

Para ter "fluxos" materiais (como Vigil sugeriu em seu comentário sobre areia), você precisará examinar a dinâmica de fluidos e os autômatos celulares. Elas foram usadas pelo autor da Fortaleza dos Anões, Tarn Adams, no que também é essencialmente um mundo de voxel (embora os voxels sejam muito maiores nesse caso, comparáveis ​​ao Dungeon Keeper, o princípio permanece o mesmo). Estes são tópicos de vanguarda e não são necessários para os motores voxel, conforme definido, então deixarei isso como um "esboço" para sua própria pesquisa.

CSG e dinâmica de fluidos me levam, finalmente, à otimização. Os motores Voxel atualmente em desenvolvimento quase exclusivamente usam esparsos voxel octrees (SVOs), que são um método de subdividir o espaço voxel em resoluções variadas, conforme evidenciado neste vídeo, mostrando o próximo mecanismo Atomontage. O uso de octrees / SVOs é mais uma necessidade do que uma opção de otimização, devido às despesas gerais de processamento envolvidas no processamento de uma grade maciça e uniforme. Uma octree é essencialmente uma árvore (gráfico acíclico direcionado) em que cada nó tem 8 ou zero nós filhos, dependendo se o espaço que representa contém volumes físicos. Diagramas mostrando como as octrees subdividem o espaço para formar voxels estão aqui .

A melhor implementação de voxel de código aberto que eu conheço é o Voxlap Engine de Ken Silverman , que foi usado para o Voxelstein3D. Está escrito em C ++ e implementa operações CSG para deformação do terreno.

Engenheiro
fonte
A alteração do wiki da comunidade é permanente, não há como revertê-la. Você precisaria excluir e recriar sua resposta (é claro, sacrificando seus votos existentes)
Jesse Dorsey
meta.stackexchange.com/questions/2974/… afirma que os moderadores podem removê-lo. Mas não sei se as coisas mudaram. Obrigado por investigar de qualquer maneira.
Engenheiro
11
Vai entender, tenha cuidado da próxima vez.
Jesse Dorsey
2
O primeiro é um espaço discreto em que as entidades só podem estar diretamente em uma célula. Como peças perfeitamente colocadas em um tabuleiro de xadrez, elas não podem ficar "entre" células ou sobrepor as bordas. Enquanto um espaço contínuo é o encontrado na maioria dos mecanismos de física, isto é, é baseado em números de ponto flutuante e, portanto, é contínuo e não quantizado. Sua entidade pode sentar-se em qualquer posição arbitrária no espaço que você escolher - assim como na vida real.
Engenheiro
11
A texturização está implícita. Os voxels reais, com ou sem malha, cada um tem uma cor pura. As abordagens acima mencionadas apenas criam detalhes mais realistas e permitem uma abordagem de malha combinada (google Unity VoxelForm). Quanto mais finos forem seus voxels, mais finos serão os detalhes de textura resultantes. Exemplo: modele um leito de rio como rocha (cinza). Converta cada pixel dentro da distância x da superfície, em areia, configurando esses voxels para ter material = "sand"; eles podem ser renderizados como cor de areia. Além disso, isso também pode afetar sua interatividade física; portanto, a areia pode ser movida pela água ou escavada.
Engenheiro de
33

A melhor maneira de gerar terreno voxel interessante é com um mapa de densidade de ruído Perlin. Em vez de usar um mapa de ruído 2D Perlin que define a altura de um mundo 3D, use um mapa de ruído 3D Perlin. Pese o mapa para que os valores mais próximos do fundo sejam mais sólidos, e os valores mais próximos do ar definitivamente serão o ar. Isso dá altura ao seu mundo, mas também permite saliências e cavernas, semelhantes ao terreno do Minecraft , como mostra essa vista lateral de uma parte do terreno:

Mundo com saliências

A partir daqui, você pode testar ilhas flutuantes ou adicionar sistemas de cavernas usando ruído fractal:

Mundo com sistema de cavernas

As imagens acima e as idéias do sistema de cavernas são desta excelente publicação no blog . Você pode aprender tudo sobre o ruído Perlin aqui , e há algum código de exemplo para você começar aqui .

dlras2
fonte
4

As outras respostas aqui são excelentes, mas adotei uma abordagem um pouco diferente.

Gero um ambiente em uma ferramenta de modelagem (3DSMAX) e construo uma octree esparsa. Cada nó de folha cúbico e não vazio é um voxel. No momento da renderização, eu uso o raycasting (implementado no HLSL) para descobrir qual voxel ocupa qual pixel e defino o pixel com a cor armazenada no nó, que calculei ao gerar a árvore calculando a média dos valores de textura do modelo de origem.

Isso oferece muitos benefícios interessantes - detecção de colisão de graça, LOD variável, exibição de seleção de espaço etc. - e, além do raycaster - é fácil de implementar.

Infelizmente, é quase impossível publicar código de amostra de um telefone.

3Dave
fonte
+1 para uma alternativa. Embora não seja impossível de implementar com desempenho razoável, os profissionais são superados pelos contras. O traçado de raios Voxel impõe um grande dreno na GPU. As aritméticas e condicionais necessárias para isso são muito caras, quando esses mesmos ciclos de GPU podem estar aplicando vários efeitos impressionantes no espaço da tela, por exemplo. SSAO. O maior problema é que a radiotransmissão parece melhor com múltiplas rejeições encontradas na radiosidade - inviável para a cena que consiste em milhões ou bilhões de voxels e onde cada segmento de raio exige um esforço considerável para saltar e compor.
Engenheiro de
... É por isso que mencionei o raycasting escalino apenas como um aparte na minha resposta (VoxLap) - mesmo que seja difícil de implementar bem. Se você conseguir trabalhar com uma abordagem de linha de varredura vertical, o custo é uma ordem de magnitude menor que o traçado de raio por pixel, pois você reduziu a dimensionalidade do processo de renderização de 3D para 2D. Essa abordagem ainda me mantém, apesar de impedir soluções de iluminação complexas possíveis com o seu RTRT tradicional.
Engenheiro de