Pianeti procedurali, mappe altimetriche e trame


19

Attualmente sto lavorando a un generatore di pianeti procedurali OpenGL. Spero di usarlo per un gioco di ruolo spaziale, che non permetterà ai giocatori di scendere sulla superficie di un pianeta, quindi ho ignorato qualsiasi cosa relativa alla ROAM. Al momento sto disegnando un cubo con VBO e mappando su una sfera.

Conosco la maggior parte delle tecniche di generazione della mappa di altezza frattale e ho già implementato la mia versione di spostamento del punto medio (non molto utile in questo caso, lo so).

La mia domanda è: qual è il modo migliore per generare proceduralmente la heightmap. Ho esaminato la libnoise che mi permette di creare mappe / trame di altezza piastrellabili, ma per quanto posso vedere avrei bisogno di generare una rete come questa .

Lasciando evidente la piastrellatura.

Qualcuno potrebbe consigliarmi il percorso migliore da prendere?

Qualsiasi input sarebbe molto apprezzato.

Risposte:


18

Prima di tutto, non sono sicuro del motivo per cui vuoi implementare una mappa di altezza (cioè spostamento della geometria) se le persone non saranno in grado di atterrare, sembra solo più efficiente mapparla normalmente o qualcosa del genere.

Detto questo, quello che vuoi è convertire da un arbitrario (x, y, z)a una (u, v)coordinata, il che è banale. Nessuna cubemap necessaria.

testo alternativo

testo alternativo

  1. Ogni (u, v)texel ha un'altezza (heightmap RGB = height) e una posizione (x, y, z) = pos.
  2. Trovare e normalizzare la posizione, NORMAL(x, y, z) = N.
  3. Nuovo vertice = pos+N*height.

Funzionerà meglio con una tassellatura più elevata. Utilizza anche la libnoisemappatura sferica corretta per la tua heightmap, che avrà un aspetto simile al seguente (ma in bianco e nero):

testo alternativo



1

La mappatura dell'altezza di spostamento del punto medio è un buon punto di partenza. OP, perché pensi che non lo sia?

OP è buono per modellare la superficie del pianeta come una mappa cubica, perché qualsiasi mappa piatta (ad esempio la proiezione di un mercatore) avrà distorsioni brutte e complicate, dal punto di vista matematico.

Se fossi OP, dimenticherei inizialmente la geometria del pianeta su larga scala. Vorrei creare una mappa cubica in cui ogni faccia è 2 ** N + 1 pixel (2,3,5,9,17,33 ...) e ogni texel codifica un'altezza [0..N) dove 0 è l'altitudine di la trincea più bassa prevista e N è l'altitudine della montagna più alta prevista sul pianeta.

Quindi calcolerei le altezze casuali per gli otto vertici del cubo e le propagerei nei sei quadrati della mappa del cubo, in modo che ciascun vertice si presenti tre volte.

Quando genererò ricorsivamente altezze frattali per i punti medi dei bordi, mi assicurerei di propagare i vertici del bordo della faccia sull'altra faccia che li condivide.

Una volta terminato, ho una mappa cubica in cui tutti i texel del bordo sono raddoppiati e tutti i texel degli angoli sono triplicati. Non c'è bisogno di convertirlo in una normale mappa: userei l'algoritmo nel documento di Morten Mikkelsen per eseguire il rendering delle normali direttamente dall'altezza in fase di esecuzione.

In fase di esecuzione probabilmente renderei un quad che copre la proiezione del pianeta sullo schermo e farei un singolo test di intersezione sfera-raggio nel pixel shader per scoprire se colpisco il pianeta e dove. Sicuramente batte rasterizzando un modello di sfera altamente tassellato e ottiene anche un bel bordo liscio.


1

Il rumore di spostamento del punto medio, con lo spostamento massimo ridimensionato in base alla longitudine assoluta del pixel, può produrre rapidamente una mappa del rumore sferica. Le tabelle dei colori che misurano altitudine, pendenza e luce solare o longitudine mentre i parametri possono essere usati per ombreggiare automaticamente il pianeta.

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.