This shows you the differences between two versions of the page.
|
gp:laboratoare:05 [2026/03/27 18:27] maria_anca.balutoiu [Modelul Whittaker] |
gp:laboratoare:05 [2026/04/01 11:48] (current) maria_anca.balutoiu [Fractal Noise] |
||
|---|---|---|---|
| Line 8: | Line 8: | ||
| * Octava 3+: detalii fine (stânci, denivelări mici) | * Octava 3+: detalii fine (stânci, denivelări mici) | ||
| - | Parametrii care controlează fBm sunt: | + | Parametrii care controlează Fractal Noise sunt: |
| * **Octave:** Numărul de straturi de zgomot | * **Octave:** Numărul de straturi de zgomot | ||
| * **Persistence:** Cât de repede scade amplitudinea | * **Persistence:** Cât de repede scade amplitudinea | ||
| Line 38: | Line 38: | ||
| {{ :gp:laboratoare:whittaker.png?500 |}} | {{ :gp:laboratoare:whittaker.png?500 |}} | ||
| + | |||
| + | Un tabel simplificat de clasificare Whittaker poate fi următorul: | ||
| + | |||
| + | ^ Biom ^ Elevație ^ Umiditate ^ | ||
| + | | Ocean | < 0.35 | - | | ||
| + | | Plajă | 0.35 - 0.40 | - | | ||
| + | | Deșert | 0.40 - 0.75 | < 0.20 | | ||
| + | | Savană | 0.40 - 0.75 | 0.20 - 0.40 | | ||
| + | | Pădure temperată | 0.40 - 0.75 | 0.40 - 0.65 | | ||
| + | | Junglă | 0.40 - 0.75 | 0.65 - 0.85 | | ||
| + | | Mlaștină | 0.40 - 0.75 | > 0.85 | | ||
| + | | Tundră | 0.60 - 0.75 | < 0.40 | | ||
| + | | Taiga | 0.60 - 0.75 | > 0.40 | | ||
| + | | Zăpadă / Munte înalt | > 0.75 | - | | ||
| + | |||
| + | <note important>Harta de elevație și harta de umiditate trebuie generate cu seed-uri diferite. Dacă se folosește același seed, cele două hărți vor fi identice, iar clasificarea biomilor va fi incorectă, deoarece fiecare punct va avea aceeași valoare de elevație și umiditate.</note> | ||
| + | |||
| + | ==== Implementare ==== | ||
| + | - Fractal Noise | ||
| + | - Generarea celor două hărți de elevație și de umiditate, fiecare cu propriul seed | ||
| + | - Clasificarea biomurilor | ||
| + | - Construirea mesh-ului 3 | ||
| + | |||
| + | Pentru fiecare vertex al grilei se calculează înălțimea din harta de elevație și culoarea din clasificarea biomurilor. Apa este aplatizată la ''waterLevel'' pentru a simula suprafața oceanului: | ||
| + | |||
| + | <code csharp> | ||
| + | for (int z = 0; z < mapHeight; z++) | ||
| + | { | ||
| + | for (int x = 0; x < mapWidth; x++) | ||
| + | { | ||
| + | int idx = z * mapWidth + x; | ||
| + | float height = elevationMap[x, z] < waterLevel ? waterLevel : elevationMap[x, z]; | ||
| + | vertices[idx] = new Vector3(x * meshScale, height, z * meshScale); | ||
| + | colors[idx] = GetBiomeColor(elevationMap[x, z], moistureMap[x, z]); | ||
| + | } | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | Triangularea grilei (două triunghiuri per pătrat): | ||
| + | |||
| + | <code csharp> | ||
| + | int a = z * mapWidth + x; | ||
| + | int b = a + 1; | ||
| + | int c = a + mapWidth; | ||
| + | int d = c + 1; | ||
| + | |||
| + | triangles[triIdx++] = a; | ||
| + | triangles[triIdx++] = c; | ||
| + | triangles[triIdx++] = b; | ||
| + | |||
| + | triangles[triIdx++] = b; | ||
| + | triangles[triIdx++] = c; | ||
| + | triangles[triIdx++] = d; | ||
| + | </code> | ||
| + | |||
| + | {{ :gp:laboratoare:result.png?500 |}} | ||
| ==== Tasks ==== | ==== Tasks ==== | ||
| + | - Generați harta de elevație și harta de umiditate cu seed-uri diferite, folosind în ambele cazuri multiple octave (6-8). | ||
| + | - Generați culori diferite pentru fiecare biom, folosind tabelul Whittaker. | ||
| + | - Construiți mesh-ul 3D atribuind fiecărui vertex înălțimea și culoarea corectă. | ||
| + | - **Bonus 1.** Implementați algoritmul ''Diamond Square'', pentru a genera un heightmap. | ||
| + | |||
| + | <note tip> | ||
| + | - **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 Romb.** Se calculează punctul din mijloc al fiecărui diamant, făcând media aritmetică ale celor 4 colțuri ale rombului la care se adună o valoare aleatoare din intervalul predefinit de valori aleatoare. În cazul în care rombul 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 romb până se aleg calculează toate valorile din grid. | ||
| + | Resurse: [[https://www.youtube.com/watch?v=4GuAV1PnurU|https://www.youtube.com/watch?v=4GuAV1PnurU]] | ||
| + | </note> | ||