|
Tento článek nastiňuje jednu z metod, jak realizovat jednoduchou animaci částí jednotlivých 3d předmětů.
Tuto metodu jsem použil v intru PASTFINDER (z roku 2003), abych v něm rozhýbal všechny ty modýlky robůtků v něm. Animování bylo tomto případě jednoduché a řekněme základní - vystačil jsem si s translací a rotací bodů - žádné splines, žádný keyframing - pokud byste tyto potřebovali, přestaňte číst dále a realizujte Vaše animování některou z konformnějších metod.
Modýlky jsem si vytvořil v editoru své výroby, což není ani tak důležité jako to, že jsem si strukturu každého vertexu rozšířil o jeden parametr - atribut vertexu (jakožto celé číslo, tehdy mě stačilo 8-bitů, tedy bajt).
Toto je docela zásadní předpoklad, bez kterého nemůžeme pokračovat - je dost dobře možné, že používáte knihovny, (které si nemůžete snadno nebo vůbec upravit) kde máte vertex definován jen jako x,y,z trojrozměrného prostoru. Ale přesto, s velkou pravděpodobností, máte v definici každého 3d předmětu pole vertexů, ze kterých se skládá. Možná ne ideální ale přesto řešení je definovat si stejně velké pole atributů vertexů, které s polem vertexů koresponduje. Každopádně bychom po této iteraci měli mít přístup k atributu vertexu každého našeho jednotlivého 3d předmětu.
Co tedy bude atribut vertexu obsahovat? V mém intru byla jeho struktura následující:
| bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| význam | zapnuto/vypnuto | viditelný | zvýrazněný | pivot | skupina |
kde:
- zapnuto/vypnuto indikuje, zda-li se jedná o platný vertex (pokud za chodu nějak neměníte počet vertexů jakéhokoliv 3d předmětu, můžete vynechat)
- viditelný indikuje, zda-li mám při vykreslování na pozici vertexu explicitně nakreslit tečku (zbytečné, pokud z něj nebo do něj vede hrana)
- zvýrazněný indikuje, že jde o extra vertex, na jehož místě mám (podle kontextu) nakreslit větší puntík nebo tam prdnout bitmapku hvězdičky nebo tak něco
- pivot indikuje, zda-li je vertex pivot neboli střed rotace pro operaci rotace vertexů (viz dále)
- skupina pak tvoří čtyřbitové číslo skupiny, do které se vertexy řadí (viz dále)
V tomto případě skupina může nabývat pouze jedné z 16 hodnot. Zdá-li se Vám to málo, klidně si typ atributu rozšiřte na 16bitové nebo 32bitové slovo a spolu s tím i šířku skupiny.
Když už jsme přidali atribut každému vertexu, přidáme atribut i každému 3d předmětu: asi sice jeho animační fázi, nazveme jej tedy phase (typu celé číslo). Toto číslo budeme zvětšovat pokaždé, kdy na 3d předmětu provedeme další fázi jeho animace, a/nebo - pokud je animace periodická (jakože u většiny 3d předmětů v mém intru byla) - po každém cyklu můžeme hodnotu fáze resetovat. A každému 3d předmětu později přidáme i způsob, jakým bude animován (tedy asi v podobě nějaké "Late-Binding" procedury, která bude tak či onak zacházet s jeho vertexy).
A teď konečně samotný princip: představte si, že budeme mít následující (a to dosti primitivní) model:
4 vertexes
vertex[3]: xyz=[0,0,3] attribute=0x02
vertex[2]: xyz=[0,0,2] attribute=0x12
vertex[1]: xyz=[0,0,1] attribute=0x11
vertex[0]: xyz=[0,0,0] attribute=0x00
3 edges
edge[0]=vertex[0] <--> vertex[1]
edge[1]=vertex[1] <--> vertex[2]
edge[2]=vertex[2] <--> vertex[3]
Snad je tento popis pro Vás srozumitelný - můžete si ho představit jako prst se třema kloubama (například ukazováček), trčící z počátku souřadného systému, reprezentovaný třemi spoji mezi čtyřmi nad sebou stojícími body. Atributy vertexů uvádím hexadecimálně. První číslice je jednička v případě, že vertex je pivot, v opačném případě nula. Druhá číslice je číslo skupiny.
Teď budeme chtít náš "ukazováček" ohnout (např. ve směru osy Y) v místě druhého kloubu a navíc samotnou špičku tohoto prstu (obsahující pomyslný nehet) ohnout ještě víc vůči již takto ohýbané části prstu. Jak na to? Využijeme atributy vertexů.
Ještě jednou se na ně podívejte. Označení skupin jsem nezvolil náhodné - všimněte si, že jednak místa ohybu ("klouby" našeho prstu, v nichž rotaci provádíme) jsou označeny bitem pivot, ale hlavně: každé části tohoto 3d předmětu (ta, která zůstala nezrotovaná; jednou zrotovaná; dvakrát zrotovaná) odpovídají vertexy s určitým číslem skupiny. Jinými slovy: podle toho, jak s 3d předmětem zamýšlíme animovat, si definujeme atributy jeho vertexů. A to pokud možno tak, aby se nám s ním co nejpohodlněji zacházelo.
Řečeno ještě jinak, asi těžko bychom počítači vysvětlovali, aby otočil dvěma klouby prstu, který představuje náš model. Ale to, čemu by už rozumět mohl, je, aby provedl rotaci o tolik a tolik stupňů podle osy Y se středem v bodě vertex[2] se všemi vertexy, jejichž číslo skupiny je větší nebo rovno jedné a menší nebo rovno dvěma.
Rotace (a translace) můžeme tedy provádět nejen s vertexy, jejichž číslo skupiny se přesně rovná zadanému parametru, ale - pokud si to tak implementujeme - tuto operaci můžeme rozšířit i pro interval nebo množinu skupin (v mém případě mi pro 16 možných skupin stačí 16bitové číslo, kde jednička na každé pozici znamená, že tato skupina do této operace spadá). A můžeme jít ještě dál - vzpomínám si, že jsem v původním intru vytvořil dva typy robůtků, co chodily jako lidé v tom smyslu, že střídaly levou a pravou nohu. Proceduru, která animovala jejich pohyb (a tedy i vybírala, s kterými vertexy provede jakou operaci) jsem rozšířil o parametr, který říkal, pro kterou polovinu (pravou nebo levou, nebo přesněji X+ nebo X-) daná operace platí (nebo jestli platí pro obě dvě). V tom případě nebylo nutno dále rozlišovat čísla skupin a na celého robůtka jich postačilo asi jen šest (s tím, že při běhu pohyboval stehenní i lýtkovou částí nohy, jeho chodidla kopírovala povrch země, od níž se samotný robůtek každým skokem odpoutával a zase dopadal a ještě se při tom nepatrně nakláněl ze strany na stranu - to všechno bez KeyFramingu a nestoudně jednoduše).
Tímto článkem si tady nechci dělat patent na tuhle oblast 3d grafiky, ani mastit ego mým zmiňovaným intrem (které stejně skončilo poslední) - chtěl jsem říct, že k trojrozměrné animaci nemusí být zas tak daleko, že to rozhodně není věc pouze do velkého dema (i když ani tam se s vždycky nemusíme setkat), a že mě osobně mnohem víc zahřeje na srdci tancující paňáček ve Stixman's world než 15 minut průletů studenými, nehybnými, dokonalými scénami Das produktu. Vždyť samotné slovo 'animace' znamená oživení a vždycky kus života a kus práce od svého autora vyžaduje. Přemýšlejte, prosím, nad tím, než nakódujete svůj v pořadí 158. torus.
|