Laboratorul 04. Generare Procedurală de Teren
Diamond Square Algorithm
Algoritmul Diamond-Square este o tehnică procedurală utilizată pentru a genera heightmaps. Acesta funcționează prin subdivizarea recursivă a unui grid și aplicarea unor perturbări aleatorii pentru a crea variații cu aspect natural.
Cum funcționează?
Inițializare. Se crează un grid de zerouri. Cele 4 colțuri sunt setate la o valoare aleatoare dintr-un interval predefinit de posibile înălțimi.
Pasul Pătrat. Se calculează punctul din mijloc al fiecărui pătrat, făcând media aritmetică ale celor 4 colțuri la care se adaugă o valoare aleatoare dintr-un interval predefinit.
Pasul Diamant. Se calculează punctul din mijloc al fiecărui diamant, făcând media aritmetică ale celor 4 colțuri ale diamantului la care se adună o valoare aleatoare din intervalul predefinit de valori aleatoare. În cazul în care diamantul este incomplet, se iau în calcul doar colțurile existente în calculul mediei aritmetice.
Recursivitate. Intervalul predefinit de valori aleatoare se înjumătățește. Se reiau pașii pătrat și diamant până se aleg calculează toate valorile din grid.
Fractal Noise
Pentru a îmbunătăți realismul terenului generat, tereneul se poate genera folosind fractal noise, care combină mai multe straturi de zgomot Perlin la frecvențe și amplitudini diferite.
float CalculateFractalNoise(int x, int y)
{
for (i = 0; i < octaves; i++)
{
xCoord = (float)x / width * scale * frequency;
yCoord = (float)y / height * scale * frequency;
perlinValue = Mathf.PerlinNoise(xCoord, yCoord) * 2 - 1;
noiseHeight += perlinValue * amplitude;
amplitude *= persistence;
frequency *= lacunarity;
}
return (noiseHeight + 1) / 2; // Normalize to 0 - 1
}
Tasks
Implementați algoritmul diamond-square.
Deformați un teren, folosind fractal noise în Unity.
-