Dynamická cesta, vlastní plugin pomocí XPressa - 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

Dynamická cesta, vlastní plugin pomocí XPressa

1. února 2005, 00.00 | XPresso CINEMY 4D má mnoho silných stránek, mezi jinými například umí vyšetřit kolize objektů a paprsků, vedoucích z jednoho místa do jiného. A tyto paprsky můžeme použít pro dynamicky se chovající cestu, po které se pohybuje objekt. Například auto po mostovce smýkané bouří.

Jako malý kluk jsem viděl ve zprávách, to byly ještě v půl osmé, pak byly od 21:30 Aktuality a 24 hodin ve světě, záběr odkudsi ze Spojených států, jak se potýkali s jedním z následků své činnosti, tedy i naší, prostě s velkou bouří, která byla tak silná, že úplně rozkývala mostovku mostu a na ní jedoucí automobil. Automobilista měl dozajista plné ruce práce a také plné kalhoty. Ostatně kdo by také neměl.

Na tenhle záběr televizních kamer jsem si opět vzpomněl před několika dny, při práci na překladu manuálu na C4D R9. A to proto, že se již v subverzích R8.x objevily nové uzly editoru XPresso, které jsem podrobně prozkoumal až při práci na manuálu „devítky“. A že jde o uzly velmi zajímavé, si dokážeme na příkladu orkánem rozvlněného mostu, na kterém se po nějaké trase pohybuje chudák řidič se svým vozítkem.

Nejdříve si ale musíme specifikovat zadání. V prvé řadě budeme mít křivku pohybu vozu, která bude mít libovolný počet bodů. Tato křivka by měla být typu Akima, Kubická či B-Spline (to asi nejlépe, ale já jsem prostě na NURBSový typ křivky trochu zaměřený, co s ní pořád mám?). Dále samozřejmě budeme mít model mostovky. To bude polygonový objekt, který zcela libovolně rozanimujeme například pomocí PLA (point level animation). Naše cílové chování křivky, tedy cesty, po které se bude pohybovat objekt, vytvoříme tak, že ať se bude most svíjet sebevíc, tak křivka cesty stále bude „nalepená“ na jeho povrchu. To jsou ale kouzla. Samozřejmě že použijeme XPresso.

Abychom uvedené chování vytvořili, tak v zásadě potřebujeme mimo jednoduchých uzlů například pro definování bodu (Bod), či objektu (Objekt), také dva uzly velmi zajímavé. Prvním je uzel Kolize paprsku a druhým uzel Opakování. Kolize paprsků je uzel, bez kterého by uvedené chování šlo udělat jen stěží a uzel Opakování nám pomůže s tím, že celou křivku, tedy cestu, zpracujeme pomocí jednoho výpočtu zcela automaticky. Jedná se o to, že vypočítáme polohu všech bodů výsledné cesty pomocí jedné struktury XPresso, která bude společná všem bodům.

Kolize paprsků

Jak jsme se již zmínili, tak klíčovým uzlem pro vytvoření našeho chování, které také třeba můžeme použít pro tvorbu nafukovacího míče, který se pohupuje na hladině, je uzel Kolize paprsků. Řekneme si tedy k němu něco bližšího.

Uzel Kolize paprsku pracuje tak, že vytváří mezi dvěmi souřadnicemi virtuální úsečku, tedy paprsek a analyzuje případný průnik tohoto paprsku s předem definovaným polygonovým objektem (v tomto případě bude tento objekt „staticky“ určen, ale i to samozřejmě může být nějak dynamicky závislé). Směr paprsku je určen pořadím souřadnic. Tedy paprsek vede od první souřadnice, od místa působení do souřadnice cílové. Souřadnice samozřejmě můžeme zadat ve Správci nastavení, ale podstatně elegantnější je, pokud tyto souřadnice budeme definovat například pozicí dvou objektů a nebo, jako v tomto příkladu, dvou bodů. A to bodů křivek. Jedna pomocná křivka, půdorysná kopie cesty, po které automobil pojede, tedy bude nad mostem a druhá pod mostem. Mezi těmito pomocnými křivkami budeme vysílat síť paprsků, které budou analyzovat průnik s mostovkou. V místě průniku budou body finální cesty auta. Tuto pozici nám bude generovat přímo uzel Kolize paprsků.

