Jak si ulehčit animace? No od čeho je tu XPresso! - 3D grafika - 3Dscena.cz: 3D grafika jako na dlani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



3D grafika

Jak si ulehčit animace? No od čeho je tu XPresso!

22. září 2003, 00.00 | Pomocí XPressa, modulu programu CINEMA 4D R8 si nastavíme chování prvků, které se budou zcela automaticky přirozeně zasouvat a vysouvat. Jako je to například u několika stupňových pístů.

Jak již jistě tušíte z hlavičky, vyrobíme si dnes chování XPresso, kterým budeme více méně automaticky ovládat celou soustavu teleskopicky se zatahujících pístů. Když jsem přemýšlel, kde všude bychom takové chování mohli uplatnit, napadla mne zvedací korba nákladního vozu, velký lis na hrdiny tuším že Hvězdných válek, lis na Rapaxe ve Wizardry 8 a nebo kancelářská židle. Mám na mysli takové ty kryty pístu, kterým se zvedá úroveň sedáku. Ono je tedy pravdou, že se tyto kryty chovají kultivovaně jen teoreticky a že většinou sedí všechny dole a ignorují výšku sedáku, ale řekněme, že by byly tyto písty poněkud poslušnější. Kromě toho bychom tak mohli snadno vyrobit teleskopický prut, nebo vytahovací dalekohled. Domnívám se, že příkladů je poměrně mnoho a tak by mohl být dnešní článek alespoň trochu účelný. Kromě toho by vás mohl také o trochu více sblížit s technologií XPresso, kterou mám za to, že většina velkým obloukem míjí, jako něco nebezpečně připomínající matematiku.


Jelikož nám půjde o vytvoření elementárního příkladu chování, tak nebudeme vytvářet celý model, ale jen jakýsi polotovar. Budou nám tedy stačit jen tři válce. První válec bude statický, bude to základní prvek pístu. Druhý válec, střední, se bude vytahovat z válce základního, přičemž do jeho maximální hodnoty vytažení se s ním bude vytahovat i válec třetí, nejužší. Nejužší válec se bude do polohy maximálního vytažení středního válce vytahovat s ním, pak se bude vytahovat sám do své maximální polohy. Obráceně to bude probíhat přesně naopak. A celý tento proces budeme řídit jediným objektem, kterým budeme určovat míru vytažení. Nebudeme tedy muset vytvářet žádné další animace, kromě animace řídícího bodu. Abychom si nadále bez problémů rozuměli, pojmenujeme si již teď jednotlivé válce. Základní válec bude válec A, střední válec bude válec B a nejužší válec bude válec C. Vytvoříme si tedy základní vzorový model.

Vytvoříme si objekt Válec "A" a ponecháme jeho poloměr na 50 a výšku na 200. Vytvoříme další válec "B" a nastavíme jeho poloměr například na 35 a výšku na 210. Válec "C" bude mít poloměr třeba 17 a výšku 220. Nic složitého že :-). Převedeme si všechny válce do polygonů a přesuneme jejich osy vždy do středu vrchního závěru. Poté umístíme čistě pro názornost válec A do polohy Y=200, válec B do Y=210 a válec C=220. To bude výsledná poloha našeho pístu. Jeho klidový stav, ze kterého se prvky budou vytahovat a do kterého se budou vracet.


Vytvoříme si ještě prázdný objekt Osy, který ihned přejmenujeme na Elevator. To bude náš řídící prvek. Prvek Elevator umístíme do pozice Y=220. Hotovo, připraveno, tak jdeme na to!!


Ve Správci objektů si označíme prvek C a klikneme pravým tlačítkem myši (Windows), či klikneme myší za stisku klávesy Command (Mac OS). Z kontextového menu, které touto operací otevřeme vybereme položku Nové chování > XPresso - chování. Tím se k našemu objektu C přiřadí ikona chování XPresso a otevře se také jeho editor.


Ve Správci objektů uchopíme objekt C a přetáhneme jej do okna editoru. Tím vytvoříme uzel tohoto objektu, kterým budeme řídit jeho výšku. Klikneme na pravý červený obdélník (výstupní strana uzlu) ve vrchním rohu vytvořeného uzlu a z otevřeného menu zvolíme parametr Pozice Y (relativní pozice, po dokončení si objekty A, B, C a Elevator seskupíme a tak se tato hodnota bude vztahovat k poloze nadřazeného objektu). Cesta tohoto parametru je Souřadnice > Pozice > Pozice.Y.


