Je libo řetěz? Či alespoň řetízek? Část druhá - 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

Je libo řetěz? Či alespoň řetízek? Část druhá

6. listopadu 2007, 00.00 | Není již pro nás problém vytvořit dostatečně přesně zavěšenou křivku pomocí modulu MOCCA a jeho systému Clothilde, ale stále se jedná jen o křivku „statickou“, kterou bychom poměrně složitě animovali. Ideální by bylo připravit si automatický systém, který by všechny kolizní události křivky řešil automaticky. Úkol pro dnešní část.

Začněme ale drobným odskočením k sadě MoXPig, kterou jsem připravil před časem. Tuto sadu bych nedokázal vytvořit tak komplexní, jak je, bez Jiřího Doseděla a jeho příspěvku v podobě dvou drobných uzlů XPresso, které mi pomohly vyřešit práci se zachovanými výběry základního objektu pro rozmístění instancí. Oba tyto uzly jsou skutečně výtečné a jeden z nich je také zapotřebí v případě tohoto příkladu.

Tedy je zde jednoduchá úvaha. Co potřebujeme? Musíme vytvořit vazbu, ve které propojíme aktuální polohu dynamického „látkového“ objektu s polohou bodů křivky, kdy body křivky logicky musí odpovídat bodům onoho látkového objektu. Musíme tedy zajistit vazbu, kdy napojíme body křivky na vybrané (a uložené) body látkového objektu. A to nelze jinak než pomocí onoho speciálního uzlu, který jsem zmiňoval. Ten si později buďto můžeme vypreparovat z MoXPigu, nebo jej uvedu v plném znění (ale upřímně, nejsem programátor, tedy budu vám dlužen jeho přesné vysvětlení…)

Konstrukce objektu

Vše si připravíme jako obvykle, tedy tak, abychom měli do příště vlastně objekt „pluginu“, který budeme mít vždy po ruce ve formě knihovny. Začneme tedy standardně tím, že si pomocí Objekty > Osy připravíme nový objekt osy, jenž můžeme ihned pojmenovat např. na Dynamic spline.

Jelikož jsem uvedený objekt poskytl i zahraničním uživatelům, používal jsem anglické názvy položek, ale to samozřejmě není podstatné. Vybereme si vytvořený objekt a ve Správci objektů zvolíme Uživatelská data > Přidat uživatelská data. Pomocí příkazu Přidat si v právě otevřeném okně vytvoříme následující položky s těmito jmény a typy dat: Polygon object > Odkaz, Points selection >Odkaz, Spline > Odkaz, Analyse > Oddělovač a nakonec Points an. > s dvěmi hodnotami (celých čísel) oddělenými enterem 0;FALSE! a 1;TRUE!.

20

Co jsme si právě připravili za data? V položce Polygon object budeme definovat objekt látky, který používáme pro analýzu kolize. Do položky Points selection načteme výběr bodů výše nalinkovaného polygonového objektu. Tento výběr bodů je stejný (a má shodný počet a polohu) s body vytvořené křivky Spline, jejíž jméno přeneseme do dalšího pole. Poslední hodnota FALSE!/TRUE! nám analyzuje množství bodů ve výběru u polygonového objektu látky a u křivky. Množství těchto bodů by se mělo shodovat už proto, že křivka pochází z onoho polygonového objektu, ale abychom měli jistotu, máme zde analýzu obou hodnot.

U objektu Dynimac spline si pomocí Správce objektů > Vlastnosti > CINEMA 4D vlastnosti > XPresso vytvoříme vlastnost Xpresso, kterou se nám otevře i editor XPresso, a můžeme se do toho pustit.

Prostým přenesením „Drag-and-Drop“ přetáhneme do XPressa objekt Dynamic spline a tomuto objektu vytvoříme na pravé straně výstupní porty Uživatelská data > Polygon object, Points selection a nakonec Spline.

21

Klikneme pravým tlačítkem do plochy a vytvoříme dva uzly, uzel Nový uzel > Xpresso > Hlavní > Bod a Nový uzel > Xpresso > Opakování >Vlastnost. Tyto dva uzly jsou nezbytné pro analýzu obou objektů (jak jsme si ji popsali dříve), a jelikož to je velmi jednoduché, uděláme to jako první.

Nyní spojíme uzel Vlastnost s výstupním portem (uživatelskými daty) Points selection – tím napojíme výběr bodů do tohoto uzlu, který má i jeden další výstupní port. Klikneme tedy na výstupní pole uzlu Vlastnost a vytvoříme port Počet (počet bodů).

Spojíme také uzel Bod, port Objekt s portem Spline (uživatelskými daty). I uzel Bod má port pro výstup množství bodů.

22