Pokud si pozorně přečteme předchozí odstavec, tak musíme nabýt dojmu, že pokud budou mít všechny tři křivky (jsou to kopie, dvě křivky pomocné, jedna nad mostem, druhá pod ním a křivka finální) mít například 20 bodů, tak budeme muset vytvořit pro každý pár bodů + cílový bod vlastní strukturu paprsku a jeho vyhodnocení. Ale to by bylo trochu nešťastné, mít dvacet stejných struktur vždy pro jeden finální bod křivky, jistě pro jedno použití by to nevadilo, ale chování samozřejmě chceme použít kdykoliv a tak naším cílem je, aby jediné co budeme při dalším použití definovat, byly jména použitých křivek. Musíme tedy chování vytvořit tak, aby se všechny body analyzovaly naráz jako jeden. A s tím nám pomůže uzel Opakování.

Opakování

Uzel Opakování patří do skupiny Opakování. V této skupině jsou trochu zvláštní uzly. Vlastně nic nepočítají, jen a pouze vysílají najednou větší či menší počet dat v jednom snímku (to je důležité). Uzel Opakování například každý snímek vypouští sekvenci po sobě jdoucích čísel, která jsou dále zpracovávaná následnou strukturou samostatně jedno po druhém a to stále v jednom snímku! A co kdyby uzel Opakování vysílal počet bodů křivky. V našem případě máme tři křivky, všechny tři mají stejný počet bodů, jsou to ostatně své kopie. První dvě křivky mají polohu svých bodů danou, jsou to pomocné křivky, které používáme pro vyšetření průniku. Body třetí křivky budou v místech vyšetřených průniků. Tedy naskýtá se tu možnost, abychom sekvenci čísel, která bude generovat uzel Opakování využili pro stanovení indexu bodu. A index bodu zpracujeme v uzlu Bod, který bude generovat polohu bodu s tímto indexem (pořadím). A pozici jako takovou můžeme použít pro stanovení výpočtu Kolize paprsku. A výstupem Kolize paprsku je poloha průniku, kterou sdělíme bodu finální křivky, který má stejný!!! index, jako body dvou pomocných křivek, které jsme právě použili. Bon, mon ami! (No ano, mám rád Hercula Poirota, jmenovitě ztělesněného Davidem Suchetem, ostatně by se mi teď docela hodil…)

Ale pojďme na to. Vytvoříme si například objekt Objekty > Primitiva > Rovina, ujistíme se že je vytvořená plocha vytvořená vodorovně. Množství polygonů zadáme podle libosti, ale možná že nebude od věci ponechat segmentaci poměrně vysokou, ať je deformovaná plocha přirozená, objekt převedeme na polygony.

Vytvoříme si křivku. Nejlépe křivku, která je definovaná jen svými body a ne tečnami (tedy nikoliv Bézierovu). Pokud na vozovku budeme chtít pro vytvoření opravdu hladkého povrchu použít HyperNURBS, tak použijeme B-spline. Použijeme tedy Objekty > Vytvořit křivku > B-Spline a nakreslíme si ve vrchním pohledu velmi jednoduchý tvar křivky, tedy cesty auta, pro zadání nám stačí tak čtyři body a tvar může například připomínat sinusoidu (je to ale nepodstatné). Křivku bychom měli mít v oblasti mostovky, ale podmínkou to není.

Aby byl tvar finální křivky cesty vyšetřen co nejpřesněji, tak si křivku rozsegmentujeme. Ujistíme se tedy že nemáme vybraný žádný bod a provedeme příkaz Struktura > Upravit křivku > Zaoblit. Nastavíme počet bodů třeba na 20 a interpolaci na B-Spline. Naše křivka nyní bude mít pro vyšetření průniků dostatečný počet bodů.

Vytvořenou křivku si DVAKRÁT zkopírujeme. První křivku pojmenujeme Vrchní a posuneme ji nad objekt mostovky (tak vysoko, aby tuto křivku mostovka při vlnění neprotnula). Druhou křivku pojmenujeme Spodní a posuneme ji pod mostovku se stejnou podmínkou. Třetí křivku necháme tam kde je, ale její vertikální poloha je zcela irelevantní. Jediné co uděláme je, že ji pojmenujeme. Například Final.

Můžeme tedy začít s „programováním“ XPressa (programování je trochu silné slovo, vím). Vybereme si například křivku Vrchní a pomocí Správce objektů > Soubor > CINEMA 4D vlastnosti > XPresso jí nastavíme vlastnost chování XPresso. Otevře se nám také editor XPresso.

Zanalyzujeme si počet bodů ve křivce (ve křivkách…) Uchopíme ve Správci objektů křivku Vrchní a přeneseme ji do XPressa. Tím vytvoříme její uzel. Klikneme na její červené pole a vytvoříme výstupní (červený) port Objekt. Poté klikneme do plochy pravým tlačítkem myši a pomocí Nový uzel > XPresso > Hlavní > Bod vytvoříme uzel bod, který mimo jiné umí analyzovat počet bodů ve křivce či polygonovém objektu. Spojíme porty Objekt uzlu křivky Vrchní s uzlem Bod.

Můžeme si všimnout, že uzel Bod má také již vytvořený výstupní červený port Počet bodů. A to je co potřebujeme. Uzel Bod ví že má zpracovávat křivku Vrchní a výstupem z něj je počet bodů této křivky. Počet bodů křivky je, jak jsme si již řekli, důležitý pro výpočet opakování… Klikneme tedy pravým tlačítkem do plochy a zvolíme Nový uzel > XPresso > Opakování > Opakování (Iterace). Uzel Opakování má ve výchozím stavu dva vstupní (modré) porty. Start opakování a Konec opakování. Konec opakování, tak to bude počet bodů křivky. Ten mi známe, to je výstupní port Počet bodů uzlu Bod. Spojíme tedy porty Počet bodů uzlu Bod a port Konec opakování uzlu Opakování.

Když máme stanovaný konec opakování, tak musíme zadat i jeho začátek. Udělat to můžeme pomocí Správce nastavení, pokud si vybereme uzel Opakování, ale elegantněji to uděláme tak, že klikneme pravým tlačítkem do plochy a vytvoříme uzel > XPresso > Hlavní > Konstanta. Vybereme si tento uzel a zadáme do něj ve Správci nastavení hodnotu 0. Sice to je ve výsledku stejné, ale takhle vidíme přímo v XPresso co že nám do uzlu Opakování vstupuje. Spojíme uzel Konstanta s portem Start opakování. Díky těmto operacím bude uzel Opakování v jednom snímku postupně vypouštět indexové hodnoty všech bodů křivky jeden po druhém.

Jak si jistě pamatujeme, tak chceme vytvořit paprsky, které protnou plochu. Tyto paprsky vždy poběží od bodu 0 křivky Vrchní k bodu 0 křivky Spodní, od bodu 1 křivky Vrchní k bodu 1 křivky Spodní, od bodu 2…. To víme. Musíme tedy vytvořit uzel, který nám bude vysílat pozice bodů jednotlivé křivky. A jak jinak, než pomocí uzlu Bod. Klikneme tedy do plochy pravým tlačítkem myši a pomocí volby Nový uzel > XPresso > Hlavní > Bod vytvoříme postupně dva uzly Bod (jeden pro křivku Vrchní a jeden pro křivku Spodní). Pak uchopíme objekty křivek Spodní a Vrchní a přeneseme je do editoru XPresso. Tím se vytvoří jejich uzly. U každého z těchto uzlů vytvoříme výstupní (červený) port Objekt. Pak tyto porty spojíme vždy s jedním portem Objekt právě vytvořených uzlů Bod.

