Come rendere l'universo infinito?


15

Sono curioso di sapere quali sono le migliori pratiche nel settore dello sviluppo di giochi per il rendering dell'universo 3d?

Per essere più specifici:

  • I punti dati sono dati e statici. Ogni punto ha posizione, colore e dimensioni;
  • L'intero set di dati è molto più grande della memoria disponibile;
  • L'utente dovrebbe essere in grado di "rimpicciolire" per vedere contemporaneamente un'immagine più grande;

L'approccio più ingenuo sarebbe quello di dividere l'universo in cubi e rendere solo ciò che è visibile. Non sono sicuro di come in questo scenario dovrei implementare lo "zoom indietro". Devo pre-calcolare i cubi per ogni possibile livello di zoom? O forse ci sono approcci migliori?

Sto cercando una soluzione agnostica tecnologica.


2
Pensi di avere una sorta di distanza massima di vista o hai un modo per unire punti distanti in modo da non doverli rendere singolarmente o sono i "punti" opachi e disposti in modo tale che la maggior parte di essi essere nascosto da un determinato punto di vista? Perché se nessuna delle precedenti è valida, non vedo alcun modo per impedire all'utente di trovare gli angoli della telecamera da cui saranno visibili la maggior parte dei punti (o almeno una frazione significativa di essi) contemporaneamente.
Ilmari Karonen,

4
A proposito, un po 'esotico, ma hai considerato i dati generati proceduralmente? Non hai il vantaggio di creare aree personalizzate, ma il risultato è che il contenuto si basa su equazioni, non su grandi quantità di dati. Con un po 'di creatività, ciò potrebbe semplificare molte cose (:
Alan Wolfe,

1
Lo zoom indietro / zoom avanti infinite universepotrebbe essere simile al tracciamento delle relazioni tra due punti su una curva di Mandelbrot dopo lo zoom su livelli diversi. Ad un certo livello, puoi perdere precisione e non essere in grado di distinguerli o persino di individuarli di nuovo.
user2338816

1
@AlanWolfe Il crafting personalizzato è ancora possibile - il primo esempio sono i vecchi giochi Frontier, che avevano posizioni di stelle reali per circa 1000 stelle o più vicine a Sol (incluso Sol e i suoi attuali pianeti e lune). Devi solo assicurarti che si trovino in luoghi che non sono generati proceduralmente e li aggiungi come un altro "livello".
Luaan,

@IlmariKaronen sì, hai ragione. Ho la massima distanza di visione e ho pensato di unire i punti di distanza seguendo la risposta di Ming-Tang
Anvaka,

Risposte:


8

Questo si basa sulla mia speculazione e sfogliare il codice sorgente di Celestia.

Celestia ti consente di volare intorno a un pianeta e rimpicciolire per vedere l'intera galassia. Ho sfogliato il suo codice sorgente e ho scoperto che utilizzava un ottetto, una struttura per dividere ricorsivamente lo spazio in 8 ottanti.

Il renderer renderebbe l'ambiente attraversando l'ottra e non attraverserebbe profondamente gli oggetti lontani.

Celestia tiene anche traccia della magnitudine assoluta di un ottante, dove la magnitudine assoluta di un ottante si basa sulla magnitudine assoluta delle stelle all'interno dell'ottante. Se l'ottante è ravvicinato, Celestia rende le stelle singolarmente e se l'ottante è molto lontano, Celestia rende l'ottante come una stella della grandezza dell'ottante.

Inoltre, può esserci una gerarchia significativa collegata agli oggetti. Ad esempio, se si è vicini (raggio dichiarato nel database) a una stella, i suoi pianeti vengono renderizzati. Se un pianeta è abbastanza vicino (un taglio di pixel sullo schermo), viene disegnato il suo modello 3D.

Altri giochi spaziali di cui posso citare sono Orbiter e Kerbal Space Program, che sono a codice chiuso. Ho anche esaminato Frontier Galaxy, che ha generato proceduralmente una mappa stellare. Esiste un sito Web che analizza il funzionamento del gioco tramite il suo smontaggio: http://www.jongware.com/galaxy1.html


12

C'è un numero di pezzi in questo puzzle, ognuno dei quali fornirà una profonda e interessante tana di esplorazione per conigli. Alcuni di loro sono:

  • Livello di dettaglio: selezione automatica (o "manuale") di modelli dettagliati o semplificati, o anche sprite o solo punti, o per oggetti che si trovano più lontano.
  • Abbattimento: scegliere di disegnare solo ciò che è necessario. Questo potrebbe essere ciò che si trova nel campo visivo (abbattimento del frustum), cosa non è nascosto dietro altre cose (abbattimento dell'occlusione) o altri metodi ad hoc. (La risposta di @Alan Wolfe descrive alcuni dei modi per organizzare i dati che aiutano a facilitare l'abbattimento.)
  • Streaming: estrazione dei dati mondiali dall'archiviazione alla memoria, se necessario, se non si adatta alla memoria in una sola volta
  • Sky box: oggetti molto distanti possono essere pre-renderizzati su una sfera che si trova a "distanza infinita" dalla telecamera.

E la tua salsa segreta sarà quale combinazione di queste e altre tecniche che usi e quando, in base alle tue esigenze applicative particolari.


2

Tutto ciò che è gerarchico e / o scarso dovrebbe aiutarti qui.

C'è molto spazio vuoto, quindi non è necessario utilizzare l'archiviazione per rappresentare lo spazio vuoto è un must. Un tipico approccio gerarchico sarebbe qualcosa di simile a un albero di ottobre che suddivide ricorsivamente lo spazio in 8 cubi più piccoli e puoi archiviare oggetti nel cubo più piccolo che possono occupare completamente.

Un ottetto è anche abbastanza buono per te essere in grado di interrogarlo per un elenco di tutti gli oggetti in un frustum di vista che ti permetterà di ottenere un elenco solo degli oggetti che si trovano nel tuo angolo di visione e non sono troppo distanti. Una soluzione sparsa potrebbe essere qualcosa di simile a una griglia sparsa in cui è possibile richiedere informazioni su qualsiasi posizione x, y, z, ma è necessario memorizzare solo informazioni per celle che non sono spazi vuoti.

Altri approcci gerarchici comuni usati includono alberi bsp (dividono lo spazio in 2 semispazi ricorsivamente) e alberi kd che fanno simili.

Personalmente penso che un octree potrebbe essere un buon inizio per te, assicurandoti di suddividere solo nel modo più profondo necessario in modo da non sprecare memoria nello spazio vuoto. inoltre, potresti finire per desiderare una soluzione diversa per i tuoi oggetti statici rispetto ai tuoi oggetti dinamici.

Alcune soluzioni (come bsp) possono essere molto efficienti, ma richiedono molto tempo per essere costruite, quindi di solito non sono una buona scelta per spostare / cambiare oggetti.

Spero che ti aiuti, fammi sapere se hai domande sui dettagli!

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.