This shows you the differences between two versions of the page.
gp:laboratoare:02 [2025/03/11 16:32] maria_anca.balutoiu [Implementare] |
gp:laboratoare:02 [2025/03/14 15:53] (current) maria_anca.balutoiu [Implementare] |
||
---|---|---|---|
Line 77: | Line 77: | ||
<code> | <code> | ||
def getConstantVector(v): | def getConstantVector(v): | ||
- | h = v % 3 | + | h = v % 4 |
if h == 0: | if h == 0: | ||
Line 100: | Line 100: | ||
{{ :gp:laboratoare:perlin_noise_liniar_interpolation.png?500 |}} | {{ :gp:laboratoare:perlin_noise_liniar_interpolation.png?500 |}} | ||
- | <hidden> | + | În schimb, ne-am dori un rezultat de genul: |
+ | {{ :gp:laboratoare:perlin_noise_nonlinear_interpolation.png?500 |}} | ||
- | După cum puteți vedea, schimbarea dintre ceea ce este inferior lui 1 și ceea ce este superior lui 1 este bruscă. Ceea ce ne dorim este ceva mai lin, ca acesta: | + | Pentru a obține de acest rezultat, Ken Perlin s-a folosit de funcția **fade** pentru a uniformiza valorile de input ale interpolării: |
- | Cu interpolarea liniară, am folosi xf ca valoare de interpolare (t). În schimb, vom transforma xf și yf în u și v. O vom face astfel încât, având în vedere o valoare a t între 0,0 și 0,5 (exclus), valoarea transformată va fi ceva mai mică (dar plafonată la 0,0). De asemenea, având în vedere o valoare a t între 0,5 (exclus) și 1,0, valoarea transformată ar fi puțin mai mare (dar plafonată la 1,0). Pentru 0,5, valoarea transformată ar trebui să fie 0,5. Acest lucru va avea ca rezultat o tranziție curbată, ca în figurile 5 și 6. | + | <code> |
- | + | def fade(t): | |
- | Pentru a face acest lucru, avem nevoie de ceva numit curbă de ușurință: este doar o curbă matematică care arată astfel: | + | return ((6 * t - 15) * t + 10) * t * t * t |
+ | </code> | ||
- | Dacă te uiți cu atenție, poți vedea că pentru o intrare (xf sau yf, axa x) între 0,0 și 0,5, ieșirea (u sau v, axa y) este puțin mai aproape de 0,0. Și pentru o valoare între 0,5 și 1,0, ieșirea este puțin mai aproape de 1,0. Pentru x=0,5, y=0,5. Asta va face treaba perfect. | + | ==== Tasks ==== |
+ | - Implementați algoritmul Perlin Noise. Salvați rezultatul într-o imagine PNG. | ||
+ | - Într-un proiect Unity, generați un teren cu denivelări, folosind Perlin Noise. | ||
+ | - **Bonus 1.** Adăugați încă o octavă în implementarea algoritmului. | ||
+ | - **Bonus 2.** Implementați efectul de plasmă specific Perlin Noise. Exemplu: | ||
+ | <html> | ||
+ | <p style="text-align:center;margin:auto;"> | ||
+ | <iframe width="560" height="315" src="https://www.youtube.com/embed/9B89kwHvTN4?si=McVA2s62UZGbUNTF&start=242" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> | ||
+ | </p> | ||
+ | </html> | ||
- | Curba de mai sus este funcția de ușurință folosită de Ken Perlin în implementarea lui Perlin Noise. Ecuația este 6t5-15t4+10t3. Aceasta se mai numește și funcție de estompare. În cod, arată așa:</hidden> | + | <note tip>În Unity C# există funcția **float Mathf.PerlinNoise(float x, float y)**</note> |
+ | ==== Resurse ==== | ||
+ | * [[https://www.youtube.com/watch?v=9B89kwHvTN4]] | ||
+ | * [[https://rtouti.github.io/graphics/perlin-noise-algorithm]] | ||
+ | * [[https://www.youtube.com/watch?v=vFvwyu_ZKfU]] |