Když ono je to prostě velké!

11.9.2008· Autor: Pavel Zoch, Ph.D.· Přidat komentář

I bylo nebylo, potřeboval jsem do jedné scény poupravit velkost jednoho objektu a uvědomil jsem tu neuvěřitelnou kostrbatost zadání velikosti v CINEMĚ 4D. Nikoliv nějaké zásadní omezení, ale skutečnost, že vlastně vždy potřebuji kalkulačku a znalost trojčlenky. A jelikož je lenost motorem lidstva, připravil jsem si řešení. Samozřejmě pomocí XPressa.

Nevím jak Vás, ale určitě mne a také Milana Elektronka Soukupa, uvedený systém až notoricky rozčiluje. Ono je to velmi zdlouhavé například v okamžiku, kdy neimportujete nějaký prvek z internetu (například nějaké umyvadlo) a následně zjistíte, že toto umyvadlo neodpovídá svými rozměry Vaší scéně. No dobrá, většinou stačí jen upravit měřítko v poměru desetinného místa, ale občas také ne. Narazil jsem kupříkladu na model, který vskutku nekorespondoval v žádném jednoduchém poměru. Měl jsem jen předpoklad, že jsou vzájemné poměry velikosti modelu v pořádku.

01

A tohle je dobrý příklad, vypůjčil jsem si toaletu od firma Roca z internetu, velikosti jsou nějaké podivné.... Řekněme, že je hloubka Z 80 jednotek rovných...

Jak na to? No jedině s kalkulačkou v ruce, mám výchozí velikost, mám cílovou velikost, vím že stávající velikost je 100% a tím pádem zjistím, jaká že je poměrná požadovaná velikost (v procentech). Tedy jde to. Pak vyberu objekt a ve Správci souřadnic vítězoslavně tuto velikost zadám. Hmmm, docela zdlouhavé řekl bych. Na mne až příliš. Hledal jsem tedy řešení. V XPressu, jak jinak.

Idea konstrukce

Konstrukci jsme si vlastně již popsali v předchozím odstavci, stačí nám, pokud známe velikost objektu a z této velikosti můžeme vycházet. Jenže XPresso nám v zásadě tuto velikost neposkytuje! Jediné co se dozvíme je velikost „ohraničující krychle“ a tak musíme vzít zavděk tímto objektem. Ostatně, on vůbec není špatný. Tedy pokud se nám podaří zanalyzovat velikost ohraničující krychle nějakého objektu, tak mám první hodnotu naší trojčlenky.

Co dále. Většinou nás zajímá jedna hodnota a chceme, aby se ostatní hodnoty upravili proporcionálně (jinak bychom to nedělali). Otázkou je, jaká hodnota. To je přeci na nás! My chceme zadat hodnotu, která nás zajímá. My potřebujeme upravit výšku postavy na 175 cm (Y), nebo délku postele na 198 (Z). Tedy potřebujeme pole, ve kterém budeme moci zadat tuto kritickou hodnotu a také přepínač, kterým budeme definovat osu, podle které se musí změna odehrát.

02

Jak jsem to myslel? Řekněme, že známe velikost objektu (ohraničující krychle) XYZ v hodnotách 200, 300, 400. Potřebujeme nastavit velikost objektu na hodnotu Y=25. Zadáme tedy že nás zajímá osa Y a zadáme hodnotu 25. Následně provedeme výpočet 25/300, což je poměr velikosti objektu a tento poměr přepošleme do portů velikost X, Y, Z původního objektu. A to je vlastně všechno.

Jistě že můžeme všechno trochu vyšperkovat (a také to uděláme), ale základní idea je tímto principem myslím dostatečně popsaná. Je zde jen jediný malinký problém. Jaký? Nejen v CINEMĚ 4D existují dva typy objektových režimů. První (Model) určených pro modelování a druhý (Objekt) pro animování. Rozdíl je v tom, že pokud definujeme velikost objektu v režimu Model, přezásobí se zadanou hodnotou poloha všech bodů objektu v daném směru a tím se body přesunou do nové pozice – tedy definuje se tak velikost na úrovni struktury modelu.

Bohužel ale popsaný systém není vhodný pro animování a tak zde je ještě jeden objekt, který se automaticky používá v případě animování objektu. V tomto případě se mění jen velikost os objektu a poté se zadanou hodnotou pronásobí poloha bodů – ale bez toho, že by se skutečně jejich poloha ve struktuře modelu měnila. Bod pouze ví, že ve směru X (například), má polohu 0,75 své stávající polohy. o je vše. Výhodou je, že tento systém je podstatně rychlejší než režim transformace všech bodů a proto se používá pro animace. Avšak také v XPressu. 

