Differences

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

Link to this comparison view

gp:laboratoare:02 [2025/03/11 16:27]
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 89: Line 89:
 </​code>​ </​code>​
  
-Odată calculate cele 4 produse scalare pentru cele 4 colțuri, acestea se vor interpola pentru a obține valoarea finală. Însă, la un moment dat se pot interpola doar 2 valori. Astfel, se pot interpola mai întâi valorile din stânga celului și cele din dreapta, iar apoi se va realiza o interpolare între cele 2 rezultate sau se pot interpola mai întâi valori din partea de jos a celulei și cele din partea de sus, iar apoi se vor interpola cele 2 valori rezultate. ​+Odată calculate cele 4 produse scalare pentru cele 4 colțuri, acestea se vor interpola pentru a obține valoarea finală. Însă, la un moment dat se pot interpola doar 2 valori. Astfel, se pot interpola mai întâi valorile din stânga celului și cele din dreapta, iar apoi se va realiza o interpolare între cele 2 rezultate sau se pot interpola mai întâi valori din partea de jos a celulei și cele din partea de sus, iar apoi se vor interpola cele 2 valori rezultate.
  
-<hidden+<code
-Am putea folosi interpolarea liniarădar aceasta nu ar da rezultate excelentedeoarece s-ar simți nenatural, ca în această imagine care arată interpolarea liniară 1 dimensională:+def lerp(ta1a2): 
 +    return a1 + t * (a2 - a1) 
 +</​code>​
  
-După cum puteți vedeaschimbarea 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:+Dacă am folosi interpolarea liniară, aceasta nu ar da rezultate excelente, deoarece s-ar simți nenaturaltrecerea de la o celulă la alta ar fi foarte ​bruscă:
  
-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.+{{ :​gp:​laboratoare:​perlin_noise_liniar_interpolation.png?500 |}}
  
-Pentru a face acest lucruavem nevoie ​de ceva numit curbă de ușurință: este doar o curbă matematică care arată astfel:+În schimb, ne-am dori un rezultat de genul: 
 + 
 +{{ :​gp:​laboratoare:​perlin_noise_nonlinear_interpolation.png?​500 |}}  
 + 
 +Pentru a obține de acest rezultatKen Perlin s-a folosit ​de funcția **fade** pentru a uniformiza valorile de input ale interpolării: 
 + 
 +<​code>​ 
 +def fade(t): 
 +    return ((6 * t - 15) * t + 10) * t * t * t 
 +</​code>​
  
-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Șpentru ​valoare între 0,5 și 1,0, ieșirea este puțin mai aproape ​de 1,0Pentru x=0,5, y=0,5Asta va face treaba perfect.+==== Tasks ==== 
 +  - Implementați algoritmul Perlin Noise. Salvați rezultatul într-o imagine PNG. 
 +  - Într-un proiect Unitygenerați un teren cu denivelărifolosind Perlin Noise. 
 +  - **Bonus 1.** Adăugațîncă ​octavă în implementarea algoritmului. 
 +  - **Bonus 2.** Implementați efectul ​de plasmă specific Perlin NoiseExemplu: 
 +<​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>​
  
-Curba de mai sus este funcția ​de ușurință folosită de Ken Perlin în implementarea lui Perlin NoiseEcuația este 6t5-15t4+10t3. Aceasta se mai numește și funcție de estompare. În codarată așa:</hidden>+<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.1741703270.txt.gz · Last modified: 2025/03/11 16:27 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