A přece se točí… (díl druhý) - 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:



Go verze

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

14. 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.

V minulé části jsme se rozloučili při domnělém konci definování chování, který však skončil částečným fiaskem. Řešení tohoto problému není sice nějak těžké, ale není také na první pohled zřejmé. Problém je v tom, že když vypočítáváme vzdálenost mezi dvěmi objekty, tak je výsledná hodnota vždy kladná. Důvod je v tom, že když oba vektory v uzlu Vzdálenost od sebe odečteme, tak je výsledkem nikoliv další vektor, ale údaj o vzdálenosti. A tento údaj je logicky kladný. To je hlavní problém našeho uzlu.

Z toho důvodu potřebujeme nějak porovnat výsledné hodnoty obou vektorů a na základě tohoto porovnání znásobit vstupující hodnotu rotace do uzlu Mat:Sečíst buďto číslem 1, nebo -1 (tím se tedy hodnota úhlu odečte od úhlu předešlého). Uchopíme tedy ve Správci objektů objekt Kolo1 a přeneseme jej dvakrát do editoru. U jednoho z nových uzlů vytvoříme výstupní (modrý) port Pozice (Souřadnice > Pozice > Pozice), u druhého Předchozí pozice. Nyní hodnoty pozice, což jsou vlastně vektory, potřebujeme porovnat. Nejde nám při tom o jejich hodnoty, jen o to, zda je větší ten, či onen. Abychom mohli tyto hodnoty porovnat jako reálná čísla, musíme je nejdříve na reálná čísla převést. K tomuto převedení použijeme uzel Skalární součin. Klikneme tedy do volné plochy pravým tlačítkem myši a vybereme Nový node > XPresso > Skalární součin. V tomto uzlu můžeme spolu násobit dva vektory, přičemž výsledkem je reálné číslo.

Výstupní porty právě vytvořených uzlů Kolo1 spojíme každý s jedním uzlem Skalární součin a to pokud možno s vrchním portem. Poté si postupně vybereme každý z uzlů Skalární součin a přejdeme do Správce nastavení. Zde si můžeme všimnout, že máme možnost editovat jen port Vstup 2. Vepíšeme tedy tři hodnoty vektoru, ty budou 1; 1; 1. Idea je vlastně taková, že vynásobíme číslo jedničkou. Výsledkem bude reálné číslo, ať kladné, či záporné, teprve toto číslo následně porovnáme.

Obě hodnoty tedy porovnáme. Klikneme do plochy pravým tlačítkem myši a z kontextového menu vybereme Nový node > XPresso > Logický > Porovnání. Tento uzel má dva vstupní porty. Do prvního portu pošleme data, která začínají v uzlu Kolo1 s portem Pozice, do druhého data z řetězce, který začíná uzlem Kolo1 s portem Předchozí pozice.

Vybereme si uzel Porovnání a přejdeme do Správce nastavení. Zde ponecháme datový typ na „Reálná“ a parametr Funkce nastavíme na větší nebo rovno.

Kdybychom si vytvořili uzel Výsledek, a testovali naše chování, pak bychom zjistili, že výstupní data z uzlu Porovnání jsou 0 a 1. Tedy pravda a nepravda. Nyní tedy ona čísla 0 a 1 převedeme na čísla -1 a 1, kterými vždy vynásobíme aktuální rotaci v aktuálním snímku, díky čemuž se bude tato rotace od rotace předešlé buďto odčítat, či se s ní bude jen sčítat.

Klikneme tedy do plochy pravým tlačítkem myši a vybereme uzel Nový node > XPresso > Logický > Podmínka. Tento uzel umí zpracovávat vstupující hodnoty a na základě vstupní hodnoty vypustí jiné zadané hodnoty. Do portu Přepínač přepošleme hodnoty z uzlu Porovnání. Poté vybereme uzel Podmínka a ve Správci nastavení zadáme hodnoty Vstup [1] a Vstup [2] na -1 a 1. Díky tomuto zadání se stane to, že jakmile uzel obdrží hodnotu 0, pak odešle hodnotu -1, dostane li hodnotu 1, pak odešle hodnotu 1. Opět si můžeme toto chování zkusit pomocí uzlu Výsledek.

Jsme takřka u cíle. Poslední co potřebujeme je znásobit výstupní hodnotu uzlu Podmínka (tedy hodnoty -1 a 1) s hodnotou úhlu, kterou vysílá Překladač rozsahu. Klikneme tedy do plochy pravým tlačítkem myši a vybereme uzel Nový node > XPresso > Počítat > Mat. Přejdeme do Správce nastavení a zde zadáme funkci Násobit. Do tohoto uzlu tedy napojíme výstup z uzlu Podmínka a také výstup z uzlu Překladač rozsahu. Při tom původní vedení, které z Překladače rozsahu vedlo, zrušíme! Z uzlu Mat:Násobit přepošleme data do uzlu Mat:Sečíst. Jinak necháme vše jak je.

Můžeme si ale všimnout, že při testování kola se kolo nechová stále tak, jak bychom chtěli. Je to proto, že jsme v zcela posledním uzlu použili port Rotace.B. Pokud změníme port na Globální rotace.B, bude vše v pořádku. Nemusíme se při tom obávat toho, že by se nám kolo netočilo v případě, že bychom jej celkově natočili.

Máme před sebou poslední výzvu. Zabezpečíme natočení objektu Kolo1 tak, aby bylo závislé na objektu Kolo1_kontroler. Oba objekty tedy přetáhneme do editoru XPresso, načež u objektu Kolo1_kontroler vytvoříme výstupní (červené) porty Globální rotace.H a P (Souřadnice > Globální rotace > Globální rotace.H, P). Stejné porty, ale vstupní vytvoříme i u uzlu objektu Kolo1. Poté tyto porty propojíme. Tím jsme skutečně hotovi.

Už je to uděláno, už je to hotovo…. Nikdo netvrdí, že právě vytvořené chování je zcela dokonalé, pro většinu aplikací, tedy jakési chování angličáka, je však více jak postačující. A abychom skutečně uvěřili, tak jsem připravil malou animaci, ve které je takové imaginární autíčko, jemuž se točí kola přesně tak, jak mají.

Finální animace ke stažení

Finální soubor ke stažení

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: