Come sono realizzati i motori fuoristrada voxel?


53

Qualche giorno fa ho trovato qualcosa chiamato terreni voxel e penso che siano piuttosto fighi. Ma non so nulla che li generi. Lo modelli nel tuo software di modellazione o usi qualcosa come una heightmap? Ho letto su Wikipedia che i voxel sono come pixel 3d o pixel volumetrici.

Dopo aver creato il terreno voxel, come posso prendere questi voxel e renderli distruttibili / scavabili ?


Sceglierò la risposta migliore in base a:

  1. codice e algoritmi. preferibilmente basato su C #
  2. spiegazioni. Sono un principiante con gli algoritmi ma conosco molto bene la programmazione orientata agli oggetti
  3. dimostrazioni passo dopo passo. Non solo concetto ma direzione.
  4. diagrammi / illustrazioni. No, non schermate di altri motori.


So che questo è un argomento complicante. Ma grazie per l'aiuto!

No, non sto cercando di creare un clone di Minecraft.


modificare

Grazie a tutti per il vostro grande aiuto (specialmente Nick Wiggill)! Questo è quello che sono riuscito a fare (Lavori in corso).


[unità] e C ? Questo ... ha poco senso.
Martin Sojka,

Capisco C.
Daniel Pendergast,

8
Hai molta fiducia nella comunità con una richiesta così audace. Voglio dire, un documento completo su un terreno voxel completamente dinamico per l'hardware di oggi con un buon FPS, dovrebbe essere facile, giusto? Bene, l'argomento è così ampio e difficile, dubito che vedrai una soluzione generica e anche allora, potrebbe essere completamente inutile per il tuo caso. Ma chi lo sa, può essere fattibile a seconda del tuo modello di ruolo. Vuoi un terreno voxel Crysis 2 o uno Delta Force ? Forse stai facendo un clone di Minecraft o hai solo bisogno di una simulazione di sabbia per un gioco di scavo? Definisci un ambito, per favore.
Basta il

2
Dai un'occhiata a questo middleware: forum.unity3d.com/threads/… . In particolare la demo
Tetrad,

1
GPU Gems 3 ha un capitolo sul terreno voxel: http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html
Tamschi,

Risposte:


58

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.

inserisci qui la descrizione dell'immagine

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.


Il cambio wiki della community è permanente, non c'è modo di annullarlo. Dovresti eliminare e ricreare la tua risposta (ovviamente sacrificando i tuoi voti esistenti)
Jesse Dorsey

meta.stackexchange.com/questions/2974/… afferma che i moderatori possono rimuoverlo. Non so se le cose sono cambiate, però. Grazie per averci esaminato in entrambi i modi.
Ingegnere

1
Vai a capire, fai attenzione la prossima volta.
Jesse Dorsey

2
Il primo è uno spazio discretizzato in cui le entità possono trovarsi solo direttamente su una cella. Come pezzi perfettamente posizionati su una scacchiera, non possono giacere "tra" celle o sovrapporre i bordi. Considerando che uno spazio continuo si trova nella maggior parte dei motori di fisica, cioè si basa su numeri in virgola mobile ed è quindi continuo piuttosto che quantizzato. La tua entità può sedere in qualsiasi posizione arbitraria nello spazio che scegli, proprio come nella vita reale.
Ingegnere

1
La trama è implicita. I voxel reali, con o senza mesh, hanno ciascuno un colore puro. Gli approcci di cui sopra creano solo dettagli più realistici e consentono un approccio a mesh combinata (google Unity VoxelForm). Più fini sono i tuoi voxel, più fini saranno i dettagli della trama risultante. Esempio: modellare un letto di fiume come roccia (grigio). Converti ogni pixel entro la distanza x della superficie, in sabbia, impostando questi voxel per avere material = "sand"; possono quindi essere resi come color sabbia. Inoltre, ciò può influire anche sulla loro interattività fisica, quindi la sabbia può essere spostata dall'acqua o scavata.
Ingegnere,

33

Il modo migliore per generare interessanti terreni voxel è con una mappa della densità del rumore Perlin. Anziché utilizzare una mappa del rumore Perlin 2D che definisce l'altezza di un mondo 3D, utilizzare una mappa del rumore Perlin 3D. Pondera la mappa in modo che i valori più vicini al fondo siano più probabilmente solidi e i valori più vicini al vertice saranno sicuramente l'aria. Questo dà altezza al tuo mondo, ma consente anche di strapiombi e grotte, simili al terreno di Minecraft , come mostra questa vista laterale di una porzione di terreno:

Mondo con strapiombi

Da qui è possibile verificare la presenza di isole galleggianti o aggiungere sistemi di grotte utilizzando il rumore frattale:

Mondo con sistema di caverne

Le immagini sopra e le idee sul sistema di caverne provengono da questo eccellente post sul blog . Puoi imparare tutto sul rumore di Perlin qui e c'è un codice di esempio per iniziare qui .


4

Le altre risposte qui sono eccellenti, ma ho adottato un approccio leggermente diverso.

Genero un ambiente in uno strumento di modellazione (3DSMAX) e ne ricavo uno scarso ottetto. Ogni nodo fogliare cubico, non vuoto è un voxel. Al momento del rendering, utilizzo il raycasting (implementato in HLSL) per trovare quale voxel occupa quale pixel e imposto il pixel sul colore memorizzato nel nodo, che ho calcolato durante la generazione dell'albero calcolando la media dei valori di trama dal modello di origine.

Ciò offre numerosi vantaggi: il rilevamento delle collisioni per LOD gratuiti e variabili, la visualizzazione degli abbattimenti spaziali, ecc. E, a parte il raycaster, è facile da implementare.

Sfortunatamente, è quasi impossibile pubblicare un codice di esempio da un telefono.


+1 per un'alternativa. Sebbene non sia impossibile implementare con prestazioni ragionevoli, i pro sono ampiamente compensati dai contro. Il raytracing Voxel impone un enorme drenaggio alla GPU. L'aritmetica e i condizionali necessari per questo sono molto costosi, quando quegli stessi cicli GPU potrebbero applicare una serie di effetti impressionanti sullo spazio dello schermo, ad es. SSAO. Il problema più grande è che il raycasting sembra migliore con più rimbalzi come si trova nella radiosità - non praticabile neanche per la scena che comprende milioni o miliardi di voxel e in cui ogni segmento di raggio fa uno sforzo considerevole per rimbalzare e comporre.
Ingegnere

... Questo è il motivo per cui ho citato il raycasting scalino solo a parte nella mia risposta (VoxLap) - anche se è difficile da implementare bene. Se riesci a far funzionare un approccio con scanline verticale, il costo è un ordine di grandezza inferiore al raytracing per pixel, poiché hai ridotto la dimensionalità del processo di rendering da 3D a 2D. Questo approccio è ancora in attesa, sebbene precluda soluzioni di illuminazione complesse possibili con il tuo RTRT tradizionale.
Ingegnere
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.