07. Náhodný šum
Last updated
Last updated
Urobte skeč, ktorý po celej dĺžke obrazovky nakreslí sínusoidu:
Sínusoida je nakreslená tak, že v cykle ideme s x
zľava doprava po obrazovke. Pre každé x
vypočítame sínus. Tu napríklad s frekvenciou f = 0.03
. Výsledok mapujeme na rozsah výšky obrazovky (0, height)
a nakreslíme zvislú bielu čiaru od stredu obrazovky (x, height/2
) do tejto hodnoty.
Upravte skeč tak, aby sínusoida bola len v hornej tretine obrazovky:
Oscilácia cez sínus je pravidelné opakovanie a pôsobi niekedy umelo a strojene. Periodické opakovanie začne byť po chvíli nudné a nepôsobí organicky.
Preto často používame náhodnosť pomocou random()
. Doplníme teraz do programu ukážku ako vyzerajú úplne random čísla v porovnaní so sínusom:
Takáto náhoda je zase až príliš náhodná a divoká. Potrebovali by sme niečo čo je menej divoké, ale zároveň nie je také pravidelné a predvídateľné ako sínus. Tu nám pomôže šum pomocou funkcie noise()
.
Funkcia noise()
funguje podobne ako sínus. Dáme jej ako parameter nejaké číslo a ona vygeneruje výšku v tomto čísle. Sínus generuje pravidelné kopce a doliny. Noise generuje náhodné "pohoria".
Sínus generuje hodnoty od -1 po 1 a tie potom mapujeme na rozsah, aký potrebujeme. Noise generuje hodnoty od 0 po 1, takže mapovanie si podľa toho treba upraviť.
Tu vidíte porovnanie troch druhov generátorov. Jeden je sin()
, ako pravidelné, predvídateľné opakovania. Druhý je random()
, ako úplne nekontrolovateľné divoké hodnoty. Tretí je noise()
, ktorý akoby kombinoval tieto dva extrémy do náhodnosti, ktorá nie je ani nudne predvídateľná, ani nekontrolovateľne divoká.
Noise budeme používať, keď budeme chcieť plynulé organické zmeny.
Na šum pôsobí frekvencia takisto ako na sínus. Vyskúšajte rôzne hodnoty frekvencie f
:
Na šum pôsobí aj fázový posun takisto ako na sínus. Pridajte do sínusu aj do noisu ako fázový posun animovaný parameter, napríklad frameCount * 0.03
:
Takisto ako sme ofarbovali pixely pomocou sínusu v minulej lekcii, tak vieme ofarbovať aj pomocou šumu. Tu je základná kostra pre štvorcovú mriežku na obrazovke, do nej budeme dopisovať šum:
V tejto základnej podobe vykreslí biele štvorce:
Ale môžeme fill upraviť tak, aby sme použili noise. Ako parameter do noisu použijeme frekvenciu f
a riadku r
, v ktorom sa nachádzame:
Noise tu mapujeme na rozsah 0 až 60, čo je v HSB červená až žltá farba. Vznikne tak ohnivý vzor:
Ale pozor. Šum pomocou noise()
vie byť aj dvojrozmerný. Ak mu dáme dva parametre, tak bude operovať na mriežke a vygeneruje náhodné "oblaky", alebo škvrny:
Ako druhý parameter sme použili číslo stĺpca s
a opäť frekvenciu f
. Dostávame ohnivé oblaky:
A keď pridáme ešte animovanú fázu do oboch parametrov, vznikne pohyblivý požiar:
Skombinujeme teraz niekoľko zručností dohromady. Animovaný pohyb, vektory a šum.
Takto vyzerá program, ktorý hýbe objektom v nejakom smere:
Smer zatiaľ nijak nemeníme a objekt sa tak pohybuje stále tým istým smerom:
Ak by sme uhol smerovania generovali náhodne, bude pohyb chaotický:
My už ale vieme, že noise() je to, čo nám dáva organickú náhodnosť. Použijeme teda šum, do ktorého ako animovaný parameter dáme frameCount
vynásobený nejakou frekvenciou. Výsledok, ktorý noise()
dáva v intervale 0,1
budeme mapovať na celý rozsah možných uhlov 0, 2*PI
:
Výsledkom je pekný organický pohyb:
Namiesto jedného bodu si vytvoríme celé pole bodov na náhodných pozíciách.
Súradnicu z
každého bodu zneužijeme na to, že tam uložíme nejaké náhodné číslo.
Toto číslo potom pridáme ako fázový posun do noise()
pri generovaní uhla.
Ak namiesto krúžkov budeme vykresľovať čiary medzi dvojicami bodmi, tak vznikne cool efekt.
Vykresľovanie čiar sa riadi pravidlami:
čiara sa kreslí, iba ak je vzdialenosť medzi bodmi menej ako 100
dĺžka čiary sa mapuje na jej priesvitnosť.
f=0.1
f=0.01