Abychom si vše mohli otestovat, je dobré si stejným způsobem, jako jsme postupovali minule, vytvořit polygonový objekt – oděv, který by měl kolidovat, a hraniční křivku vzniknuvší ze smyčky hran. Jak si vytvoříme původní polygonový objekt, víme z minula. Nebudeme jej nechávat zatím kolidovat, to není potřeba. Naopak. Vybereme smyčku hran, které chceme převézt na křivku, a tuto křivku vytvoříme pomocí Struktura > Upravit křivku > Hrana na křivku. Máme stále aktivní výběr hran na polygonovém objektu, stiskneme klávesu Ctrl a přepneme se do bodů. Tím se výběr hran převede na body. Výběr bodů si uložíme pomocí Výběr > Zachovat výběr. Všechny vytvořené objekty si můžeme podle potřeby pojmenovat.

Vybereme si objekt Dynamic spline a do příslušných polí přeneseme jména objektů a vlastností, které jsme si připravili. Tedy do položky Polygon object přeneseme jméno vytvořeného objektu budoucí látky, do Points selection jméno zachovaného výběru a do položky Spline nově vytvořenou křivku.

23

V této chvíli nám uzly Bod a Vlastnost vysílají informace o množství bodů v obou objektech, respektive ve křivce a ve vlastnosti zachovaného výběru. Stačí už jen tyto hodnoty porovnat. K tomuto porovnání samozřejmě máme speciální uzel, takže to je velmi jednoduché. Klikneme pravým tlačítkem myši do plochy a vytvoříme uzel Nový uzel > Xpresso > Logický > Porovnání, do kterého napojíme výstupní porty Počet a Počet bodů. Ve Správci nastavení si zadáme podmínku tohoto porovnání, pro nás je podstatné, aby se obě hodnoty rovnaly. Datový typ ponecháme na reálná (sice zde budou jen celá čísla, ale i ta jsou reálná) a Funkci nastavíme na „= =“.

Uzel Porovnání je velmi jednoduchý – porovnává dvě hodnoty a je-li, či není-li splněna podmínka funkce zadané v tomto uzlu, vysílá bool hodnoty 1/0. Tedy Ano a Ne.

Pamatujete na naše uživatelská data s hodnotami 0;FALSE! a 1;TRUE!? Toto zadání, které jsme kdysi zadali je speciální. Umožňuje nám totiž přiřazovat „stavům“ položky rozbalovacího menu. Hodnota před středníkem je hodnota, se kterou uzel pracuje. Hodnota za středníkem je hodnota, která se zobrazí. Velmi efektivní systém.

A my tento systém využijeme. Přeneseme si do okna XPressa opět objekt Dynamic spline a vytvoříme si tentokráte vstupní (červený) port uživatelských dat Points an.. Tento port napojíme na uzel Porovnání, který nám vysílá hodnoty 0 a 1, které přebírá právě vytvořený uzel. A výsledek? Výsledná hodnota 0 a 1 je transformována do výpisu hodnoty FALSE! a TRUE! V našem objektu Dynamic spline, a my tak vždy víme, zda jsme naše objekty připravili v tomto směru správně.

24

Než budeme programovat (či spíše opisovat to, co nám připravil Jiří Doseděl alias Sandeagle), musíme si uvědomit, jak fungují uzly XPressa ze skupiny Opakování. Tyto uzly vždy pracují tak, že postupně v rámci jednoho snímku (obecně okamžiku) vysílají hodnoty všech objektů/elementů, které mají zpracovávat. Jsme tak s to dávkově zpracovat informace o všech bodech křivky apod. A to přesně potřebujeme. Než ale začneme, musíme vytvořit informaci o tom, které body (tedy indexy bod, počínaje hodnotou „0“) chceme zpracovávat.

Předpokládejme, že máme ke zpracování zachovaný výběr bodů či křivku, která má celkem 40 bodů. A tyto body chceme nějak zpracovávat a v tomto případě chceme výběr bodů přenést do bodů křivky. Co to znamená? Znamená to, že ve výběru bodů jsou body s různými indexy, my potřebujeme získat informace a polohách těchto bodů, ale jejich indexy nás nezajímají. Jen potřebujeme předat souřadnice bodů bodům křivky, které mají indexy od 0 do 39. Postupovat tedy musíme tak, že nejdříve si vytvoříme sekvenci opakování čísel – indexů, oněch 40 bodů. A pro tyto body to znamená řadu od 0 (indexy začínají hodnotou 0) až do 40-1. A to přesně připravíme.

Vytvoříme si dva nové uzly. Klikneme tedy pravým tlačítkem do pole XPressa a vytvoříme Nový uzel > Xpresso > Opakování > Opakování a také Nový uzel > Xpresso > Počítat > Mat.

