Ebben a bejegyzésben mutatok egy módszert camera shake effekt készítésére. Megismerheted a maya Expression Editorát. Hogyan hozz létre új channeleket és még pár apróságot :)

 Az első lépés természetesen az hogy készítesz egy kamrát. A rendering Shelf-en találsz is egyet. Hagyd ott az origóban, egyenlőre ne mozgasd sehova. Mivel a kamerának bizonyos értékeit vezérelni fogjuk (főleg rotate) így biztosak lehetünk abban hogy készíteni kell egy controllert amit megfoghatunk és általa szabadon mozgathatjuk a kamerát. A controller objectek nálam mindig görbék. Könnyen formálhatók és nem renderelhetők így kivállóan alkalmasak ilyen feladatokhoz.

Készíts egy kört is a Create>Nurbs primitives>Circle segítségével.  Majd méretezd és forgasd úgy hogy jól látható és kijelölhető legyen. Ha készen van töröld le a history-t (ALT+SHIFT+D) és freezeld le a transform értékeit Modify>Freeze Transformation. Ezt követően a kamerát bedobhatod a görbe alá. Használd az Outlinert és középső egérgombbal simán húzd rá a kamerát a görbére. A görbe neve legyen camCTRL. Ha minden jól csináltál kb így kell kinéznie a jelenetednek:
Mostantól ez a kör szolgál arra hogy mozgasd a kamerádat. Hogy meggátold a kamera kijelölését állítsd be hogy template módban legyen. Jelöld ki majd CTRL+A és a legelső fülön (camera1) nyisd le a Display>Drawing Overrides részt. A Display type legyen Template.

Mostantól csak az Outlinerben tudod a kamerát kijelölni. A következő lépés az hogy két új channel kell a kamera shake effekt működtetéséhez. Jelöld ki a kört (camCTRL) és a channel box-on az Edit> Add Attribute segítségével hozz létre két új channelt. Frequency és Amplitude néven. Mindkét Channel minimuma legyen 0 maximuma pedig 10.
Ahogy a nevük is utal rá a jó kamera shake-nek van frekvenciája, tehát a rezgések száma egy időegység alatt, és amplitudója, azaz a rezgés mértékének nagysága. Ha ez a két érték megvan elég sokféle szituációban tudod majd hasznát venni a rignek. A sima kézi kamerás mozgástól, amely lassabb és főként nagy kilengésekből áll, a robbanás vagy földrengés jelenetekhez használt nagy frekvenciájú mozgásokig, mely főleg gyors és kis kilengésekből áll. 

Minden elő van készítve jöhet az egész motorja az Expression Editor. Nyisd meg a Window>Animation Editors>Expression Editor menüponttal. Az editornak is van felül egy menüsora. Kattints a Select Filter>By Expression Name menüpontra.
Ezzel a lehetőséggel láthatod hogy a jelenetedben milyen már meglévő scriptek futnak. Persze esetünkben a lista üres lesz :) Kezdjük azzal hogy elnevezzük a scriptet camShaker-nek. Ezt az Expression Name mezőben teheted meg. A script mindaddig nem hozható létre amíg nincs beleírva valami. Én azt szoktam csinálni hogy egy sima ún. commentel kezdem a sort hogy létrehozhassam az üres scriptet. Pl úgy ahogy a képen látod:

Elsőnek kell egy változó az Amplitude értéknek. Ezt fogjuk tekergetni hogy a kamera kilengései nagyobbak legyenek. Egy korábbi bejegyzésben már beszéltem a változókról erre most itt nem térek ki külön. Ez a következőképp fog kinézni:

$amplitude = camCTRL.Amplitude;

Ez a változó mostantól folyamatosan figyeli majd milyen értéken áll az Amplitude channel és felhasználhatjuk a későbbiekben. Mivel van egy másik channelünk is hozzá is kell egy változót írni.

$frequency = camCTRL.Frequency;

A camera shake effekt túlnyomórészt a rotációs értékek véletlenszerű változásaiból áll. Láttam már olyat is ahol a kamerát valósággal dobálták (translate shake) de hogy őszinte legyek nekem nem volt szimpatikus a végeredmény így én csak a rotációs értékeket szoktam megbabrálni. A véletlenszerűséget természetesen nem mi fogjuk kézzel belekulcsolgatni a jelenetbe hanem van egy kifejezetten erre a célra legyártott funkció, a neve noise. Általában kétféleképpen lehet felírni ezt a funkciót


noise(time);          A time az 25 frame-enként egy másodperc (beállítástól függ)
noise(frame);       A frame az mindig annyi amennyi a timeline-on leolvasható.


Én a time vezérlést használom leggyakrabban mert az mindig állandó. Míg a frame az lehet gyorsabb (30 fps) és lassabb is (24 fps). Ha pl. ki akarod próbálni mit csinál a noise írd be ezt az három sort:


camera1.rotateX = noise(time);
camera1.rotateY = noise(time);
camera1.rotateZ = noise(time);

Ha a nézetablakodat átváltod a camera1-re akkor láthatod, hogy lassan mozogni fog a kamera lejátszás közben.  Ez a mozgás még elég lassú, mert a time ilyen lassan, másodpercenként változik a jelenetben. Észreveheted azt is, hogy mintha mindig ugyan abban az irányban mozogna a kamera. Ez utóbbi azért van, mert a noise mind a három rotáció értékre ugyan azt a számot dobja ki:

Hogy miért? A noise dob egy véletlenszerű számot -1 és 1 között. Ehhez az értékhez hozzáadja az időt ami mind a három esetben ugyan az. Tehát a végeredmény is ugyan az lesz. Ezzel később kezdünk majd valamit. Most használjuk fel a korábban létrehozott változóinkat hogy gyorsítani tudjuk a kameramozgást.
A nagyon egyszerű elmélet a következő:

Kamera.forgástengely= noise(idő * frequency) * amplitude

A noise-t az idő vezérli. Ha az időt megszorozzuk valamilyen számmal akkor gyorsabban fog telni, tehát a noise is gyorsabban dobálja az értékeit -1 és 1 között. Ezzel elintéztük a rezgés sebességét tehát a frequency-t. Mivel itt még mindig csak -1 és 1 között kapunk értékeket, az egészet szorozzuk meg egy számmal és nagyobb végeredményt kapunk. Tehát az elfordulás az egyes tengelyeken nagyobb lesz és megvan az amplitude is. Valahogy így:

camera1.rotateX = noise(time *$frequency) * $amplitude;
camera1.rotateY = noise(time *$frequency) * $amplitude;
camera1.rotateZ = noise(time *$frequency) * $amplitude;

Ha most nézed meg a kamerát akkor már használnod kell a frequency és amplitude channeleket a controlleren. Figyeld meg hogy változik a mozgás ha csak a frequency-t illetve csak az amplitude értéket tologatod.  

Mostmár majdnem működik a rig. A gond az hogy még mindig ugyan azt a számot dobja ki mindhárom channel-re ezért a kamera nagyon egyoldalúan mozog. Ha tovább gondolod a megoldás az lenne ha a time mindig egy kicsit más számot dobna mind a három értéken. Egy kis tulzással írhatnám azt is, hogy minden rotációs channelen kicsit más időben zajlanának az események :) Ha megnézed a fenti három sort a time-t megszorozzuk a frequency értékével. Ami mind a három esetben ugyan az. Én azt találtam ki hogy legyen egy frequencyX az X tengelynek, egy frequencyY az Y-nak és így tovább. Akkor lehetőségem lenne kicsit változtatni mindegyiken hogy más legyen a végeredmény. Készíts el három darab változót mind a három rotációs csatornának.

$frequencyX = CamCTRL.Frequency *1;
$frequencyY = CamCTRL.Frequency *2;
$frequencyZ = CamCTRL.Frequency *3;

Ahogy láthatod mind a három változó kapott a végére egy egyedi szorzást. Tehát a kidobott szám nem lesz ugyan az. Most már csak be kell írni a megfelelő változót a megfelelő helyre hogy működjön a dolog. 

camera1.rotateX = noise(time * $frequencyX) * $amplitude;
camera1.rotateY = noise(time * $frequencyY) * $amplitude;
camera1.rotateZ = noise(time * $frequencyZ) * $amplitude;

Ha mindent jól csináltál a végsó script így fog festeni:

$amplitude = CamCTRL.Amplitude; 

$frequencyX = CamCTRL.Frequency *1;
$frequencyY = CamCTRL.Frequency *2;
$frequencyZ = CamCTRL.Frequency *3;

camera1.rotateX = noise(time * $frequencyX) * $amplitude;
camera1.rotateY = noise(time * $frequencyY) * $amplitude;
camera1.rotateZ = noise(time * $frequencyZ) * $amplitude;

Ez itt pedig működés közben:


Nincsenek megjegyzések:

Megjegyzés küldése