Všimněme si, že uzel Bod má také již ve svém výchozím stavu port Pozice bodu, a pozice je přesně tou informací, kterou potřebujeme pro vyslání a přijmutí kolizního paprsku. Klikneme tedy do plochy pravým tlačítkem myši a pomocí Nový uzel > XPresso > Hlavní > Kolize paprsků vytvoříme uzel Kolize paprsků. Uzel Kolize paprsků má na levé vstupní straně (modré) dva porty pro vstup pozic míst, kde paprsek začíná, respektive končí. Do Bod paprsku 1 napojíme port Pozice paprsku, který je vypočítán pro křivku Vrchní, do portu Bod paprsku 2 napojíme bod vycházející z křivky Spodní (zde tedy paprsek končí).

Uzel Kolize paprsků je žlutý. A to proto, že mu něco chybí. Primárně mu chybí informace, který objekt mají paprsky vyhledávat. Uchopíme tedy ve Správci objektů objekt Rovina a přeneseme jej do editoru XPresso. Vytvoříme mu také červený výstupní port Objekt, který spojíme se vstupním portem Objekt uzlu Kolize paprsků.

V současné době vychází z uzlu Kolize paprsků informace o kolizi paprsku vyslaného z bodu 0 křivky Vrchní do bodu 0 křivky Spodní. Ale my přeci máme uzel Opakování, který nám vysílá všechny body křivky (tedy jejich indexy) za sebou a to v jednom snímku, tedy pro celou křivku, nejen pro jeden jediný bod. Tedy napojíme výstupní port Opakování uzlu Opakování s porty Index bodu obou uzlů Bod, které vysílají své informace o pozici bodu do uzlu Kolize paprsků.

Uzel Kolize paprsků zatím obsahuje jeden jediný výstupní port, který říká jen jednu věc. Tedy zásah paprsku s objektem byl a nebo nebyl (Booleovský typ dat Pravda/Nepravda). Vysílat ale umí i informaci o poloze zásahu. Klikneme tedy na modré pole uzlu Kolize paprsků a z menu vybereme port Pozice zásahu. Pozice zásahu paprsku, který vychází z bodu 0 křivky Vrchní a směřuje do bodu 0 křivky Spodní by měla být pozice bodu 0 křivky Final. To je jasná věc! Klikneme pravým tlačítkem myši do plochy editoru a vytvoříme pomocí Nový uzel > XPresso > Hlavní > Bod nový uzel Bod. Uchopíme ve Správci objektů křivku Final a přeneseme ji do editoru XPresso. Vytvoříme u tohoto uzlu výstupní port Objekt, který propojíme s portem Objekt nově vytvořeného uzlu Bod.

Nový uzel Bod ale nemá vstupní port pro pozici bodu. Nemá, ale může mít. Klikneme tedy na levý vstupní modrý čtverec tohoto uzlu a vytvoříme port Pozice bodu. Port Pozice bodu uzlu Bod spojíme s portem Pozice zásahu uzlu Kolize paprsků. Nový uzel Bod ale ještě neví jednu věc. Jaký bod se má umístit do pozice zásahu? No přeci stejný, tedy se stejným číslem, jaký měly křivky z jejichž bodů paprsek vyšel. Tedy napojíme port Index bodu posledně vytvořeného uzlu Bod s výstupním portem Opakování uzlu Opakování. Tím jsme hotovi!

Vlastně nejsme, ještě drobnost. Musíme si vybrat uzel Kolize paprsků a ve Správci nastavení zrušit volbu Pouze test! Pak jsme skutečně hotovi. Jediné co nyní musíme je, vytvořit pomocí PLA animaci povrchu, tedy objektu Rovina. Křivka Final se na tento povrch bude zcela automaticky „lepit“.


kliknutím se obrázek maximalizuje

A ještě jedna rada, nebo spíš upozornění. Pro animaci objektu kolize nemůžeme, bohužel, použít Deformátory. A to proto, že deformátory nemění strukturu modelu, tedy exaktní tabulku s polohou bodů. Právě tato tabulka je ale pro kolizi paprsků nezbytná. Proto jsme použili PLA. A jiné použití? Například pro plážový míč pohybující se po vodní hladině.

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: