This shows you the differences between two versions of the page.
gp:laboratoare:04 [2025/03/21 22:46] maria_anca.balutoiu [Cum funcționează?] |
gp:laboratoare:04 [2025/03/30 14:51] (current) maria_anca.balutoiu [Diamond Square Algorithm] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Laboratorul 04. Diamond Square Algorithm ===== | + | ===== 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. | 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ă? ==== | + | === 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. | - **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 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. | - **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 predefiniti 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. | + | - **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. |
- | <hidden> | + | |
- | Explicaţie: | + | ==== 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. | ||
- | Inițializare: grila este inițializată cu zerouri, iar cele patru colțuri sunt setate la o valoare de scară specificată. | + | <code> |
+ | float CalculateFractalNoise(int x, int y) | ||
+ | { | ||
+ | for (i = 0; i < octaves; i++) | ||
+ | { | ||
+ | xCoord = (float)x / width * scale * frequency; | ||
+ | yCoord = (float)y / height * scale * frequency; | ||
- | Pas de diamant: calculează punctul de mijloc al fiecărui pătrat făcând o medie a celor patru colțuri și adăugând o compensare aleatorie. | + | perlinValue = Mathf.PerlinNoise(xCoord, yCoord) * 2 - 1; |
+ | noiseHeight += perlinValue * amplitude; | ||
- | Pas pătrat: calculează punctul de mijloc al fiecărui diamant făcând o medie a punctelor din jur și adăugând o compensare aleatorie. | + | amplitude *= persistence; |
+ | frequency *= lacunarity; | ||
+ | } | ||
- | Recursie: Procesul se repetă, înjumătățind dimensiunea pasului și scara de fiecare dată, până când se atinge nivelul dorit de detaliu. | + | return (noiseHeight + 1) / 2; // Normalize to 0 - 1 |
- | </hidden> | + | } |
+ | </code> | ||
+ | |||
+ | ==== Tasks ==== | ||
+ | - Implementați algoritmul diamond-square. | ||
+ | - Deformați un teren, folosind fractal noise în Unity. | ||
+ | - **Bonus.** Generați procedural multiple biomes. (Puteți porni de la acest exemplu: [[https://www.youtube.com/watch?v=aZyrimErjJ0]]) | ||