Come caricare un pianeta sferico e le sue regioni?


14

Sto progettando un gioco parzialmente composto da esplorazione dei pianeti. Voglio usare la generazione pseudo-casuale per loro, rigenerando da un seme definito quando devo caricarli piuttosto che archiviare ogni dettaglio, il che sarebbe troppo pesante. Quindi memorizzerò in un file il seme casuale e le eventuali modifiche apportate dal giocatore.

Il giocatore deve essere in grado di vedere il pianeta dall'orbita (con un livello molto basso di dettagli, quindi scendere a terra, aumentando lentamente il livello dei dettagli della regione in cui sta atterrando e scaricando quelli sugli altri lati del pianeta, che vanno al di fuori del campo visivo del giocatore.

Se dovessi farlo su un piano, lo farei facilmente con un sistema di blocchi quadrati. Ma il problema qui è che i pianeti sono - quasi - sfere.

Quindi quale sarebbe il modo migliore per caricare i dettagli del terreno (rilievo e oggetti messi a terra) attorno a un punto preciso?
Ho già pensato a due soluzioni, ma entrambe hanno un punto debole:

1. Tagliare la sfera in pezzi quadrati.

metodo dei pezzi quadrati

Una volta che il giocatore è abbastanza vicino al terreno, devo solo migliorare i dettagli dei quadrati più vicini dalla sua posizione.
Se non è abbastanza, posso ancora tagliare ogni quadrato nei sotto-quadrati per caricarlo quando i giocatori sono su o molto vicino al terreno.

Ma come puoi vedere nella foto, c'è un problema se il giocatore cerca di atterrare su un palo: i quadrati diventano rettangoli molto sottili, o addirittura triangoli per l'ultima linea, e in aggiunta al fatto che sarebbero molti da caricare, la generazione sembrerebbe distorta.

2. A partire da un icosaedro.

metodo icosaedro

Qui, potrei solo aumentare la tassellatura triangolare intorno alla posizione del giocatore quando si avvicina.

Ma non so come individuare i triangoli vicini alla posizione del giocatore. Ho sentito che le coordinate cartesiane potrebbero essere utili in quel caso, ma non so come usarle.


Sto usando C ++ / OpenGL per questo, quindi la cosa principale da generare e caricare qui sono i vertici che rappresentano il rilievo superficiale e il colore / la trama.


Prima di iniziare a scrivere, il tuo mondo è una sfera? Stai cercando di imporre una griglia su una sfera in cui ogni griglia ha proprietà salvate in un file?
Alec Teal,

@AlecTeal Sto cercando di simulare un pianeta. Quindi è globalmente una sfera. E il problema principale è che il giocatore può provare a terra su qualsiasi punto, su un palo o lungo l'equatore.
Aracthor,

2
Quindi .... devo chiedere hai cercato "motore di gioco del mondo sferico" in quanto ci sono un sacco di implementazioni lì. Perché non funzionano? Inoltre questo è il motivo per cui abbiamo mappe cubiche, sono i grafici standard su qualsiasi varietà topologica omeomorfa a una sfera per questo motivo!
Alec Teal,

1
suggerisco di valutare anche l'opzione quadrupla sfera
dnk drone.vs.drones,

maths.kisogo.com/index.php?title=Notes:Spherical_coordinates bozza preliminare. Ha bisogno di foto e per essere completato.
Alec Teal,

Risposte:


5

Va bene, quindi l'ho scritto qui:

http://www.maths.kisogo.com/index.php?title=Notes:Spherical_coordinates

(Avevo bisogno del markup matematico ed è anche piuttosto lungo)


Applicazione del documento

Il documento inizia introducendo la nozione di una varietà, una varietà è questa cosa in cui pezzi di esso sono "omeomorfi" (sostanzialmente: lo stesso di) blocchi di R ^ n (R ^ 2 è il piano x / y, come si potrebbe conoscere)

Un grafico copre alcuni (forse tutti, anche se nel caso di una sfera NON PU cover coprire tutti) di un collettore.

Nell'articolo sviluppo 4 grafici per la sfera che preserva gli angoli, ovvero mantengono una distanza regolare.

Come hai scoperto, dare coordinate a punti su una sfera è in realtà abbastanza difficile! Quello che facciamo invece (sebbene su un cerchio nell'esempio) è dare ad ogni punto una coordinata della forma (i, x, y) dove i è un numero compreso tra 1 e 6 per una sfera, 1 e 4 per un cerchio. Questo è il numero del grafico.

La xey si riferiscono agli angoli su quel grafico (o solo x se si tratta di un cerchio).

Le 6 carte di una sfera sono gli emisferi superiore / inferiore, gli emisferi sinistro / destro e anteriore / posteriore.


Coordinate

Ora puoi dare ad ogni punto una coordinata "bella" che si comporta bene. In termini matematici i domini dei grafici sono mappe "aperte", ciò significa che esiste un numero positivo tale che una sfera attorno a ciascun punto è anche nell'insieme. Ad esempio l'intervallo (0,1) (l'insieme che contiene x se 0 <x <1) è aperto, prendere qualsiasi p in (0,1) (ad esempio 0,001) quindi c'è un numero (ad esempio 0.0005) tale che qualsiasi punto compreso tra 0,0005 di 0,001 è anche in (0,1).

Ciò significa che puoi passare le indicazioni attraverso i grafici.

Ora ci sono 45 gradi di sovrapposizione nei grafici che sviluppiamo. Ciò significa che se hai una funzione alle coordinate (i, x, y) puoi SICURAMENTE specificare i punti del modulo (i, x + a, y + b) purché ae bsiano compresi tra -45 e +45 (in gradi)

Qualsiasi punto della forma (i, x + a, y + b) può essere facilmente trasformato in un punto nello spazio tridimensionale "normale" senza problemi.


Implementazione

Ora hai un modo per memorizzare le coordinate per qualcosa su una sfera e denotare regioni con ampie aree di spazio con queste coordinate, si comportano anche come coordinate, ad esempio sono aperte (il che è un problema se usi invece 2 angoli)

Puoi anche scartare totalmente le risposte "come creare una sfera regolare" ora perché tutto ciò che devi fare è fare 6 piani e assicurarti che i loro bordi si allineino (il che è banale) e il risultato è:

Avrai una bella sfera con coordinate facili da usare

Per qualsiasi domanda, commenta, ho provato ad assumere poche conoscenze preliminari. Sono anche nuovo per insegnare alle persone


@Alec_Teal Sono sulla tua risposta da quando l'hai pubblicata, complessa e difficile da capire (non sono abituata a così tante formule matematiche) ma penso di dover capire ... Il tuo metodo è davvero diverso da un cubo basato sfera come descritto sopra? Non ho capito se i tuoi "grafici" sono proiezioni quadrate o qualcosa di più ...
Aracthor

@Aracthor è più generale. Un grafico è letteralmente come un grafico in un libro (di mappe), tutto ciò che fa è imporre una griglia su un'area. Supponiamo che tu abbia un toro, per esempio, o un toro a 2 fori, avresti bisogno di questi metodi. Nessuna delle risposte qui tratta delle coordinate su una sfera tanto quanto i modi regolari per creare la geometria, che è un compito diverso. Posso aiutarti con le formule, ho provato a scriverlo il più accessibile possibile, ma questo è il mio pane e burro, quindi non vedo la complessità.
Alec Teal,

@Alec_Teal L'ho convalidato, ma ancora non credo di aver ottenuto tutto. Ma continuiamo questa discussione in una chat room .
Aracthor,

12

Come hai già mostrato, esistono diverse soluzioni a questo problema, ma nessuna è ideale al 100%. Le sfere sono difficili.

Cube-based

Un percorso comune, usato da Spore e molto probabilmente altri giochi (anche se è difficile da dire con certezza senza sbirciare sotto il cofano), è proiettare la sfera su un cubo e usare una griglia quadrata su ogni faccia del cubo.

(Questo è ciò che Alec Teal e dnk drone.vs.drones descrivono nei commenti sopra)

Sfera suddivisa in base a un cubo

( Immagine da questo post che descrive l'utilizzo di una rappresentazione cubica per LoD )

Questo ha molti vantaggi del metodo latitudine-longitudine, con una distorsione di picco molto minore. È facile convertire avanti e indietro tra le posizioni sulla griglia del viso e le posizioni sulla sfera, normalizzando un vettore o dividendo per il suo componente più grande in valore assoluto. Inoltre si allinea perfettamente con le tecniche di texturing di mappatura dei cubi , che possono essere utili quando si visualizza l'intero pianeta da una distanza.

Il tipico approccio di mappatura si chiama proiezione gnomonica e presenta ancora un problema di mancata corrispondenza della densità, come si può vedere nell'immagine sopra. La griglia è molto più densa vicino agli angoli del cubo che al centro delle facce. Se l'uniformità è importante, puoi ridurla con le giuste formule di mappatura, ma di solito questo rende più difficile invertire la mappatura.

Variare la funzione di mappatura per migliorare l'uniformità

In tutti i casi, avrai ancora una distorsione angolare agli angoli, in cui una normale intersezione della griglia di quattro quadrati con angoli di 90 gradi diventa un incontro di 3 rombi con angoli di 120 gradi.

Icosaedro-based

Il mio approccio personale preferito sarebbe la versione icosaedrica che hai descritto, perché riduce al minimo la distorsione angolare di picco. Laddove la griglia triangolare avrebbe normalmente sei triangoli che si incontrano ad angoli di 60 gradi, i vertici dell'icosaedro hanno 5 triangoli che si incontrano ad angoli di 72 gradi. Quindi ognuno ha una distorsione minore rispetto ai quadrati nell'esempio del cubo.

Non è un territorio così familiare come i quadrati della versione cubica, motivo per cui probabilmente non è così popolare. Ci vuole un po 'più di matematica per elaborare.

Identificare i punti vicini non è così difficile come potrebbe sembrare però. Qualsiasi sfera geodetica a base di icosaedro può essere appiattita su una griglia triangolare regolare:

Appiattimento di tessellazioni geodetiche su una griglia triangolare regolare Rete di un icosaedro su una griglia triangolare

E una griglia triangolare regolare può essere trattata come una griglia quadrata, come discusso qui .

Isomorfismo a griglia triangolare-quadrata

Quindi, una volta determinata la faccia dell'icosaedro in cui ti trovi (che può essere fatto con un raycast contro una maglia icosaedrica - non conosco alcun modo matematico intelligente per semplificare quella parte), l'ambiente può essere riempito usando un familiare attraversamento della griglia. :)

Modificare:

Se usi una geodetica di Classe I, puoi scartare i tuoi pianeti in cinque grafici rettangolari per archiviare in modo efficiente blocchi / trame / altezze di livello, in modo simile ai sei grafici quadrati che utilizzeresti per archiviare una versione basata su cubo:

Scartare una geosfera in grafici rettangolari

(Questo può aiutare a rispondere alla preoccupazione sollevata da Fuzzy Logic in un'altra risposta. Questo è anche possibile, ma un po 'più complicato per la geodetica di Classe II. Non ho studiato la Classe III)

Il trucco è che gli assi di questi grafici non sono realmente perpendicolari in uso, quindi gli strumenti / la tecnologia di authoring e streaming esistenti non lo supportano immediatamente. Se stai pianificando di scrivere il tuo pezzo in streaming comunque o usando la generazione procedurale al volo, questo potrebbe non essere un problema. Potresti anche essere in grado di aggirare il problema di creazione generando le tue mappe di origine con una risoluzione più elevata di quella necessaria utilizzando strumenti più convenzionali, quindi eseguendoli attraverso un processo di cottura che campiona lungo la griglia del grafico per creare una rappresentazione densa ed efficiente che si collega direttamente nella struttura icosaedrica.


1
Ci sono alcune cose buone qui. Vorrei fare +1, ma ho intenzione di scrivere una risposta in seguito (cerco di rimanere fuori dalle prime fasi di voto quando rispondo anch'io). Il mio unico commento sarebbe che questo approccio è migliore per rendere le sfere piuttosto che modellare la superficie
Alec Teal,

Nel caso in cui tu sia curioso, ora ho finito la mia risposta.
Alec Teal,

4

La quadrupla sfera con LOD a pezzi è il metodo preferito se si desidera essere in grado di spostarsi dallo spazio al suolo con qualsiasi livello di terreno dettagliato, sia procedurale o predefiniti di altezza e trame.

Icosasphere fornisce una mesh più uniforme ed è facile da tessellare ma pone problemi nel tentativo di mappare trame e mappe di altezza che è necessario memorizzare nella cache e non sarà molto compatto o semplice in questo modo.

La sfera quadrupla ha punti di pizzicamento ma con una tessellazione sufficiente non li vedrai comunque. Quindi è possibile mappare le trame e implementare DLOD in modo efficace come se ogni regione (blocco) fosse una griglia quadrata con pochi problemi. Questo è più semplice da implementare rispetto a un'icosasfera e sarà più efficiente, sia nel calcolo che nelle risorse.

Vedi gli articoli di Sean O'Neil sulla generazione di un universo procedurale su Gamasutra:
- Parte 1 Perlin Noise e Fractal Brownian Motion per mappe di altezza e trame.
- Parte 2 Algoritmo ROAM per mesh procedurali con DLOD per la generazione di pianeti. Soffre di problemi di prestazioni. Non raccomandato ma buono per valore educativo.
- Parte 3 Risolve problemi con enormi problemi di scala, ottimizzazione e virgola mobile. Principalmente correlato alla scala dell'universo ma applicabile anche ai pianeti quando si desidera passare da scale di anni luce a centimetri.
- Parte 4 Discute l'implementazione di Quad-sphere con DLOD grosso (quad-albero) per la generazione del pianeta <- vedi questo articolo in particolare


0

Non sono un esperto di programmazione, ma potresti avere una sorta di checkpoint. Mentre sei autorizzato attraverso un checkpoint di sicurezza, con l'animazione ovviamente, la superficie del pianeta può caricare e viceversa.


Questo aggira il problema aprendo l'opzione per non progettare la superficie del pianeta esplorabile come una sfera, ma non risolverlo.
Philipp,
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.