A přece se točí… (díl první) - Grafika.cz - vše o počítačové grafice

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:



VSE

A přece se točí… (díl první)

12. května 2004, 00.00 | Základním klíčem ke kvalitní animaci je dobrá synchronizace pohybů objektů ve scéně. A při tom platí, že čím méně pohybů musíme nastavit ručně, tím lépe. Ideální je, když se pohyby vytvoří samy, automaticky, při pohybu nějakého základního objektu. Vytvoříme si tedy základní chování XPresso, které bude definovat rotaci kol při pohybu automobilu.

Prubířským kamenem kvalitní animace je, pomineme li takové „drobnosti“ jako dobrý model, pěkné textury, či správně nastavené kostí, správná synchronizace jevů ve scéně. Pokud použijeme cizí slovo, tak timing, česky načasování. A když jsme již u toho, „prubířský“ evidentně pochází z němčiny, die Probe, zkouška. Vím, že se ekvivalent nachází i v angličtině, ale jak známo angličtina je vlastně jen taková pouliční směs a tak tento její výraz zřejmě pochází ze saštiny a to je opět němčina. To jsme ale nějak zabloudili do tajů lingvistiky, ve které asi nikdo z nás není zas až tak zběhlý a tak rychle zpět.

Jak jsme se zmínili, je načasování jednotlivých událostí scény velmi důležité. Mluvíme li však o načasování, pak nemáme na mysli jen prostý začátek akce a její konec vzhledem k okolním událostem, ale zejména průběh. Odpovídající průběh události ve scéně je totiž tou poslední kapkou, která často posouvá iluzi počítačového světa do reálného. Je to tedy jako se vším. Dobrý model mohou pokazit špatné textury, dobrý model a dobré textury může ubít špatné nasvícení a dobrý model, dobré textury a dobré nasvícení může znesvětit špatné nastavení animace. Při tom je zjevné, že čím méně musíme animovat, tím méně můžeme pokazit. A to není myšleno jako výsměch či urážka. Malý příklad na vysvětlenou.

Můžeme si vytvořit třeba dokonalý model vozu, který bychom chtěli zanimovat. Tedy co můžeme chtít jiného od auta, než aby jelo. A tak při jeho animaci musíme vytvořit základní stopu pohybu tohoto vozu a poté i stopy rotací kol. Při těchto rotacích však kola musí dodržet pravidlo, že se otáčí právě tak rychle, aby automobil „urazil“ tu správnou vzdálenost. Je tedy nezbytné, aby zbytečně neprokluzovala a také se naopak netočila příliš pomalu. Zároveň však musíme u těchto kol dodržet správné úhlové zrychlení. Je tedy nezbytné, aby úhlové zrychlení odpovídalo zrychlení celého vozu. Jak vidno, je toho poměrně dost, a to je jde o jednoduchý příklad. Nejlepší by tedy evidentně bylo, kdyby se celý model auta choval jako angličák. Vraťme se tedy do dětských let, chytněme si angličáka a táhněme jej po stole. Můžeme si všimnout, že úhlová rychlost rotace kol je závislá na rychlosti celého autíčka. Pro rotaci kol tedy musíme jen posouvat celé autíčko. Skvělé by tedy bylo, kdybychom tento jev přenesli i do 3D grafiky. Tedy kdybychom vytvořili pouze stopu posunu vozu, při které by se kola otáčela přesně podle pohybu vozu. Co nám při tom brání? Nic, vždyť máme XPresso!

Pomocí technologie XPresso si tedy vytvoříme právě popsané chování, kdy posunem řídícího objektu se bude objekt kola jednak posouvat, ale také adekvátně otáčet. Toto základní chování při tom není nikterak složité (tím také lze říci, že nic nebrání jeho zdokonalení :-)), ale na druhou stranu v něm přeci jen jsou jisté zádrhele.

