Caratteristiche di montagna a terrazze


10

Sto cercando di replicare un effetto procedurale del terreno che ho trovato su un sito di portfolio / blog qualche giorno fa.

Terreno terrazzato

Citando il sito, il terrazzamento è stato generato attraverso "moltiplicando [l'altezza finale] per un valore di smorzamento entro un certo intervallo di altezza, per creare meravigliose caratteristiche del canyon".

Mi chiedevo, qualcuno sarebbe stato in grado di fornire un esempio o una procedura più tecnica per farlo? Durante la scorsa settimana, ho studiato e imparato molto sui metodi e le pratiche procedurali di terreno / trama, ma non ho ancora trovato nulla che spieghi in dettaglio cosa sia il "bloccaggio" e sto iniziando a sentirmi frustrato.


Huh, è davvero pulito. Non riesco nemmeno a capire cosa voglia dire. Hai provato a inviare al tizio un'email (è disponibile in "contatto")?
Draco18s non si fida più di SE

Cordiali saluti: Nella tua citazione e fonte, il termine è "smorzamento", ma più tardi nella tua domanda usi invece "serraggio".
Pikalek,

Risposte:


11

Non so cosa faccia il loro progetto ma è possibile applicare una funzione di rimodellamento in altezza. Ecco un esempio che prende hda 0,0 a 1,0 e restituisce una nuova altezza da 0,0 a 1,0:

function R(h) {
    var W = 0.4; // width of terracing bands
    var k = Math.floor(h / W);
    var f = (h - k*W) / W;
    var s = Math.min(2 * f, 1.0);
    return (k+s) * W;
}

È una funzione simile a questa quando viene tracciata: l'asse x è l'altezza originale e l'asse y è la nuova altezza:

Funzione di rimodellamento dell'altezza

L'ho applicato al mio codice e ho ottenuto questo:

Uscita della funzione di terrazzamento

È possibile inserire qualsiasi tipo di funzione di rimodellamento o unirli insieme per ottenere effetti nitidi. Ottieni terrazze quando ci sono sezioni piatte dell'output.


Giuro che c'è un percorso agevole nella domanda del richiedente che sale su una terrazza, ma guardandolo di nuovo, sono abbastanza sicuro che sia un'illusione. Ma i miei occhi insistono ancora sul fatto che no, c'è un cambiamento di altezza lì (centro dell'immagine nell'angolo superiore / bordo superiore sinistro). Se non c'è aumento, allora questa risposta è corretta.
Draco18s non si fida più di SE

1

Lo smorzamento è un termine fisico per indicare un'influenza all'interno o su un sistema oscillatorio che ha l'effetto di ridurre, limitare o prevenire le sue oscillazioni.

Sospetto che il tuo articolo di origine potrebbe avere un errore di battitura e abbia significato il blocco , che generalmente si riferisce alla limitazione di un valore a un determinato intervallo.

Per quanto riguarda il raggiungimento dell'effetto visivo, potresti essere in grado di ottenere qualcosa di simile bloccando le bande di rumore durante la costruzione del terreno, ma la soluzione fornita da @amitp corrisponde più da vicino alla descrizione originale ed è probabilmente più facile da implementare e ottimizzare.

Una terza opzione potrebbe essere quella di utilizzare tecniche di erosione. Eccone uno per creare una combinazione di scogliera e spiaggia facendo cadere una sezione di terra in pendenza. Eccone un altro che può erodere i picchi in altipiani .


0

Dopo una molto lunga pausa, ora capisco come l'effetto è stato raggiunto, ed è incredibilmente semplice. Ci sono 4 parti in questo senso:

  • La mappa di altezza iniziale del terreno
  • Definire un 'intervallo' della terrazza, con l'altezza più bassa della terrazza essendo h1 e l'altezza più alta della terrazza essendo h2
  • Un valore di smorzamento che appiattisce il terreno entro l'intervallo dell'altezza della terrazza
  • Una seconda mappa di altezza a più lungo raggio per modificare i valori h1 e h2, che è il modo in cui si formano le rampe continue tra le terrazze (una terza mappa di altezza potrebbe essere utilizzata per aumentare o diminuire h1 e h2 indipendentemente l'una dall'altra, creando terrazze più grandi o più piccole)

Ecco la procedura per creare l'effetto:

h1 = 1
h2 = 2
damp = .01

h = gen_noise(position)
hm = heightmod_noise(position)
if h1+hm <= initial_terrain_height =< h2+hm
  th = h * damp
elseif h2+hm < h
  th = h - (h2-h1) * damp
else
  th = h

(th, ovviamente, è l'altezza del terreno dopo l'applicazione dell'effetto terrazzamento)

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.