Differences

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

Link to this comparison view

gp:laboratoare:02 [2025/03/11 16:21]
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>​
  
-<​hidden>​ +Odată calculate cele 4 produse scalare ​pentru ​cele 4 colțuriacestea se vor interpola ​pentru a obține ​valoarea finală. Însăla un moment dat se pot interpola doar 2 valori. Astfelse pot interpola mai întâi valorile din stânga celului ​și cele din dreaptaiar apoi se va realiza ​interpolare ​între ​cele 2 rezultate ​sau se pot interpola mai întâi valori din partea de jos a celulei ​și cele din partea de susiar apoi se vor interpola cele 2 valori rezultate.
-Acum că trebuie să punctăm un produs ​pentru ​fiecare ​colț, ​trebuie să le amestecăm cumva pentru a obține ​o singură valoarePentru aceastavom folosi interpolarea. Interpolarea este o modalitate de a afla ce valoare ​se află între alte 2 valori ​(să zicema1 și a2)având în vedere ​altă valoare t între ​0,0 și 1,0 (un procent, practic, unde 0,0 este 0% și 1,0 este 100%). De exemplu: dacă a1 este 10, a2 este 20 și t este 0,5 (deci 50%), valoarea interpolată ar fi 15 deoarece este la jumătatea distanței între 10 și 20 (50% sau 0,5). Un alt exemplu: a1=50, a2=100 ​și t=0,4. Atunci valoarea interpolată ar fi la 40% din distanță între 50 și 100adică 70. Aceasta ​se numește interpolare liniară deoarece valorile interpolate sunt într-o curbă liniară.+
  
-Acum avem 4 valori pe care trebuie să le interpolămdar putem interpola doar 2 valori la un moment dat. Decimodul în care folosim interpolarea pentru zgomotul Perlin este că interpolăm valorile din stânga sus și din stânga jos împreună pentru a obține o valoare pe care o vom numi v1. După aceea, facem același lucru pentru sus-dreapta și jos-dreapta pentru a obține v2. Apoi, în sfârșit, interpolăm între v1 și v2 pentru a obține o valoare finală. Aceasta este valoarea pe care dorim să o returneze funcția noastră de zgomot.+<​code>​ 
 +def lerp(ta1a2): 
 +    return a1 + t * (a2 a1) 
 +</​code>​
  
-Rețineți că dacă schimbăm puțin punctul de intrarevectorii dintre fiecare colț și punctul de intrare se vor schimba puțin și ei, în timp ce vectorul constant ​nu se va schimba deloc. Produsele punctiforme se vor schimba, de asemenea, doar puțin, la fel și valoarea finală va reveni de către funcția de zgomot. Chiar dacă intrarea schimbă pătratul grilei, cum ar fi de la (3.01, 2.01) la (2.99, 1.99), valorile finale vor fi totuși foarte apropiate, deoarece ​chiar dacă 2 (sau 3) dintre colțuri se schimbă, celelalte 2 (sau 1) nu s-ar face șdeoarece cu ambele intrări suntem aproape de colț(e)interpolarea va face ca valoarea finală a colțului să fie într-adevăr aproape ​de acea valoare. Deoarece cu ambele intrări acel colț va avea aceeași valoare, rezultatele finale vor fi foarte ​apropiate.+Dacă am folosi interpolarea liniară, aceasta ​nu ar da rezultate excelente, deoarece s-ar simțnenaturaltrecerea ​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ă:+{{ :gp:​laboratoare:​perlin_noise_liniar_interpolation.png?​500 |}}
  
-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:+În schimb, ne-am dori un rezultat de genul:
  
-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_nonlinear_interpolation.png?500 |}} 
  
-Pentru a face acest lucruavem nevoie ​de ceva numit curbă ​de ușurință: este doar o curbă matematică care arată astfel:+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.1741702907.txt.gz · Last modified: 2025/03/11 16:21 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