Začneme tedy. Nejdříve si vytvoříme objekty, které pro tvorbu uvedeného chování budeme potřebovat. Nejdříve si vytvoříme válec. Ten nám bude představovat naše kolo a tak není od věci si nastavit jeho segmentaci spíše nižší. Mimo to si vytvoříme dva objekty Osy. Oba ponecháme ve středu scény, kde je mimochodem také kolo a jeden objekt Osy přejmenujeme na Kolo1 a druhá Kolo1_kontroler. Mimo to nastavíme orientaci objektu Válec na osu Z+. Objekt Válec také umístíme hierarchicky pod osy Kolo1. tím máme připravené vše, co budeme pro demonstraci chování potřebovat. Je při tom jedno, jaký budeme mít nastavený poloměr válce, protože do našeho chování zařadíme i tento faktor a tak se bude vše automaticky upravovat i na základě tohoto parametru. Abychom měli vše pěkně názorné, vytvoříme si také nový materiál, ve kterém necháme jen kanál Svítivost, ve kterém nastavíme třeba shader Šachovnice. Poté tento materiál nastavíme na Válec.

Je načase si vytvořit požadované chování. Vybereme si tedy ve Správci objektů objekt Kolo1 a pomocí menu tohoto správce Soubor > Nové chování > XPresso – chování vložíme tomuto objektu požadované chování. Alternativou je samozřejmě také možnost kliknout pravým tlačítkem myši na jméno objektu a vybrat z kontextového menu totéž.

Po aplikaci chování se otevře okno editoru. V něm vytvoříme vše, co musíme pro chování učinit. Uchopíme tedy ve Správci objektů objekt Kolo1 a přetáhneme jej do editoru XPresso. Stejně tak do editoru přetáhneme jméno objektu Kolo1_kontroler a Válec. Pro začátek tedy máme vše, co potřebujeme.

Již jsme se zmínili, a mimo jiné to také naznačuje jméno ovládacího objektu, že poloha kola bude řízena polohou řídícího objektu. Proto klikneme na pravé (červené) výstupní pole objektu Kolo1_kontroler a vybereme port Souřadnice > Globální pozice > Globální pozice. Poté klikneme na levé (modré) vstupní pole objektu Kolo1 a vybereme to samé. Poté oba porty spojíme. Tím jsme zajistili, že poloha kola bude vždy odpovídat poloze řídícího objektu.

Nyní si však musíme stanovit základní vztah, který odpovídá posunu kola, tedy jeho umístění a jakémusi „úhlovému“ posunu, přesněji řečeno úhlovému natočení. V prvé řadě musíme znát obvod. Ten stanovíme na základě vzorce Obvod=2*r*Pi. Kdy „r“ je poloměr, který nám stanoví hodnota poloměru válce (vzpomínáte?), Pi je Ludolfovo číslo, které shodou okolností využívali již Egypťané ve Staré říši, ačkoliv jej přesně nedokázali vyjádřit (obvod kruhu vzniklého rotací výšky Chufuovy pyramidy je stejný jako obvod jejího půdorysu!). To jsme ale odbočili. V editoru máme uzel objektu Válec. Klikneme tedy na výstupní pole tohoto uzlu (červené) a vybereme Vlastnosti objektu > Poloměr. Nyní máme uzel, který nám vždy odečítá ze zadání objektu poloměr (ten můžeme nadále interaktivně měnit). Klikneme do volné plochy pravým tlačítkem myši a vybereme Nový node > XPresso > Počítat > Vzorec. Vytvoříme tím nový uzel, ve kterém nastavíme konstantní hodnotu 2*Pi (mohli bychom při tom využít třeba jen uzel Konstanta, zvolený postup se však jeví elegantnější). Můžeme si všimnout, že uzel Vzorec již má výstupní port. Označíme si tedy vytvořený uzel Vzorec a přejdeme do Správce nastavení. V něm zadáme již zmíněný vzorec 2*Pi, nic víc definovat nemusíme.

Abychom celkový obvod vypočítali, musíme do editoru vložit uzel, který je takového výpočtu schopen. Klikneme tedy do volné plochy editoru myší a vybereme Nový node > XPresso > Počítat > Mat. Označíme si tento uzel a ve Správci nastavení nastavíme jeho činnost na „Násobit“. Uzel Mat má již od okamžiku svého vzniku dva vstupní porty. Do těchto portů tedy napojíme uzly Vzorec a Válec (port Poloměr). V tomto případě je pořadí irelevantní. Máme vypočítaný obvod.

Možná je nyní správný okamžik na malou úvahu. Kolo se bude otáčet tak, aby jeho rotace odpovídala posunu celého objektu. Při tom si musíme určit časovou jednotku, ke které se změna odehraje. Musíme se tedy ptát, jaká byla poloha objektu (kola) v čase T a jaká byla v čase T rotace a poté také jaká je poloha a rotace objektu v čase T+1. Z výsledných odečtených hodnot stanovíme celkový základní vzorec chování. Jelikož ale je asi problém stanovit čas T+1, tak budeme stanovovat naopak čas T-1, přičemž aktuální čas je čas současného snímku, a čas T-1 stanovíme ze vzorce aktuální snímek-1. Ale to je velmi jednoduché, protože v XPressu můžeme vytvořit port „Předchozí pozice“, který tomuto zadání přesně odpovídá. Uchopíme tedy ve Správci objektů objekt Kolo1 a přeneseme jej do editoru XPresso (opticky pod předešlý uzel stejného objektu). Klikneme myší na jeho výstupní červený port a vybereme port Předchozí pozice. Poté klineme také na červené výstupní pole předešlého uzlu Kolo1 (toho, do kterého je napojen uzel Kolo1_kontroler) a v tomto uzlu vytvoříme výstupní port Souřadnice > Pozice > Pozice.

Abychom mohli vypočítat vzdálenost mezi oběmi pozicemi, předešlé i současné, vložíme do editoru uzel Vzdálenost. Klikneme tedy do plochy pravým tlačítkem myši a vybereme Nový node > XPresso > Počítat > Vzdálenost. Tento uzel má dva vstupní porty. Do prvního napojíme hodnotu současné pozice (tedy uzlu, ve kterém je port Pozice) a do druhého hodnotu předchozí pozice (Předchozí pozice). Tento uzel nám tedy vypočítá vzdálenost, kterou objekt urazil mezi současným a předešlým snímkem. Tato vzdálenost pak musí odpovídat příslušné rotaci kola.

Za účelem splnění výše uvedené podmínky tedy musíme vypočtenou vzdálenost vydělit obvodem kola, přičemž výslednou hodnotu převedeme na podíl úhlového pootočení. Klikneme tedy do volné plochy pravým tlačítkem myši a vybereme Nový node > XPresso > Počítat > Mat. Označíme si tento uzel a ve Správci nastavení nastavíme jeho činnost na „Dělit“. I u tohoto uzlu máme dva vstupy, přičemž je jasné, že i zde již nelze přehlédnout správné pořadí vstupů. Do prvního portu tedy napojíme výstup z uzlu Vzdálenost a do spodního z uzlu Mat:Násobit. Máme tedy stanovený poměr uražené vzdálenosti vzhledem k obvodu kola. Nyní tento poměr musíme převést na úhly.

