Domanda

Quale sarebbe il modo migliore per implementare, archiviare e rendere mondi sferici, come quelli in spora o infinito ma senza gli stadi intermedi della spora, e mondi multipli sull'universo infinito. Non fare ipotesi su come viene generato il pianeta stesso o sulla sua dimensione / scala.

È stato utile?

Soluzione

Per il rendering, dovrai usare una sorta di algoritmo di livello di dettaglio per spostarti senza soluzione di continuità da vicino alla superficie del pianeta a molto lontano. Esistono molti algoritmi LOD dinamici ( vedi qui ). Un algoritmo più vecchio, chiamato ROAM, può essere adattato per gestire oggetti sferici o pianeti ( ROAM sferico ). Le clip geometriche sono un algoritmo più recente e più popolare che può essere adattato alle superfici sferiche e .

Per quanto riguarda l'archiviazione dei dati, potresti voler esaminare la generazione procedurale (a seconda delle tue esigenze) per texturing, heightmap, ecc. Questo è simile a come Infinity e Spore fanno le cose. Puoi leggere un po 'di texturing procedurale qui . Le mappe di altezza procedurali sono più semplici, a seconda di quanto complesso / realistico desideri il tuo terreno. Al livello più semplice, puoi semplicemente spostare l'altezza del vertice con una funzione di rumore perlin.

Altri suggerimenti

Se stai cercando qualcosa in cui archiviare dati sulla superficie, potresti guardare HEALpix . È un software sviluppato dalla comunità astronomica appositamente per mappare il cielo (un'altra superficie sferica).

HEALpix crea una mesh che descrive la posizione e le dimensioni delle facce della superficie e assegna a ciascuna un ID. Puoi quindi utilizzare quell'ID come chiave o indice per accedere a tutti i dettagli che desideri su quel determinato livello.

HEASpix fornisce metodi per trovare aree di superficie vicine e può fornire posizioni al centro e al vertice per ciascun punto della mesh.

È una mesh gerarchica che ti consente di suddividere ogni faccia quanto vuoi, in teoria potresti avere parti della mesh a bassa risoluzione e altre parti con livelli di dettaglio più alti se lo desideri. Ha la bella proprietà di essere infinitamente divisibile (fino ai limiti di memoria) e ogni pixel della griglia a una determinata risoluzione ha la stessa area di tutti gli altri a quel livello di risoluzione.

Il pacchetto di distribuzione fornisce molte cose che probabilmente non ti serviranno, ma le librerie di base dovrebbero essere utili.

Questo probabilmente NON è quello che stai cercando ... Ma che diamine. È una bella storia.

Eoni fa, quando i dinosauri vagavano ancora per la terra e la memoria era ancora misurata in kilobyte, giocavo con alcuni software per generare frattali di pianeti.

L'idea era di creare un rettangolo 2NxN che rappresentasse il pianeta. Taglia il pianeta in mezzo gruppo spostando leggermente le due metà ogni volta. (Onda sinusoidale per il taglio con sfasamento casuale e ampiezza. Un'altra onda sinusoidale casuale per lo spostamento.) Dopodiché, inondare le aree di livello inferiore con acqua e codificare il resto per altitudine.

Quindi metti una sfera di Diametro N in cima e proietta, avvolgendo una regione NxN della mappa attorno a metà della sfera. Sposta la sfera attorno alla mappa e sembra che stia ruotando.

Suggerirei di utilizzare una sorta di modello di poligono in memoria per implementarli nei mondi, utilizzare un file per archiviarli e renderli usando una sorta di motore 3d. O quello, o solo un centro puntatore e un raggio, insieme a una sovrapposizione per descrivere la geografia del mondo.

Modifica: Grazie per un po 'più di dettagli. A seconda della quantità di dettagli di cui hai bisogno, dovrai utilizzare una sorta di metodo per suddividere la trama in parti più piccole: puoi semplicemente generare la trama per 20 facce e costruire un Icosaedro attorno al punto centrale. Dai un'occhiata a proiezioni di mappe per alcuni pensieri su come questo viene gestito nella vita reale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top