Differences

This shows you the differences between two versions of the page.

Link to this comparison view

gp:laboratoare:02 [2025/03/11 16:29]
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 96: Line 96:
 </​code>​ </​code>​
  
-<​hidden>​ +Dacă am folosi interpolarea liniară, aceasta nu ar da rezultate excelente, deoarece s-ar simți nenatural, ​trecerea de la o celulă la alta ar fi foarte bruscă:
-Am putea folosi interpolarea liniară, ​dar aceasta nu ar da rezultate excelente, deoarece s-ar simți nenatural, ​ca în această imagine care arată interpolarea liniară 1 dimensională:+
  
-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:+{{ :gp:​laboratoare:​perlin_noise_liniar_interpolation.png?​500 |}}
  
-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.+În schimb, ​ne-am dori un rezultat ​de genul:
  
-Pentru a face acest lucru, avem nevoie de ceva numit curbă de ușurințăeste doar o curbă matematică care arată astfel:+{{ :gp:laboratoare:​perlin_noise_nonlinear_interpolation.png?​500 |}} 
  
-Dacă te uiți cu atențiepoț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.+Pentru a obține de acest rezultatKen Perlin s-a folosit de funcția **fade** ​pentru ​a uniformiza valorile ​de input ale interpolării:​
  
-Curba de mai sus este funcția de ușurință folosită de Ken Perlin în implementarea ​lui Perlin Noise. ​Ecuația este 6t5-15t4+10t3Aceasta se mai numește și funcție de estompareÎn codarată așa:</hidden>+<​code>​ 
 +def fade(t): 
 +    return ((6 * t - 15) * t + 10) * t * t * t 
 +</​code>​ 
 + 
 +==== 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&​amp;​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>​ 
 + 
 +<note tip>În Unity C# există ​funcția **float Mathf.PerlinNoise(float xfloat 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]]
gp/laboratoare/02.1741703397.txt.gz · Last modified: 2025/03/11 16:29 by maria_anca.balutoiu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0