Klikneme tedy opět do volné plochy editoru pravým tlačítkem myši a vybereme Nový node > XPresso > Počítat > Překladač rozsahu. Tento uzel zpracovává nějaká data a na základě stanoveného vztahu je transformuje na jiný typ. Vstup tohoto uzlu spojíme s právě vytvořeným uzlem Mat:Dělit, který nám vypočítává poměr uražené vzdálenosti k obvodu. Označíme si uzel Překladač rozsahu a přejdeme do Správce nastavení. Vstupní rozsah ponecháme na „Uživatelsky definovaný“, ale parametr Výstupní rozsah změníme na Radiány (to je hodnota 2*Pi, a to už tu někde bylo). Nastavení vychází z úvahy, že vzdálenost, kterou kolo urazí, může být i záporná, tedy že platí vztah Pozice T < Pozice T- 1 a tak by měla být záporná i příslušná rotace. Z toho důvodu nastavíme vstupní rozsah -1,1 a výstupní na –Pi (-6.283) a +Pi (to máme již nastavené pomocí volby Radiány). Je tedy nasnadě, že spodní hodnotu jen zkopírujeme a obohatíme o znaménko „-“. A proč jsme nastavili vstupní mez na -1 a 1? To vyplývá z předpokladu, že kolo za 1 snímek neurazí vyšší vzdálenost než svůj obvod. A kdyby přece, pak bychom mohli zapnout volbu Modulo a nic by se nestalo, protože bychom na rotaci kola pak nic nepoznali (vizuálně by nebyl rozdíl mezi tím, že by se kolo otočilo o 180 stupňů, či o 360+180). Abychom se tedy vyhnuli možným problémům, pak tedy volbu Modulo skutečně můžeme zapnout.

Je jistě samozřejmé, že nyní spojíme výstup uzlu Mat:Dělit (ve kterém vypočítáváme poměr vzdálenosti k obvodu kola) se vstupem uzlu Překladač rozsahu. Máme tedy úhel, o který se kolo pootočí. Při tom však nesmíme zapomenout na to, že kolo již může být pootočeno z předchozího snímku. Je tedy nasnadě, že musíme současnou rotaci, kterou jsme si právě vypočítali, sečíst s rotací předešlou.

Abychom splnili předešlou úvahu, musíme znát předešlou rotaci. Uchopíme tedy ve Správci objektů objekt Válec a přeneseme jej do editoru. Klikneme na červený výstupní čtverec a vybereme port Předchozí rotace. Je to velmi podobné tomu, jak jsme vypočítali uraženou vzdálenost mezi předešlým a současným snímkem. Poté klikneme do plochy a vytvoříme uzel Nový node > XPresso > Počítat > Mat. Tento uzel ponecháme na volbě Sečíst. Do tohoto uzlu napojíme jak uzel Překladač rozsahu, tak uzel Válec s portem Předchozí rotace.

Nyní nám k (domnělé, jak se později ukáže) dokonalosti stačí jen výstupní hodnotu uzlu Mat:Sečíst přeposlat do rotace válce podél jeho rotační osy, v našem případě osy Z. Uchopíme tedy ve Správci objektů objekt Válec a přeneseme jej do editoru. Do tohoto nového uzlu vytvoříme vstupní (modrý) port Souřadnice > Rotace > Rotace.B. Z uzlu Mat:Sečíst tedy přepošleme hodnoty do právě vytvořeného portu Rotace.B. Pokud máme všichni stejně zadaný model, můžeme v bočním pohledu (máme viditelnou osu X) zkusit posouvat náš objekt Kolo1_kontroler. Kolo se bude při tom otáčet tak jak má, ale jen v kladné části světa. A to je problém. Co s tím? V záporné části světa rotace probíhá obráceně. Mimo to se také v jisté části zaporné osy netočí vůbec. Pro dnešek toho však již necháme a rozluštění tajenky si necháme na příště.

Tématické zařazení:

 » Rubriky  » VSE  

 » Rubriky  » 3dscena  

 » Rubriky  » 3dscena - vlastni  

 » Rubriky  » Go verze  

Diskuse k článku

 

Vložit nový příspěvek   Sbalit příspěvky

 

Zatím nebyl uložen žádný příspěvek, buďte první.

 

 

Vložit nový příspěvek

Jméno:

Pohlaví:

,

E-mail:

Předmět:

Příspěvek:

 

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

 

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

Uživatelské jméno:

Heslo: