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.
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.