Per generare un terreno voxel
(a) Un metodo comune è generare una mappa di altezza usando il rumore di Perlin. Una heightmap è fondamentalmente un'immagine monocromatica che rappresenta diverse altezze per l'oscurità o la luminosità dei suoi pixel.
Guarderai i singoli pixel in questa mappa di altezza per creare "pile" di voxel fino a diverse altezze (asse z) in posizioni diverse (x, y), in base alla luminosità di quel pixel nell'immagine della mappa di altezza. Poiché l'immagine del rumore di Perlin è uniforme (senza spigoli vivi della luce contro l'oscurità), di conseguenza si otterrà un terreno uniformemente scorrevole.
(b) Puoi costruirlo in modo incrementale creando il paesaggio da poliedri diversi. Crea una forma vettoriale poliedrica che approssima la forma voxel desiderata. Utilizzando qualsiasi metodo punto-in-poliedro 3D (il più delle volte, punto-in-convesso-scafo), controlla quali punti della tua griglia mondiale rientrano in quel volume poliedrico. Ad esempio, definire una piramide nello spazio. Dopo aver verificato ogni punto nella regione locale del tuo spazio mondiale rispetto a quel volume piramidale, saprai quali punti cadono al suo interno e puoi impostare quelle celle come "presenti" nel senso che diventano voxel anziché spazio vuoto. Ora hai una piramide voxel nel tuo spazio. Puoi continuare ad aggiungere forme di qualsiasi tipo insieme, in questo modo, fino a quando non hai formato un terreno.
(c) (Davvero uguale a b ) Scrivi uno strumento di modellazione. Voxatron mostra come sarebbe. Questo sta solo creando i moduli voxel in un mondo sostitutivo (l'editor) e quindi importandoli nel tuo vero mondo di gioco runtime. Credo che Voxlap avesse il primo editor open source per voxels. Puoi posizionare singoli voxel oppure puoi usare un "pennello" voxel con forme / volumi diversi per disegnare voxel nel tuo mondo.
Cosa ti serve per costruire il tuo gioco basato su voxel
Includo questa sezione perché la strada del voxel non è facile, almeno per il momento. Ultimamente, molte grandi ricerche sono state nuovamente messe nei motori voxel dai grandi attori, verso applicazioni di rendering e fisica.
La semplicità può essere un problema, perché costruire dinamicamente un mondo con voxel grezzi è un approccio procedurale alla costruzione del mondo e questo non è intrinsecamente semplice . Mi dispiace, ci saranno alcuni termini tecnici qui. Scrivere un motore voxel è un'impresa piuttosto seria e richiede conoscenze su più aree dello sviluppo del motore di gioco, in particolare in termini di concetti spaziali, e questo significa comprendere la matematica vettoriale 3D, le matrici e il calcolo di base a un livello ragionevole.
Detto questo, la tua "generazione di un terreno voxel" richiede un contesto in cui lavorare, poiché i motori voxel non sono esattamente diffusi. Passiamo a una descrizione di base di come funziona un motore voxel.
I Voxel sono i mattoni fondamentali del tuo mondo. Le loro posizioni sono definite da una griglia 3D (array) con indice intero anziché da uno spazio in virgola mobile continuo (utilizzato nei giochi 3D basati su vettori). Questi saranno gli "atomi" del tuo mondo. Potrebbero essere alti 3 piedi come in giochi come Minecraft, oppure potrebbero essere più piccoli di quanto l'occhio del tuo personaggio virtuale possa effettivamente vedere, a meno che non siano raggruppati insieme in grandi numeri - un po 'più come molecole. Ce ne sono di due tipi:
- Voxel basati su mesh cubiche ( esempio ): si tratta di un tipo più recente, utilizzato per semplicità e facilmente utilizzabile in combinazione con la moderna tecnologia grafica. Utilizzato in giochi come MineCrat e Dungeon Keeper.
- Point voxel ( esempio , esempio ): il voxel originale. Ognuno è un singolo punto collidibile nello spazio, sebbene possa essere circondato da un volume di delimitazione sferico. Sono più semplici, quindi puoi averne molti di più nel tuo mondo e puoi quindi renderli più piccoli, il che è generalmente favorevole. Due giochi che usavano questi erano Comanche e il remake degli anni '90 di Lords of Midnight.
Ad ogni modo, il tuo approccio alla manipolazione dei voxel nel tuo mondo è più o meno lo stesso, come segue.
Per costruire e spostare oggetti nel tuo mondo, avrai bisogno degli strumenti matematici sopra menzionati. Ad esempio, per creare un muro: costruisci una scatola delle dimensioni appropriate nello spazio 3D, usando i vettori. Usa Matrix Math per trasformare la tua scatola nella rotazione e nella posizione che desideri nel tuo mondo 3d (nello spazio vettoriale continuo). Per un motore voxel, il passaggio aggiuntivo è ora utilizzare un algoritmo punto-in-poliedro 3D per determinare quale dei tuoi voxel rientra in quello spazio ruotato.
In sostanza, questo è il modo in cui costruiresti la maggior parte degli oggetti nel tuo mondo. Oltre a ciò, potresti scrivere i tuoi strumenti per "modellare" un personaggio come potresti dire, Maya o 3DS Max. Ma dal momento che stai modellando il tuo personaggio con voxel anziché punti, bordi e facce, i tuoi metodi saranno sostanzialmente diversi. Se decidessi di ruotare questi oggetti nel tuo mondo, per fare ciò dovrai usare similmente trasformazioni di matrici.
Il terreno distruttibile è semplice come rimuovere un voxel alla volta secondo un metodo di tua scelta o utilizzare le operazioni CSG (Constructive Solid Geometry) su grandi volumi di voxel per rimuoverli secondo un volume predefinito; ad esempio, se si spara un raggio laser attraverso una roccia, è possibile utilizzare un volume cilindrico per sottrarre i voxel qui che il raggio sta sparando attraverso la roccia. CSG è un processo relativamente semplice che utilizza le griglie spaziali 3D che formano il tuo mondo voxel e controlla ogni cella in una sezione di una griglia di base (in questo caso la roccia) contro un'altra griglia (in questo caso, il raggio laser)
Per avere "flussi" materiali (come ha accennato Vigil nel suo commento sulla sabbia), dovrai esaminare la fluidodinamica e gli automi cellulari. Questi furono usati dall'autore della fortezza nana, Tarn Adams, in quello che è essenzialmente anche un mondo di voxel (anche se i voxel sono molto più grandi in questo caso, paragonabili a Dungeon Keeper, il principio rimane lo stesso). Questi sono argomenti all'avanguardia e non una necessità per i motori voxel come definiti, quindi lo lascerò come uno "stub" per le tue ricerche.
CSG e fluidodinamica mi portano, infine, all'ottimizzazione. I motori Voxel attualmente in fase di sviluppo fanno uso quasi esclusivamente di voxel octrees (SVO) sparsi, che è un metodo per suddividere lo spazio voxel a risoluzioni diverse, come evidenziato in questo video che mostra il prossimo motore Atomontage. L'uso di octrees / SVOs è più una necessità che una scelta di ottimizzazione, a causa delle spese generali di elaborazione coinvolte nell'elaborazione di una griglia enorme e uniforme. Un ottetto è essenzialmente un albero (grafico aciclico diretto) in cui ogni nodo ha 8 o zero nodi figlio a seconda che lo spazio che rappresenta contenga volumi fisici. Diagrammi che mostrano come gli oculari suddividono lo spazio per formare voxel qui .
La migliore implementazione di voxel open source che conosco è il motore Voxlap di Ken Silverman , che è stato utilizzato per Voxelstein3D. È scritto in C ++ e implementa le operazioni CSG per la deformazione del terreno.