Právě jsme si popsali jedno úskalí, které celý náš systém má. Tedy úskalí. Ono to nevadí u 99% scén, jenže může se stát, že to vadit bude. O co jde? Právě o tu velikost v režimu objektu k animování, může se totiž stát že v jisté sekvenci rotace a změny velikosti ruku v ruce s hierarchickými vazbami může dojít k deformaci modelu. A to jisto jistě nechceme.

Jak to vyřešit? Cesta je pomocí XPressa vlastně jen jedna. Získat onu hodnotu poměru, zrušit celou operaci (obnovit velikost os objektu) a poté aplikovat získanou hodnotu v režimu model, kdy se upraví celý model včetně polohy bodů. A my tu potřebnou hodnotu samozřejmě získáme...

Příprava objektu

Abychom samozřejmě učinili nové R11 zadost, budu popisovat celý objekt právě na této verzi, ale to neznamená, že nelze ten samý objekt vytvořit i ve verzích starších. Žádný speciální uzel zde není použitý a jediný rozdíl zde je jen a pouze v uživatelském rozhraní, kdy v případě R11 mohu lépe řídit nastavení tohoto rozhraní (uživatelská data).

03

Vytvoříme si tedy objekt Osy a ten si podle libosti pojmenujeme. Vytvoříme mu nová uživatelská data (je nutné vybrat objekt a přejít do Správce nastavení > Uživatelská data > přidat uživatelská data a nebo Správa uživatelských dat):

  1. První položkou bude pole pojmenované „Object“ a typem dat „odkaz“, bude se jednat o pole, kterým budeme načítat upravovaný objekt.
  2. Druhá položka bude „vícenásobná“. Bude se jednat o hodnota „referenční velikosti“, tedy hodnoty původní velikosti objektu reprezentované poli X, Y a Z. Všechno to budou reálná čísla bez omezení max. hodnoty.
  3. Hodnoty popsané v poli dva jsou jen a pouze informativní a říkají nám, jaká že je velikost původního objektu. V tomto dalším vstupním poli (opět reálná data, opět bez omezení max. hodnoty) budeme zadávat hodnotu výsledné velikosti v té které zadané ose.
  4. Čtvrté pole definuje osu, podle které se mají ostatní osy upravit (při zachovaném poměru). Použijeme tedy typ dat „celá čísla“ a zadání vytvoříme pomocí následující sekvence, čímž vytvoříme maličký rozbalovací seznam:
  5. 0;X
    1;Y
    2;Z  

  6. Tato část je vlastně shodná s bodem „2“ a to zcela, jedná se o hodnoty výstupní, přepočítané naším poměrem. I v tomto případě jsou tyto hodnoty pouze informativní
  7. Poslední položku kterou jsem přidal byla položka pro zobrazení výsledného poměru velikosti v dané ose, kterou jsme zadali. Tuto hodnotu lze samozřejmě případně kopírovat a přenášet kamkoliv programu.

Tedy abychom si to shrnuli. Reálné vstupní hodnoty jsou pouze v poli odkazu, zadání velikosti a osy. Ostatní hodnoty se propočítají automaticky. Náš malý systém „zachovat poměr“ může začít pracovat. Jen co se XPresso ohřeje.

XPresso

Vytvoříme si u našeho objektu Osy novou vlastnost XPresso a otevře se nám náš milovaný editor. Vytvoříme si v něm (přetažením) nový uzel našeho objektu Osy a v něm vytvoříme port uživatelských dat „Object“ – což je odkaz na náš objekt ve scéně. Však víme...

Klikneme pravým tlačítkem myši a vybereme Nový uzel > XPresso > Hlavní > Ohraničující krychle. Ihned si ji vybereme a ve Správci nastavení zadáme typ souřadného systému na lokální a případně můžeme aktivovat využití deformovaných bodů. Napojíme si náš port uživatelských dat „Object“ s portem Objekt uzlu Ohraničující krychle. Tím zadáme řízený a zároveň analyzovaný objekt.

Vytvoříme další uzel Nový uzel > XPresso > Adaptér > Vektory2reálná, tedy převaděč vetoru na reálná čísla a tento uzel napojíme na port Velikost krychle uzlu Ohraničující krychle. A máme hodnotu velikosti ve všech třech rozměrech v samostatných hodnotách. Co s nimi?

04