Stejným způsobem vložíme do tohoto uzlu (nod) vstupní parametr (port) taktéž pro pozici Y. Uchopíme ve Správci objektů objekt Elevator a přetáhneme jej také do okna editoru. Poté klikneme na jeho výstupní červené pole a vložíme do něj opět pozici Y. Nyní již jen stačí, abychom spojili uzly Elevator a C mezi porty Elevator Pozice.Y výstup a C Pozice.Y vstup (modrá strana). Od této chvíle je pozice ve směru osy Y objektu C řízena polohou Elevatoru.


Problém ale je, že kdybychom elevátor táhli nekonečně vzhůru, tak by jej objekt C stále následoval. Musíme tedy možnosti objektu C omezit. Musíme tedy kliknout pravým tlačítkem myši kamkoliv do okna editoru a z kontextového menu vybereme příkaz Omezení. Cesta tohoto příkazu je Nový node > XPresso > Počítat > Omezení.


Tento příkaz, nebo-li nod má tři vstupní porty na pravé, modré straně a jeden port výstupní. Vstupní porty jsou Min, Max a Hodnota. Výstupní je jen Výstup. Do portu Hodnota vstupuje upravovaný parametr, tedy v našem případě jej propojíme s výstupním portem Pozice.Y objektu C. Do hodnot Min a Max můžeme navázat jiné uzly, ale také do nich můžeme přímo zadat hodnoty. Vybereme si tedy vytvořený nod Omezení a do Správce nastavení zadáme hodnoty Min 220, to je naše startovní hodnota objektu C a Max 600, což je maximální hodnota vytažení celého teleskopického pístu. Máme tedy výsledné rozmezí hodnot, ve kterých se by se měl objekt C podél osy Y pohybovat. Jenže objekt C to ještě neví. Musíme tyto hodnoty tedy do objektu C poslat.


Uchopíme tedy ve Správci objektů objekt C a přetáhneme jej znova do okna editoru. Vytvoříme u něj na vstupní, modré straně port Pozice.Y a tento port spojíme s výstupním portem omezení. Tím předáme hodnotu omezení objektu C.


Díky předešlým operacím máme vymezený pohyb objektu C. Jak jsem ale psal v úvodu, při posunu objektu C se také pohybuje do jisté výšky objekt B, ale jen do jisté výšky. A přitom je objekt B vždy o něco níž, o 10 jednotek než objekt C. Musíme tedy do editoru přidat operaci, kterou přepošleme výšce objektu B informaci, že je vždy tento objekt o 10 jednotek níže než objekt C. Vytvoříme tedy uzel Mat a ten nastavíme ve Správci nastavení na funkci Odečíst. Uzel Mat vytvoříme tak, že klikneme do volné plochy editoru pravým tlačítkem myši a tento uzel si vybereme na cestě Nový node > XPresso > Počítat > Mat. Vybereme si vytvořený uzel a ve Správci nastavení zvolíme operaci Odečíst.



Nyní musíme vytvořit u posledního uzlu C výstupní port (uzel, do kterého vstupuje výstup z uzlu Omezení) Pozice.Y, kterým budeme vysílat hodnotu o pozici objektu C objektu B přes uzel Mat. Tento výstupní port spojíme s vrchním vstupním portem uzlu Mat a také zadáme do nastavení uzlu Mat ve Správci nastavení druhou hodnotu na 10. Díky tomu bude hodnota vystupující z uzlu Mat vždy o 10 nižší, než je hodnota vstupující.


Začíná se to rýsovat, že? Jak je asi zřejmé z předchozího odstavce, musíme nyní výslednou hodnotu uzlu Mat přeposlat objektu B, kterému tak finálně řekneme, že má být o 10 jednotek níže než objekt C. Uchopíme si tedy ve Správci objekt B a tažením jej přeneseme do editoru. Tím vytvoříme uzel tohoto objektu. Tomuto uzlu také vytvoříme vstupní a výstupní port Pozice.Y. Vstupní port Pozice.Y spojíme s výstupem uzlu Mat. Tím se budou přeposílat výsledná data do objektu B. Jenže objekt B budeme muset ještě i jinak omezit….


O objektu B také víme, že je v zasunutém stavu o 10 jednotek výše, než objekt A (základní válec). Použijeme tedy objekt A a k němu přičteme 10. A jak? Jistě, pomocí uzlu Mat. Uchopíme ve Správci objektů objekt A, přetáhneme jej do editoru a vytvoříme mu výstupní port Pozice.Y. Poté klikneme do volné plochy pravým tlačítkem myši a vytvoříme uzel Mat. Ponecháme jej na funkci Sečíst. Do jednoho vstupního portu uzlu Mat napojíme výstupní port Pozice.Y uzlu A a zbývající parametr zadáme jen pomocí hodnoty, vepíšeme tedy do Správce nastavení hodnotu 10. Vystupující hodnota tedy bude pozice v ose Y objektu A zvýšená o 10. To bude minimální hodnota objektu B.


Známe minimální hodnotu polohy objektu B ve směru osy Y. Maximální hodnotu bychom si také mohli určit pomocí objektů, ale pro zjednodušení (jde o pochopení principu) jí jen zadáme. Vytvoříme si tedy uzel Omezení (Nový node > XPresso > Počítat > Omezení). Minimální hodnota tohoto uzlu bude hodnota pozice objektu A zvýšená o 10, maximální hodnota bude zadána numericky například na 400. Do parametru Hodnota bude vstupovat upravovaná hodnota, tedy výšková poloha objektu B. Tu jsme si ale již určili, že musí být vždy alespoň o 10 méně než je poloha objektu C (pamatujete? Vím, je to zmatek, ale zkuste to vydržet:-)). Do portu hodnota bude vstupovat výstupní port uzlu objektu B, který jsme vypočítali z uzlu Mat, odečíst.


Tato část je již skoro hotová, už to bude, už to bude….

Výstup z uzlu Omezení musíme přeci dát objektu B. Uchopíme tedy ve Správci objektů objekt B a přetáhneme jej do editoru. Tím vytvoříme nový uzel tohoto objektu. A vytvoříme vstupní port Pozice.Y. Tento vstupní port spojíme s portem Výstup posledně vytvořeného Omezení. A mělo by to fungovat!!


Zbývají nám již jen drobnosti. Musíme zajistit, že bude vždy poloha v ose X a Z pro objekty A, B, C a Elevatoru stejná. To aby se nám náhodou objekty omylem neposunuly. Zajištění tohoto stavu však bude velmi snadné a již ho asi sami tušíte. Přetáhneme do editoru objekty A, B, C a Elevator, každému z těchto objektů vytvoříme výstupní a vstupní porty Pozice.X a Pozice.Z (tedy u prvního objektu A vytvoříme jen výstup a u Elevatoru jen vstup). Vytvořené porty spojíme.


Seskupíme si všechny objekty ve Správci souborů. Neuděláme to ale pomocí příkazu pro seskupení, protože pak by se nám nekorektně umístil vytvořený objekt Osy, pod kterým by byly všechny objekty a museli bychom jeho souřadnice upravit, ale uděláme to tak, že vložíme do scény prázdný objekt Osy z menu Objekty, který bude mít souřadnice X=0, Y=0, Z=0 a pod něj můžeme seskládat všechny naše součásti pístu. Nyní můžeme Osy přejmenovat třeba na Natočení&Pozice. Budeme-li potřebovat natočit či přemístit píst, tak stačí pohybovat pouze tímto objektem, píst bude i nadále pracovat korektně. Samozřejmě je to kvůli tomu, že jsme všechny operace zadávali relativně, tedy vzhledem k nadřazenému objektu. Ještě bychom mohli omezit objekt Elevator podél osy Y, ale to již případně budete umět sami :-).



Závěrem bych chtěl poznamenat několik drobností. V několika uzlech jsme použili, jak jistě víte, numerických hodnot, které bychom museli při změně velikosti celé sestavy změnit. Vím, že to nebylo moc korektní, ale chtěl jsem, aby byl příklad názorný a přehledný. Kdybychom chtěli vše definovat závislostmi mezi velikostí jednotlivých objektů, a tak by to bylo rozhodně nejlepší, museli bychom vždy pro každý objekt pístu vytvořit uzel, který by nás informoval o velikosti daného prvku. Ten bychom vytvořili pomocí dvou uzlů parametru Bod (bod ve středu spodní a vrchní podstavy) a uzlu pro výpočet vzdálenosti. Tak bychom definovali u každého objektu jeho velikost a pak bychom vypočítávali všechny vazby na základě definovaných poměrů velikostí. Je to myslím poměrně snadná úvaha, jen by to bylo podstatně pracnější. Faktem ale je, že takový příklad by se nadefinoval jen jednou a pak by se jen mohl kdykoliv upravit.

Doufám, že se vám dnešní odskok do matematických slovních úloh líbil, alespoň jsme se tak mohli cítit o trochu mladší :-).

Finální soubor ke stažení

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » 3D grafika  

 

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: