Puede usar funciones de ruido para generar alturas aleatorias. El más simple de ellos es el ruido de valor, que funciona exactamente como su descripción: genera algunas alturas enteras aleatorias y luego interpola alturas entre ellas. El método de interpolación más utilizado es el mapeo cúbico de la curva S:
Suponga que tiene altura h0
en el punto x0
y altura h1
en el punto x1
. Luego, para obtener la altura en cualquier punto x
( x0<=x<=x1
), usa
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;
Las alturas obtenidas de esta manera serán suaves, aleatorias, pero no realmente interesantes. Para mejorar su terreno, puede usar el ruido fractal . Funciona así: suponga que ha generado una función h(x)
que devuelve la altura en una coordenada dada (utilizando el método anterior). Esta función tiene una frecuencia, determinada por la frecuencia de las alturas del número entero original. Para crear un fractal, combina las funciones con varias frecuencias:
fbm(x)=h(x) + 0.5*h(2*x) + 0.25*h(4*x) + 0.125*h(8*x);
En este ejemplo, combino cuatro frecuencias: original, doble, 4 veces y 8 veces original, con frecuencias más altas con menos peso. Teóricamente, los fractales llegan hasta el infinito, pero en la práctica solo se requieren unos pocos términos. El fbm
en la fórmula representa el movimiento browniano fraccional; este es el nombre de esta función.
Esta es una técnica poderosa. Puede jugar con multiplicador de frecuencia, con pesos de diferentes frecuencias, o agregar algunas funciones para distorsionar el ruido. Por ejemplo, para obtener una sensación más "rugosa", h(x)
se puede cambiar a 1-abs(h(x))
(suponiendo -1<=h(x)<=1
)
Sin embargo, si bien todo esto es bueno, esta técnica tiene una seria limitación. Con un enfoque basado en la "altura", nunca puede tener "voladizos" del terreno. E imagino que son una característica muy agradable para tener en un juego tipo "Moon Buggy".
Agregar buenos voladizos es una tarea difícil. Una cosa en la que puedo pensar es que puedes comenzar con una "línea de altura" fractal y "teselarla" en una serie de splines o curvas bezier. Luego, la línea del terreno se definirá por varios "puntos clave". Aplique un poco de jitter a estos puntos clave: esto dará como resultado una deformación aleatoria del terreno, probablemente formando algunas formas interesantes. Sin embargo, las auto intersecciones del terreno pueden convertirse en un problema con este enfoque, especialmente con grandes cantidades de fluctuación.
Mi idea sería crear una función de ruido suavizado. Primero con un método intNoise (int) que devuelve un int "aleatorio", pero que depende de la entrada. Si usa la misma entrada dos veces, el resultado será el mismo.
Luego use un método de suavizado para hacer un floatNoise (float) que usa los dos enteros alrededor de la entrada para construir un valor aleatorio.
Luego use la posición X como entrada y la Y como salida. El resultado será una curva suavizada pero con una altura aleatoria.
fuente