Uzel Mat napojíme jedním jeho vstupním portem s portem Počet uzlu Vlastnost (což je vlastně výběr bodů u našeho objektu látky). V druhém portu uzlu Mat nastavíme hodnotu na -1 a ponecháme vše na operaci Sečíst. Tím dosáhneme toho, že množství bodů – 1 dává hodnotu maximálního indexu v řadě bodů, se kterou budeme pracovat.

Uzel Mat napojíme (výstup) s hodnotou Konec opakování uzlu Opakování. Vybereme si uzel Opakování a v něm nastavíme Start opakování ve Správci nastavení na 0. Tím z tohoto uzlu vysíláme korektní indexy bodů v řadě, tak jak potřebujeme u výsledné křivky.

25

No jo, ale co dále. Není zbytí, musíme využít C.O.F.F.E.E. Žádný uzel totiž nedokáže korektně převzít body s různými indexy a ty přepískat do bodů s postupnými indexy. A to je problém. My jsme si právě vyrobili sekvenci indexů, která je shodná s indexy křivky, jen to propojit dohromady. Vytvoříme si tedy uzel Nový uzel > Xpresso > Počítat > C.O.F.F.E.E.. Tento uzel si vybereme a vytvoříme mu následující vstupní (levé, modré) porty Odkaz (jméno Object), Odkaz (Selection – výběr) a Reálná (jméno Pseudoindex). Na výstupní pravé straně vytvoříme port Reálná (index).

26

Vybereme si uzel C.O.F.F.E.E. a vložíme do něj následující skript, jehož autorem je pávě Jiří Doseděl. Můžeme také zkopírovat tento uzel z objektu MoXPig knihovny MoXPig.

GeIndex(body,obj,base){

var select = obj->GetPointSelection();

var b = body->GetSelection();

var i = 0;

var count = 0;

while(i<=obj->GetPointCount()){

if(b->IsSelected(i)){

if(count == base) return i;

count++;

}

i++;

}

return NULL;

}

main()

{

Index=GeIndex(Selection,Object,Pseudoindex);

}

Co dále? Propojíme port Object nově vytvořeného C.O.F.F.E.E. uzlu s portem Polygon object našeho uzlu Dynamic spline a Selection s portem Points selection. Tedy námi vytvořený uzel bude zpracovávat body objektu zadaném v našem objektu Dynamic spline a to přesně ty body, které jsou uložené v zachovaném výběru. Těmto bodům „nahradí“ jejich indexy, protože ty nejsou krok po kroku od 0 a nahradí je sekvencí 0 až počet bodů ve výběru -1. Aby se tak stalo, musíme propojit uzel Opakování s portem Pseudoindex.

Výstupem právě vytvořeného uzlu je co? Je to korektní informace, díky které můžeme křivku propojit s naším objektem látky. Mohlo by se zdát, že bychom uzel C.O.F.F.E.E. ani nemuseli potřebovat a mohli bychom napojit uzel Opakování přímo na body křivky, ale ukážeme si později, že je nezbytný.

Vytvoříme si tedy další uzel pravé tlačítko myši > Nový uzel > Xpresso > Hlavní > Bod a tento uzel si můžeme rovnou zkopírovat. Kopii si umístíme někam doprava vedle sebe. Poté náš první uzel Bod napojíme portem Index bodu na Index uzlu C.O.F.F.E.E.. Tento uzel tak bude přebírat právě upravenou sekvenci. A bude zpracovávat polygonový objekt látky, takže položku Objekt propojíme s portem Polygon object uzlu Dynamic spline. U tohoto uzlu Bod ve Správci nastavení zadáme „Použít deformované body“, kdybychom mimo Klotildy třebas chtěli objekt ovlivnit i deformátory.

27

U druhého uzlu Bod vytvoříme nový vstupní port Pozice bodu. Tento vstupní port propojíme s výstupním portem předešlého uzlu Bod. Druhý uzel Bod projíme jeho portem Spline uzlu Dynamic spline a Index bodu můžeme rovno napojit na výstup uzlu Opakování.

28

Hotovo. Máme vytvořený objekt, který můžeme použít v simulacích, které jsme si popsali již minule s tím, že nyní je na náš objekt „látky“ efektně napojená křivka, která se při správném navržení „rodičovského“ objektu látky chová velmi přirozeně dynamicky. To je totiž skvělá věc, protože takový systém (kolize křivek) není od věci mít přímo v Klotildě. Klotilda totiž není fyzikálně přesný nástroj, ale je natolik přesvědčivá, a hlavně rychlá, že využití křivek v ní se přímo nabízí.

450

Ještě, jestli chceme, můžeme si zkusit vynechat uzel C.O.F.F.E.E. a napojit vše jen na opakování. Uvidíme, že Opakování neumí přenést jiná čísla indexu a tudíž simulace nebude korektní.

30

Tématické zařazení:

 » 3D grafika  

 

 

 

 

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

Uživatelské jméno:

Heslo: