[ Nothingman @ 15.04.2005. 23:59 ] @
Na web stranici:
http://freespace.virgin.net/hugo.elias/models/m_clouds.htm
sam naleteo na interesantan nachin za generisanje oblaka u realnom vremenu.
Medjutim ima jedna stvar koja me kopka i koja mi nije jasna.
Nakon sto generisemo prvu teksturu oblaka pomocu neke "fake Perlin noise" funkcije ona ne izgleda bas realno zato sto nema "praznog prostora" i vise izgleda kao neka plazma. Autor gore prilozenog teksta zbog toga koristi exponencijalnu funkciju da bi dobio realniju teksturu (da biste znali na sta mislim pogledajte slike dveju tekstura na tom sajtu).

Citat:

There is a fairly simple function you can use to transform the plasma into something that looks a lot like clouds. The exponential function is the mother of all functions. You will find uses for it everywhere.


Code:

function CloudExpCurve(v)
      c = v - CloudCover
      if c < 0 then c=0
 
      CloudDensity = 255 - ((CloudSharpness ^ c) * 255) 

      return CloudDensity
  end function

CloudCover je konstanta koju biramo u rasponu od 0-255 u zavisnosti koliko zelimo "praznog prostora".
CloudSharpness je konstanta od 0.0 do 1.0.

Ok, ovo je vrlo jednostavna funkcija i sve je to lepo, ali ono sto meni nije jasno je zbog cega kada primenimo ovu funkciju na tu plazma teksturu dobijemo "oblake"?
Znachi potpuno je jasno da ce u zavisnosti kako smo izabrali CloudCover biti vise ili manje praznog prostora ali kako je on znao da ce exponencijalnom funkcijom grupisati preostalu materiju u formu oblaka, a da necemo dobiti recimo neke nedefinisane oblike, rabacane tacke, ostre ivice, linije i slicno?

Hvala unapred!
[ yooyo @ 17.04.2005. 12:28 ] @
Ako sam te dobro razumeo, nije ti jasno zasto je primenio exponencijalnu funkciju?
Zato da bi pixele koji su prilicno tamni jos vise zatamnio, a pixele koji su svetliji jos vise osvetlio. Ovaj efekat je slican Levels-u u Photoshopu.

Code:

function CloudExpCurve(v)
      c = v - CloudCover
// ako je vrednost pixela manja od CloudCover... skroz ga zatamni. 
// ovde je mogao i da stavi return 0
      if c < 0 then c=0  

// ako se neki broj izmedju 0 i 1 stepenuje na neki veliki koeficijent on postaje jos manji,
// tako da proizvod (CloudSharpness ^ c) * 255 tezi ka 0 ako c raste. 
// 255 - broj_koji tezi_0 je prilicno beo pixel.
      CloudDensity = 255 - ((CloudSharpness ^ c) * 255) 

      return CloudDensity
  end function



yooyo
[ Nothingman @ 17.04.2005. 13:20 ] @
Nisi me shvatio, tj. mozda ja nisam bio najjasniji.
Razumeo sam ja efekat te funkcije CloudExpCurve() na pojedinacan pixel, ali ono sto me zanima je kako je on znao da ce primenom te funkcije na neku texturu (tj. svaki njen pixel) generisanu pomocu fake Perlin noise funkcije dobiti teksturu koja je pogodna za predstavljanje oblaka. Da li postoji neka caka u svemu tome ili je on prosto posmatrajuci tu Perlin noise teksturu odokativno procenio da ce primenom exp funkcije zatamniti odredjene delove teksture tako da ostane nesto slicno oblacima.
[ vlaiv @ 25.04.2005. 18:56 ] @
Jeste, Covek sedeo/gledao/video i shvatio da ako potamni gde je slabo preci ce u nema a ako pojaca tamo gde je jace preci ce u ima ....

Lupish prag za gore/dole i eto ti prilicno lepih oblaka sa procentom pokrivenosti ...