V prvním vytvořeném uzlu (objektu Osy) si vytvoříme uživatelská data nastavení velikosti objektu v definované ose (viz bod 3) a tak si musíme vytvořit výstupní port s těmito daty (v mém případě „Set final size“).

Abychom získali hodnotu poměru a tím pádem i výsledné velikosti v procentech jakou má nabývat náš objekt, je zapotřebí dělit naší hodnotu hodnotou velikosti objektu. Kterou? Všemi! Tedy vytvoříme si uzel Nový uzel > XPresso > Počítat > Mat (dělit) a to hned třikrát. Do spodních vstupů těchto uzlů napojíme vždy výstupní hodnoty, které jsme získali z uzlu Vektory2reálná. Do vrchních portů vstoupí naše hodnota „Set final size“ z uzlu objektu Osy. Tím získáme tři poměry. Poměry námi zadané hodnoty a velikosti referenčního objektu ve směrech X, Y a Z. Teď jen rozhodnout, kterou že hodnotu použijeme...

05

Ono rozhodování nebude těžké. Vytvoříme si nový uzel Nový uzel > XPresso > Logický > Podmínka a zde vytvoříme ještě jeden vstupní port „Vstup“. Do těchto tří vytvořených vstupů nyní napojíme hodnoty z uzlů Mat:dělit v pořadí X, Y a Z. A ještě ono rozhodnutí, která z hodnot bude propuštěna. V uzlu objektu Osy vytvoříme nový výstupní port z uživatelských dat zadání příslušné osy (viz bod 4), která se v mém případě jmenují „Changed axis“ a tento port propojíme portem Přepínač uzlu Podmínka. A je to, poměrně snadné...

Nyní musíme dostat výsledný vytvořený poměr do velikosti objektu, který jsme původně načetli. Takže si opět vytvoříme uzel objektu Osy a v něm si tentokráte vytvoříme vstupní! porty Objekt a také Velikost X, Y a Z. Port objekt napojíme na port „Object“ (výstupní port prvního uzlu Osy, který definuje objekt, který používáme) a Velikost X, Y a Z propojíme s portem Výstup uzlu Podmínka. Tedy všechny tři porty s jedním. Nebojte je to správně, však také chceme zachovat poměr a to je přesně ono!

Vybereme si všechny uzly Mat:Dělit a zkopírujeme si je. A následně je přepneme na „násobení“. Nyní do každého jednoho z nich napojíme hodnotu, která nám vychází z uzlu „Podmínka“ a do druhého portu napojíme hodnoty, které nám vysílá uzel Vektory2reálná, čímž získáme vždy skutečnou aktuální velikost objektu – o čemž nás bude v závěru informovat náš objekty Osy.

Vytvoříme si poslední objekt Osy a v něm si vytvoříme opět uživatelská data – ale na vstupní straně! Tato data budou obsahovat všechny pole, ve kterých si chceme zobrazit potřebné informace. Vytvoříme zde vstupní pole hodnoty výstupního poměru (bod 6, já pojmenoval tento port jako Factor) a také pole původní referenční velikosti X, Y, Z (bod 2) a také pole X, Y a Z pro výslednou velikost (bod 5). A vše to jen musíme napojit. A jakže?

07

Výstup uzlu Podmínka propojíme s portem „Factor“, tedy portem ve kterém se nám zobrazí hodnota poměru velikosti. Výslednou velikost X, Y, Z (na mém obrázku jsou to porty nahoře) musíme napojit na vynásobené hodnoty poměru (z uzlu Podmínka) a zanalyzované hodnoty z uzlu Vektory2reálná (opět ve správném pořadí) – tedy napojíme je na uhly Mat:Násobení. Ve spodní části mého obrázku jsou porty původní velikosti, ty jsou tedy napojené jen na uzel Vektory2reálná, díky kterému získáme hodnoty ve velikosti X, Y a Z původního objektu. A tím jsme hotovi.

Závěrem

Po delší době jsem se vrátil k XPressu a to opět na velmi užitečném příkladu, ke kterému mne skutečně donutila praxe. To je na XPressu krásné, že nejdříve vlastně uživatel neví proč že by jej potřeboval, ale život sám si jeho užití vynutí a pak bývá skvělý pomocník... 

Pavel Zoch, Ph.D. Úplnej a naprostej .....

E-mail: pzdm(zavinac)digitalmedia.cz | Web: www.3dsoftware.cz | ICQ: 248707187 |

Motto: "Co ve věčnosti leží, mrtvé není, v záhadě věků i smrt se ve smrt změní." (H.P.L.)

Komentáře k článku  

Přihlášení uživatele