5. Geometrické trnormce V této čáti předmětu 3D počítčová grik e budeme bývt geometrickými trnormcemi 3D objektů. Jedná e o operce pouvů otáčení měn měřítk koení těle vtvořených opercemi modelování. Stejnou problemtikou pro 2D grické objekt jme e bývli v předmětu Grické editor. 5. Homogenní ouřdnice Pro jednodušení výpočtů trnormcí e výhodou používá repreentce bodů pomocí homogenních ouřdnic. to repreentce e používá několik důvodů. Homogenní ouřdnice umožňují vjádření nejčtěji používných lineárních trnormcí pomocí jediné mtice což v nehomogenních krtékých ouřdnicích není možné. Dlší čto používnou trnormcí vjádřitelnou pomocí mtic v homogenních ouřdnicích je perpektivní promítání. půob vjádření trnormcí pomocí mtic je obvlášť výhodný ejmén proto že pro jejich implementcí le vužít eitujících knihoven pro práci mticemi. Skládání trnormcí e totiž v tom kontetu reliuje jko náobení mtic inverní trnormce je repreentován inverní mticí td. Moderní grické proceor eektivně reliují výše uvedené mticové operce rchlot prcování cén e dík peciliovným grickým krtám neutále všuje. Upořádná čtveřice číel [ w] předtvuje homogenní ouřdnice bodu P krtékými ouřdnicemi [ h h h ] ve třech roměrech jetliže pltí h h h w w w w Bod P je vými homogenními ouřdnicemi určen jednončně. Souřdnici w též nýváme váhou bodu. Čto e volí w potom jou homogenní ouřdnice bodu P [ h h h ]. Obecnou mtici 4 4 repreentující lineární trnormci bodu P [ w] n bod [ W] budeme ončovt M její peciální přípd pk podle druhu trnormce npř. (trnlce R (rotce. Mticová rovnice trnormce ouřdnic bodů objektu má tvr W M 4 4 w Ob mtice M je potom ávilý n tpu trnormce (otáčení koení td..
5.2 ákldní trojroměrné trnormce Pro lineární trnormce v protoru e v počítčové grice e používjí mtice velikoti 4 4 použitím homogenních ouřdnic. Pounutí Pounutí ve 3D je určeno vektorem pounutí ( který udává jednotlivá pounutí ve měrech ouřdných o. Mticová rovnice pro pounutí pro w Otáčení kolem pevného bodu ve měru ouřdných o Pro otáčení objektu vůči pevnému bodu je třeb i uvědomit těleo má v protoru tři tupně volnoti. Muíme ted peciikovt tento pevný bod vektor který procháí pevným bodem ve měru kterého e objekt otáčí úhel otočení (obr.5.. Obr. 5. 3D otáčení kolem bodu Jedním jednoduchých přípdů otáčení ve třech roměrech je otáčení kolem tředu těle p umítěnému v počátku ouřdného tému. Rotce ve měru konkrétní o npříkld nmená že e ouřdnice bodů rotujícího objektu nemění. rnormce repreentující otáčení kolem o o úhel Obdobně jou etven trnormce pro otáčení kolem o.
Pokud chceme bod objektu otáčet kolem počátku ouřdnic ve měru libovolného vektoru vcháejícího počátku můžeme to provét potupným otáčením kolem jednotlivých o. Předpokládejme potupné otáčení kolem o úhel kolem o úhel β kolem o úhel γ. Výledná mtice rotce bude R R R R. Dlším přípdem je otáčení kolem bodu umítěného mimo počátek ouřdného tému. (obr.5.2. V tomto přípdě použijeme trnormci loženou pounutí (p do počátku ouřdného tému otočení R( o přílušný úhel pětného pounutí (-p do bodu p. Obr.5.2 Otáčení kolem bodu mimo počátek ouřdného tému Npříkld pro otáčení kolem o bude trnormční mtice M (p R( ( p Vnáobením trnormčních mtic R dotneme loženou mtici pouvu otáčení M + Obecnou rotcí nýváme otáčení kolem bodu mimo počátek ouřdného tému ve měru obecné o v protoru le reliovt e ložením několik dílčích trnormcí kolem o. Nleení přílušné trnormční mtice všk není jednoduché. Předpokládejme že o rotce je určen vektorem i + j + k bod otáčení p (obr.5.3. Vektor bodu p do bodu trnormovného je otočen vůči vektoru bodu p do původního bodu o úhel. Obr.5.3 Otáčení kolem obecné o
Po odvoení le rotci bodu kolem bodu p ve měru obecného vektoru o úhel popt rotční mticí tvru + + (- ( 2 2 2 I R kde I je jednotková mtice 4 4. Obecnou rotci kolem bodu p který leží mimo třed těle řešíme podobně jko u obecné rotce v rovině tj. potupnými trnormcemi. volený bod otáčení p pouneme do počátku ouřdného tému otočíme bod trnormovného objektu o dný úhel pětným pounutím vrátíme výledek do výchoí poice. rnormční mtice M bude ložen e tří ákldnici trnormcí ( ( ( p R p M měn měřítk měnu měřítk S( v protoru popiují trnormční mticová rovnice kde koeicient určují měnu ve měru přílušné ouřdnicové o. Pomocí měřítkových koeicientů můžeme reliovt některou trnormcí ouměrnoti (rcdlení v protoru (tředová ouměrnot ouměrnot podle rovin oová ouměrnot. Npříkld ouměrnot podle rovin n obráku je reliován pomocí koeicientů -. koení Operci koení ve třech roměrech můžeme rodělit n tři přípd koení vůči jednotlivým rovinám koeicient koení Sh Sh Sh. Obr. 5.4 koení vhledem k rovině
Ve všech třech přípdech určují koeicient míru koení v odpovídjícím měru. Mtice trnormce koení vůči rovině Sh rnormční mtice koení Sh Sh Sh Sh 5.3 Deormční trojroměrné trnormce Předchoí uvedené trnormce chovávjí ákldní tvr objektu protože jou uniormní vůči ouřdnicím. Pokud npříkld použijeme při trnormci měn měřítk růné hodnot v áviloti n některé ouřdnici objekt e užuje nebo rošiřuje podél přílušné o tím e nedeormuje jeho ákldní tvr. Abchom deormovli ákldní tvr těle muíme trnormční koeicient modiikovt nějkou unkční ávilotí. N obr. 5.5 jou preentován deormční trnormce úžením kroucením prohnutím. rnormce prohýbáním je proveden pro všechn tři ouřdnice. Obr. 5.5 Deormce úžením kroucením prohnutím Deormce užováním Deormce úžením e ndno reliuje pomocí operce měn měřítk kd e měřítkové koeicient mění podle nějké unkce. Vbereme ouřdnou ou podél které chceme provét úžení těle volíme unkci měn měřítk pro blé dvě ouřdnice. to unkce může být pro kždou ouřdnici jiná. Rovnice úžení podél o ( (
Funkce ( může být lineární nebo nelineární. Doením ( do trnormční mtice měn měřítk dotneme trnormční mtici užování podél o. Deormce kroucením Deormce kroucením e reliuje pomocí operce otáčení kd e úhl ntočení mění podle volené unkce. Kroucení podél o + kde ( je unkce měn úhlu ntočení. Doením ( do trnormční mtice měn měřítk dotneme trnormční mtici kroucení podél o. Deormovt kroucením le tké jen čát těle v intervlu ouřdnice Potom deormce kroucením podle o :. m ( ( pro < ( + ( pro < > > m m pro pro m m Deormce prohýbáním Deormce prohýbáním je ložen n geometrické trnormci pouvu. Předpokládejme prohýbání podél o. Předem e určí třed ohýbání intervl hodnot ouřdnice ve kterém e bude prohýbt koeicient k lineárního prohnutí. Deormční trnormce lineárního ohýbání podél o + k + k pro pro < pro pro < > > Doením ( k do trnormční mtice měn měřítk dotneme trnormční mtici prohýbání podél o. Nelineární deormce nemohou být obecně plikován n objekt povrch tvořenými polgonálními ítěmi. Problémem je v tkovém přípdě možné omeení pojitoti mei vrchol polgonů dále polgonální rolišení povrchu m m m m
5.4 Geometrické trnormce v OpenGL V knihovně OpenGL eitují tři trnormční mtice které e potupně plikují n bod (vrchol popřípdě i n normál vrcholů. První trnormční mtice e jmenuje ModelView mtri. N tuto mtici e můžeme dívt jko n pojení modelové mtice pohledové mtice protože e používá jk pro ntvení poice kmer tk i pro mnipulci objekt ve céně. Druhá trnormční mtice e jmenuje Projection mtri používá e pro ntvení perpektivní projekce kmer. řetí trnormční mtice e jmenuje Viewport mtri používá e po provedení perpektivní projekce k mpování objektů btrktních ouřdnic do ouřdnic okn. to polední mtice ve kutečnoti poue provádí trnormci v dvojroměrné ploše proto e ní v OpenGL neprcuje jko "plnohodnotnou" mticí. Kromě těchto tří mtic můžeme měnit mtici která e používá při mpování tetur n povrch objektů. to mtice e nývá eture mtri. měn trnormčních mtic ntvení ktuální trnormční mtice Při měně některé trnormčních mtic muíme nejprve určit kterou trnormční mtici budeme měnit. K tomuto účelu e používá unkce void glmtrimode(glenum mode. to unkce má jeden prmetr mode jímž určujeme mtici kterou budeme dlšími přík měnit. Prmetr může nbývt tří hodnot repreentovných mbolickými kontntmi: GL_MODELVIEW - bude e měnit ModelView mtri tj. mtice ve které jou uložen modelové pohledové trnormce (trnormce objektů ntvení kmer. GL_PROJECION - bude e měnit Projection mtri tj. mtice která e používá pro ntvení perpektivní nebo ortogonální projekce kmer. GL_EURE - bude e měnit eture mtri tj. mtice která e používá při mpování tetur n povrch objektů. Aktuálně ntvenou mtici le jitit pomocí příku glgetintegerv(gl_mari_mode ¤tmode po jehož provedení je v proměnné currentmode některá kontnt GL_MODELVIEW GL_PROJECION nebo GL_EURE. měn obu ktuálně ntvené trnormční mtice S obem ktuálně ntvené mtice le mnipulovt pomocí unkcí gllodidentit( gllodmtri*( glmultmtri*( glrnlte*( glscle*( glrotte*(. Nejjednodušší těchto unkcí je unkce void gllodidentit(void. to unkce nhrje do ktuálně ntvené trnormční mtice koeicient odpovídjící jednotkové mtici tj. mtici ve které jou všechn prvk vnulován výjimkou prvků hlvní digonál které jou ntven n jedničku. to mtice hrje úlohu neutrálního prvku při náobení mtic nebo při náobení vektoru mticí. Při ntvování některé trnormční mtice e v nproté většině přípdů číná touto unkcí neboť pomocí ní mtici "připrvíme" n plikci dlších trnormcí. Funkce gllodmtri*( e používá pro přímé ntvení prvků mtice. to unkce eituje ve dvou vrintách lišících e poue tpem pole které unkci předáváme jko prmetr. První vrint je ndeklrován jko void gllodmtrid(cont GLdouble *m druhá vrint jko void gllodmtri(cont GLlot *m. U první vrint má pole jko vé prvk hodnot tpu GLdouble ve druhé vrintě jou to prvk tpu GLlot. Dlší unkce glmultmtri*( louží k vnáobení ktuálně ntvené trnormční mtice mticí dnou jko prmetr této unkce. Opět eitují dvě vrint které e liší
tpem prvků předávného pole. to vrint jou ndeklrován jko void glmultmtrid(cont GLdouble *m void glmultmtri(cont GLlot *m. U první vrint e používjí hodnot tpu GLdouble u druhé tpu GLlot. Dlší tři unkce glrnlte*( glscle*( glrotte*( jou používán mnohem čtěji než předchoí dvě unkce. U těchto unkcí e nemnipuluje přímo jednotlivými prvk mtice le dávjí e ákldní lineární trnormce - poun měn měřítk rotce. Pro dné trnormce e vtvoří dočná mtice ktuální mtice (většinou je to mtice ModelView je touto dočnou mticí vnáoben. Funkce glrnlte*( která eituje ve dvou vrintách void glrnlted(gldouble GLdouble GLdouble void glrnlte(gllot GLlot GLlot peciikuje poun o vektor [ ]. Funkce glscle*( vrintmi void glscled(gldouble GLdouble GLdouble void glscle(gllot GLlot GLlot louží k dání trnormce měn měřítk kd je těleo neávile většeno/menšeno ve třech měrech odpovídjících jednotlivým ouřdným oám. Funkce glrotte*( která má opět dvě vrint void glrotted(gldouble ngle GLdouble GLdouble GLdouble void glrotte(gllot ngle GLlot GLlot GLlot peciikuje trnormci rotce. ěleo je otočeno o úhel ngle okolo o procháející počátkem bodem (. Úhel ngle je v obou vrintách dán ve tupních. Bod jímž o rotce procháí b neměl být ntven n ouřdnice (. íkání hodnot prvků jednotlivých trnormčních mtic Pro íkání hodnot které mjí jednotlivé prvk trnormčních mtic le použít unkci void glgetdoublev(glenum pnme GLdouble * prm nebo void glgetflotv(glenum pnme GLlot * prm. Prmetr pnme muí obovt jednu těchto mbolických kontnt: GL_MODELVIEW_MARI GL_PROJECION_MARI nebo GL_EURE_MARI. V poli prm jou potom vrácen prvk přílušné trnormční mtice. Otevřeme protředí Viul C++ ve ložce Prik9 projekt pr9.dw. Sledujeme jednotlivé trnormční přík unkce ondipl potom progrm putíme trnormujeme objekt pomocí přílušnými klávemi.