È possibile utilizzare le funzioni di rumore per generare altezze casuali. Il più semplice è il rumore di valore, che funziona esattamente come la tua descrizione: generi delle altezze di numeri interi casuali e poi interpoli le altezze tra di loro. Il metodo di interpolazione più utilizzato è la mappatura della curva a S cubica:
Supponiamo di avere altezza h0
nel punto x0
e altezza h1
nel punto x1
. Quindi, per ottenere l'altezza in qualsiasi punto x
( x0<=x<=x1
), si utilizza
t = (x-x0)/(x1-x0); // map to [0,1] range
t = t*t*(3 - 2*t); // map to cubic S-shaped curve
h = h0+t*h1;
Le altezze ottenute in questo modo saranno fluide, casuali, ma non molto interessanti. Per migliorare il tuo terreno, puoi usare il rumore frattale . Funziona così: supponi di aver generato una funzione h(x)
che restituisce altezza a una determinata coordinata (usando il metodo sopra). Questa funzione ha una frequenza, determinata dalla frequenza delle altezze originali dell'interger. Per ricavarne un frattale, combini insieme funzioni con diverse frequenze:
fbm(x)=h(x) + 0.5*h(2*x) + 0.25*h(4*x) + 0.125*h(8*x);
In questo esempio, combino quattro frequenze: originale, doppia, 4 volte e 8 volte originale, con frequenze più alte con un peso inferiore. Teoricamente, i frattali vanno fino all'infinito, ma in pratica sono richiesti solo pochi termini. Il fbm
nella formula sta per frazionario moto browniano - questo è il nome di questa funzione.
Questa è una tecnica potente. Puoi giocare con il moltiplicatore di frequenza, con pesi di frequenze diverse o aggiungere alcune funzioni per distorcere il rumore. Ad esempio, per ottenere una sensazione più "increspata", h(x)
può essere modificato in 1-abs(h(x))
(assumendo -1<=h(x)<=1
)
Tuttavia, mentre tutto ciò è bello, questa tecnica ha un serio limite. Con un approccio basato sulla "linea di altezza", non puoi mai avere "sporgenze" del terreno. E immagino che siano una caratteristica molto bella da avere in un gioco simile a "Moon Buggy".
L'aggiunta di belle sporgenze è un compito difficile. Una cosa che mi viene in mente: puoi iniziare con una "linea di altezza" frattale e "tessellate" in una serie di spline o curve di Bezier. Quindi la linea del terreno sarà definita da diversi "punti chiave". Applicare un po 'di jitter a questi punti chiave: ciò comporterà una deformazione casuale del terreno, probabilmente formando alcune forme interessanti. Tuttavia, le autointersezioni del terreno potrebbero diventare un problema con questo approccio, specialmente con livelli di jitter elevati.