Struktura scéy Trasormace () Petr Felkel Katedra počítačové graiky a iterakce, ČVUT FEL místost KN:E-413 (Karlovo áměstí, budova E) E-mail: elkel@el.cvut.c S použitím materiálů Bohuslava Hudce, Jaroslava Sloupa a Vlastimila Havraa Posledí měa: 16..15
Osova Struktura scéy Modelováí a repreetace scéy Lieárí (ehierarchická) repreetace Hierarchická repreetace Vlastí gra scéy příprava pro cvičeí Trasormace () Homogeí souřadice Projekce a viewport Rotace podle Eulerových úhlů a Gimbal lock Virtuálí trackball PGR
Struktura scéy PGR 3
Modelováí modely = abstrakce virtuálích světů, které vytváříme svými programy v počítačové graice modelujeme pomocí geometrických objektů většia API poskytuje aprosté miimum geometrických primitiv, složitější objekty ich musí vytvořit uživatel (OpeGL poue trojúhelík, čára a bod) Složeé objekty v modelech a vaby mei imi musíme ějak repreetovat SAMI Objekty se typicky ačtou exterích souborů pomocí kihove, apříklad kihova ASSIMP: http://assimp.sourceorge.et/ Příklad použití: http://www.lighthouse3d.com/cg-topics/code-samples/importig-3d-models-with-assimp/ (Po. Kihov a je pomalá v debug režimu a widows) PGR 4
Modelováí geometrický objekt (dům) le rodělit a eávislé segmety (detaily) apř. oko, komí,... Nabíí se 3 působy repreetace: 1. Posloupostí segmetů (lieárí datová struktura). Hierarchický model aiví strom 3. Hierarchický model orietovaý acyklický gra PGR 5
1. Lieárí (ehierarchická) repreetace objekt je repreetová posloupostí segmetů (lieárí datová struktura) segmet obsahuje deiici graických elemetů a jejich atributů i trasormací (př. levé oko v příemí) dům střecha TAG komí TAG stěy příemí TAG stěy prvího patra TAG 1. oko 4. oko TAG TAG eexistuje iormace o vájemých vabách objektů => sado se maipuluje se segmety, => ale těžko s komplexími strukturami (celé patro) PGR 6
1. Lieárí (ehierarchická) repreetace Kdy použít lieárí strukturu v programu? Poue pro jedoduché objekty void house(void) { /* model celého domu */ roo(); /* střeší segmet */ chimey(); groudfloorwalls(); irstfloorwalls(); irstwidow(); ourthwidow(); } PGR 7
. a 3. Hierarchická repreetace Vtahy mei objekty modelu repreetujeme graem, kterému říkáme GRAF SCÉNY ( scee graph ) Gra scéy eí kostruktem OpeGL, strukturu scéy si v programu vytváříme sami. V grau uložea (v ávorce uvedeo ve které části grau) Geometrie G (listy), trasormace T atributy A (vitří uly, hray, listy) odkay a součásti (hray) Vykresleí objektu = systematické procháeí (traverováí) grau do hloubky či do šířky v programu volit jede působ traverováí a eměit ho atributy se dědí, ebo jsou v ulu předeiováy PGR 8
. Hierarchický model aiví strom Jedoduchý gra je kořeový strom (orietovaý gra be uavřeých cest a smyček, každý uel kromě kořee má předchůdce-rodiče) Vitří uly repreetují adřaeé segmety (detaily) Listy repreetují graická primitiva opakují se TA dům Příemí Prví patro střecha TA 1. oko. oko stěy 3. oko 4. oko stěy komí TA G G G listy = graická primitiva (+ atributy) PGR 9
. Hierarchický model aiví strom Jak akódovat strom v programu? vitří uly ukládají trasormace, atributy a odkay a ásledíky listy repreetováy kreslícími ukcemi (geometrie) Př. Napevo v programu: void house(void) { /* model celého domu */ // (posuutí do počátku) groudfloor(); // včetě trasormace pro příemí irstfloor(); // včetě trasormace pro 1. patro roo(); // včetě trasormace pro střechu } Problémy repreetace s použitím stromu: opakuje se geometrie (listy) i stejé tvary (detaily) v růých polohách (vitří uly) trasormace kódováy apevo v ulech obtížá maipulace (jede celek (uel) ejle použít vícekrát a růých místech) PGR 1
3. Orietovaý acyklický gra (DAG) Též Collapsed tree (VRML) Opakující se detaily se uloží je jedou - (př. jeda deiice komíu) Vitří uly repreetují detaily daé úrově modelu, optimálě vpočátku [,,] (ale eopakují se) Hray repreetují vaby (relace rodič-potomek) esou trasormace, atributy (ikremetálí měu a cestě od rodiče k potomkovi) Listy repreetují graická primitiva (ale eopakují se) příemí dům TA patro Prví patro TA střecha TA stěy levé oko oko Pravé oko krytia komí G G PGR 11
3. Orietovaý acyklický gra (DAG) Jak akódovat DAG v programu? Vitří uly ukládají odkay a potomky v ákladí poloe případě ormaliačí trasormaci poor a ormály, vi. další lekce Hray trasormace, atributy Listy repreetováy kreslícími ukcemi Př. : void house(void) { /* model celého domu */ /* astav trasormace pro příemí */ loor(); // v ákladí poloe /* astav trasormace pro prví patro*/ loor(); ; /* astav trasormace pro střechu */ roo(); } PGR 1
Repreetace grau specialiovaou kihovou graem v paměti (OpeSceeGraph, OpeSG, OpeVRML, dcgisceegraph) pro gra scéy vláští třída a ukce při vykresleí se traveruje strom (trasormují, volají kreslící procedury) skrytě pomocí vlastí datové struktury repreetující gra scéy pořadím voláí vykreslovacích procedur může být méě obecá a proto rychlejší PGR 13
Hierarchická repreetace - shrutí Výhody hierarchického modelováí (DAG) hierarchické modely odrážejí strukturu objektů dobře se vytvářejí (top-dow ebo bottom-up) dobře se editují a aimují, dobře se maipuluje s podstrukturami (trasormace jsou součástí hra) paměťově úsporá repreetace modelu (be redudace) PGR 14
Atributy v graech scéy POZOR a atributy při traverováí grau scéy atributy jsou stavové proměé proto ůstávají astaveé, dokud je eastavíme jiak to platí pro ěkteré implemetace výsledek pak může áviset a pořadí traverace v ašich příkladech to eplatí a pořadí traverace eáleží pro aimaci grau (dyamické astavováí trasormací) se používá ěkolik postupů probereme jede možých působů, použitý pro áš gra scéy PGR 15
Vlastí gra scéy Jedoduchý gra scéy pro účely předmětu PGR, vi cvičeí. root trasorm EllipsAim RotatAim trasorm trasorm trasorm jeep cessa mig terrai istace třídy MeshNode (soubor data/jeep/jeep.obj ) istace třídy MeshNode istace třídy MeshNode (soubor data/terrai ) PGR 16
Vlastí gra scéy Typy ulů SceeNode báový typ obsahuje vektor odkaů a potomky TrasormNode ukládá trasormačí matici vitří uel grau RotatioAimNode rotace kolem osy pro aimaci vitří uel grau ukládá vykreslitelou geometrii terrai list grau TerraiNode teré vygeerovaý programem terrage MeshNode OBJNode objekt ve ormátu.obj Metody update / pro aimace addchildnode/deletechildnode - správa hierarchie scee trasorm RotatAim OBJ PGR 17
Vlastí gra scéy - dcgisceegraph Ručí sestaveí grau scéy 1 S void iit() { root_ode = ew SceeNode( "root" ); T Terrai // terrai trasorm ode CTrasormNode* trasorm_p = ew CTrasormNode( root_ode ); // terrai ode CTerraiNode *terrai_p = ew CTerraiNode( trasorm_p ); terrai_p->load("terrai"); PGR 18
Vlastí gra scéy - dcgisceegraph Ručí sestaveí grau scéy T A...... Terrai OBJ // Model bude rotovat kolem osy procháející počátkem souřadic RotatioAimNode * prot = ew RotatioAimNode("py-rot", root_ode); prot->setaxis(vec3(1,, )); prot->setspeed(m_pi / 1); S // Nyí ahraj model ormátu OBJ a učiň ho potomkem ulu s deiicí // aimovaé rotace, rodič je správě astave MeshNode *mesh = ew MeshNode( cessa.obj, prot); mesh->loadmesh(); // load the data PGR 19
Vlastí gra scéy - dcgisceegraph Vykresleí grau scéy void uctiodraw(void) { // vymaž obraovku glclearcolor(.3,.3,.3, 1.); glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); // astaveí matice projekce = perspektivy glm::mat4 projectio = Matrix4::Perspective(M_PI / 4, aspect_ratio,.1, 1); // astaveí modelovací a pohledovou matici Matrix4 view = Matrix4::Idetity(); Matrix4 model= SedMatricesToShaders(projectio, view, model) // vykresli celou scéu = traveruj gra scéy rootnode_p->draw(); }... glutswapbuers(); PGR
Vlastí gra scéy - dcgisceegraph Jedoduchá aktualiace trasormace pomocí časovače void FucTimerCallback(it) { double timed =.1 * (double)glutget(glut_elapsed_time); // v milisecudách // aimuj scéu pro adaý čas i (root_ode) root_ode->update(timed); } // astav další voláí časovače pro příště gluttimerfuc(33, FucTimerCallback, ); // vyvolej překresleí obrau glutpostredisplay(); PGR 1
Vlastí gra scéy - dcgisceegraph Příklad: ikremetálí rotace, vi třída RotatioAimNode{ TrasormNode * ptras = ew TrasormNode("py-tras", root_ode); ptras->traslate(vec3(.5,, -3)); ptras->scale(vec3(.5,.5,.5)); RotatioAimNode * prot = ew RotatioAimNode( "py-rot", ptras); prot->setaxis(vec3(1,, )); prot->setspeed(m_pi / 1); // v radiáech a sekudu MeshNode * mesh1 = ew MeshNode("data/cessa.obj",prot); mesh1->loadmesh(); PGR
Skládáí trasormací v grau scéy Trasormace se při postupu shora dolů skládají leva doprava a) Vyhodocují se během vykreslováí výhodé použít ásobík: dolů push / ahoru pop b) Vyhodotí se v samostatém průchodu update() složeé trasormace se uloží v hraách (takto je to v dcgisceegraphu) PGR 3
Homogeí souřadice bod je repreetová svými souřadicemi P = [x, y, ] t v poč. graice používáme homogeí souřadice P = [x, y,, w] t Kartéské souřadice homogeí souřadice P = [x, y, ] t volit w P = [w.x, w.y, w., w] t příklad: bod v kartéských souřadicích [, 3, 5] t. Jaké jsou jeho homogeí souřadice? [w., w.3, w.5, w] t aw apř. [, 3, 5, 1] t, [4, 6, 1, ] t, atd. homogeí souřadice Kartéské souřadice P = [x, y,, w] t P = [x/w, y/w, /w] t w, wr příklad : bod v homogeích souřadicích [9, 3, 1, 3] t. Jaké jsou jeho kartéské souřadice? P = [9/3, 3/3, 1/3] t = [3, 1, 4] t Pro body volíme w = 1 PGR 4
Homogeí souřadice ve D Geometrická iterpretace ve D: bodům s homogeími souřadicemi P = [w.x, w.y, w., w] t,w Tvoří přímku be počátku, která je celá obraem bodu P = [x, y, ] t x p x P Výhody homogeích souřadic Aií trasormace i projekce le apsat jedou maticí (ve 3D maticí 4x4) Skládáí trasormací jako ásobeí matic Pro vektory je w = Kompaktí repreetace bodů (w ) a vektorů (w = ) O k 1 w [x p, y p,1] t [kx p, ky p, k] t y p [w x p, w y p, w] t PGR 5 y
Trasormace () PGR 6
Aalogie s otoaparátem B. Beeš PGR 7
Viualiace trasormací - opakováí PGR 8
PGR Projekčí trasormace w y x Souřadice oka Modelovací a pohledová trasormace modelovací Trasormace Pohledová trasormace Projekčí trasormace + Ořeáí (clippig) Trasormace áběru (Viewport) modelovací souřadice světové souřadice souřadice kamery (oka) Normaliovaé souřadice aříeí vrchol Perspektiví děleí ořeávací souřadice 3D D 9
Projekčí trasormace deiuje tvar pohledového objemu (viewig volume, rustrum) pohledový objem komolý jehla určuje, jak se objekt pomítá a průmětu (perspektiví či paralelí projekce) deiuje polohu ořeávacích rovi, tj., které objekty či jejich části budou oříuty (clippig plaes) adává se v souřadicích kamery OpeGL umožňuje jakoukoliv projekci deiovaou uživatelem projekce NENÍ aií trasormací (projekčí matice emá posledí řádek ve tvaru 1) uté jsou ukce vytvářející matice pro ortograickou projekci (paralelí) perspektiví projekci PGR 3
Paralelí projekce mat4 glm::ortho( loat let, loat right, loat bottom, loat top, loat ear, loat ar); vytvoří matici pro paralelí promítáí pohledový objem je kvádr [let, bottom, *] a [right, top, *] = body a blíké a vdáleé ořeávací roviě (* = ear a ar), jsou mapováy do dolího levého a pravého horího rohu ormátu (viewport) průměta PGR 31
Perspektiví projekce mat4 glm::rustum( loat let, loat right, loat bottom, loat top, loat ear, loat ar); vytvoří matici pro perspektiví promítáí pohledový objem je komolý jehla průměta podstavy rovoběžé, kolmé a vektor pohledu meší podstava = průměta objekty blíže většeé (aberou relativě větší část pohledového objemu) PGR 3
Perspektiví projekce mat4 glm::perspective ( loat ovy, loat aspect, loat ear, loat ar ); jiý působ deiice parametrů pro perspektiví matici vytvoří matici pro symetrické perspektiví promítáí ovy = úhel áběru v roviě x-, rosah., 18. spolu s ear určí h aspect je poměr šířky ku výšce pohledového objemu (w / h) w = aspect * h; hodoty ear a ar musí být kladé (ear >!!!) průměta PGR 33
Základ perspektivího obraeí PGR 34
Odvoeí paralelí projekčí matice (Ortho) PGR l r l l r l r x x l r l x x x x l r l x 1 1 1) ( 1 1) ( Pricip: Zachová x a y. Igoruje Plus ormaliace souřadic: itervaly l, rt, b, 1, 1 x y l r l r x l r x b t b t y b t y 1 Hloubku ale potřebujeme a určeí viditelosti x x r l 1 1 d y y x x M ' ' ' d 1 1 35
Odvoeí paralelí projekčí matice (Ortho) PGR 36 Odvoeí hloubky ear a ar se apisují v ortho kladě (vdáleost od oka), jsou ale a áporé ose, proto ve vorcích áporé 1 1) ( 1 1) ( ) ( ) ( x y 1 1 l r l r x l r x b t b t y b t y a, pokud : Platí, b t r l
Odvoeí paralelí projekčí matice (Ortho) PGR 37 Výsledá matice 1 b t b t b t l r l r l r R x y l r l r x l r x b t b t x b t y 1 1 b t b t l r l r R a, pokud : Platí, b t r l b t b t y b t y
Odvoeí perspektiví projekčí matice (Frustum) Zmešuje x a y dle (promítá je a stíítko) x P = [x, y, ] P = [x,y,] x' d x' x d, x, y' d y' y d 1, ' x', y', ',1 T. x, y,, d T y, 1 1 1 d d ' d x 1 y =d stíítko Po trasormaci homogeích do kartéských souřadic (po děleí w = / d ) dostáváe P x. d /, y. d /, d T PGR 38
Odvoeí perspektiví projekčí matice (Frustum) Odvoeí X a Y Dosadíme d = - - - x' x, y' y Plus ormaliace souřadic: y x y r l x r l r l t b y t b t b Odvoeí dále: x y 1 r l x r l r l 1 t b y t b t b 1 ( ).( ).( ) ( ) w x y r l x r l r l t b y t b t b PGR 39
Odvoeí perspektiví projekčí matice (Frustum) Mapováí hloubky Iterpoluje se 1/ Proto ve tvaru A B Plus ormaliace souřadice Dosadíme - -1, - 1 A A 1 B a 1 B - - A B 1 ( ) y Odvoeí A a B a dalším slajdu.( ) PGR 4
Odvoeí perspektiví projekčí matice (Frustum) PGR 41 B - A 1 a 1 / B - A 1 Odvoeí A a B: Dosadíme - -1, - 1 A A -A A ---- ---------- B - A - B A 1 1 B B B A A B 1 1 1 B A
Odvoeí perspektiví projekčí matice (Frustum) PGR 4 Výsledá matice 1 b t b t b t l r l r l r R b t b t l r l r R 1 1 a, pokud : Platí b t r l x y l r l r x l r x b t b t y b t y w
Trasormace áběru 3D D vrchol x y w modelovací souřadice Modelovací a pohledová trasormace modelovací Trasormace světové souřadice Pohledová trasormace souřadice kamery (oka) Projekčí trasormace + Ořeáí (clippig) ořeové souřadice Perspektiví děleí Normaliovaé souřadice aříeí Trasormace áběru (Viewport) Souřadice oka PGR 43
Trasormace pracoviště (Viewport) Formát (viewport) = obdélíková oblast oka, do které se mapuje průměta (= promítací rovia) void glviewport( GLit x, GLit y, GLsiei width, GLsiei height); [x, y] je levý dolí roh ormátu (viewport), width a height je šířka a výška ormátu v souřadicích oka v pixelech pro kihovu GLUT se astavuje v callback ukci reshape poměr stra ormátu by měl být stejý jako poměr stra průměty jiak kresleí obrau GLUT: implicitě a celé oko (,,w, h) PGR 44
Trasormace pracoviště (Viewport) Normaliovaé souřadice aříeí [x d y d d ] t 1 1 Souřadice ormátu a obraovce [x w y w w ] t scree w -1-1 1 x w = (w / ) x d + o x -1 y w = (h / ) y d + o y w = [(-) / ] d + (+) / w a viditelost (Z-buer) o y x y viewport o x = x + w/ o y = y + h/ gldepthrage(, ) astaveí rosahu hloubek, clamp(,) blíká rovia. vdáleá rovia 1. h PGR 45
Trasormace pracoviště (Viewport) Dota a aktuálí ormát (trasormaci pracoviště) it ormat[4]; glgetitegerv( GL_VIEWPORT, ormat); Výam: x, y, w, h x=ormat[], y=ormat[1], PGR 46
Zachováí poměru stra obrau aby ůstala kružice kulatá v proceduře reshape(it w, it h) registrováa jako Callback glutreshapefuc(reshape); Dva působy a) mešeím ormátu b) protažeím projekce PGR 47
Zachováí poměru stra obrau a) mešeím ormátu - bude evyužitá plocha oka i( w > h ) // oko široké glviewport((w-h)/,, h, h); else // oko vysoké glviewport(, (h-w)/, w, w); kresleé ekresleé kresleé ekresleé Nevyužitá plocha glviewport(,, w, h); x, y, w, h glviewport((w-h)/,, h, h); w > h Nevyužitá plocha PGR w <= h 48
Zachováí poměru stra obrau b) protažeím projekce (větší se pohledový objem) GLloat aspect = (GLloat) w / (GLloat) h; i( aspect > 1. ) // w > h => oko široké m = glm::ortho(-1.15*aspect, 1.15*aspect, -1.15, 1.15, -1, 1); else // let, right, bottom, top, ear, ar m = glm::ortho(-1.15, 1.15, -1.15/aspect, 1.15/aspect, -1, 1); glm::rustum(-1.15, 1.15, -1.15/aspect, 1.15/aspect,.1, 1); Obdobě: glm::perspective(6., aspect,.1, 1); kresleé ekresleé w > h => oko široké PGRlet*aspect right*aspect 49
Rotace podle Eulerových úhlů a Gimbal lock PGR 5
Rotace dle Eulerových úhlů Eulerovy úhly = pitch-yaw-roll (výška, kurs, rotace) komplexí otočeí rodělíme a otočeí dle os X, Y, Z X Y Z 1 cos() -si() si() cos() 1 cos() si() 1 -si() cos() 1 cos() -si() si() cos() 1 1 Rotate(, 1,, ) Rotate(,, 1, ) Rotate(,,, 1) PGR 51
Základí orietace Pitch-Yaw-Roll [NASA] PGR 5
Základí orietace Pitch-Yaw-Roll Pitch Yaw Roll Výškovky Kormidlo Křidélka [NASA] PGR 53
Gimbal [ džimbl] otočá podpěra -Tři gimbals spojeé dohromady + ávaží či setrvačík -Původí použití u gyroskopů a upevěí kompasů, kame a skleic a lodích od atiky. [Wikipedia] PGR 54
Rotace a Gimbal lock [ džimbl lok] Eulerovy úhly = pitch-yaw-roll (výška, kurs, rotace) komplexí otočeí rodělíme a otočeí podle os X, Y, Z dělá se postupě => otočeím druhé osy v hierarchii o 9 splyou osy a dojde ke trátě jedoho stupě volosti (gimbal lock) y y x y x 1 3 x 1 Pořadí rotací v programu: Rotate(a, 1,, ) // X 3 Rotate(9,, 1, ) // Y Rotate(c,,, 1) // Z 1 Z splye s X Rotace kolem X s modelem otočeým o 9 dle Y dělá totéž, co rotace kolem Z PGR 55
Ztráta jedoho stupě Gimbal Lock [Wikipedia] [http://www.ho-emde.de/~homa/gimbal98.pd] PGR 56
Gimbal Lock [http://www.youtube.com/watch?v=c8bjo7mo] PGR 57
Virtual trackball Mapuje D plochu a 3D povrch polokoule Najde obecou osu a úhel => eastae gimbal lock!!! Kvaterioy vhodé pro ukládáí, sčítáí, atím se obejdeme be ich PGR 58
Virtual trackball - pricip Představa: objekt obale koulí se středem v počátku soustavy souřadic objektu a otáčí se vůči kameře resp. obraovce Dva body a deiují ačátek a koec otáčeí => Úhel a vektor obecé osy otáčeí [Ha-Wei] PGR 59
Virtual trackball - pricip Na áběr položíme polokouli Polokoule se a obraovku promíte jako kružice y [x,y,] t Myší adáme x a y x y [Ha-Wei] Promíteme polohu myši a povrch koule (pro x a y ískáme ) x PGR 6
Virtual trackball - pricip Promíteme polohu myši a povrch koule (pro x a y ískáme ) Koule o poloměru Bod a kouli se promítá a roviu Pro ámé vypočteme x [x,y,] t [Ha-Wei] y PGR 61
Virtual trackball - pricip Uložíme předchoí polohu myši a sledujeme aktuálí Normála roviy (,, ) je osa otáčeí okolo y Rotujeme objekt dle osy o správý úhel Původí trasormace Otočeí Nová trasormace x [Ha-Wei] Před iterakcí si uchováme původí modelovou matici Během iterakce k í akumulujeme ové otočeí Po dokočeí iterakce ji aktualiujeme dle posledího PGR 6
Virtual trackball 1. Detekuj stisk myši a ulož si 3D souřadice -> P1. Sleduj pohyb myši (drag) -> P a) Promíti D body P1, P a kouli b) Urči osu rotace od P1 k P (ormálu roviy) a úhel c) Přiásob pootočeí k rotaci trackballu d) Překresli scéu 3. Ukoči sledováí myši (uvolěí tlačítka) y mouse click [m x,m y ] viewport x x y [x,y,] [Ha-Wei] PGR 65 x [Ha-Wei] y
Virtual trackball - implemetace Proměá trackballrotatiomatrix obsahuje celkovou rotaci trackballu (poskládaou malých rotací od P1 k P) Při vykreslováí se skládá s aktuálí modelovou maticí (ásobí ji leva) glm::mat4 ewmodel = trackballrotatiomatrix * modelmatrix; a jako modelová matice používá se ta složeá // složeá modelová matice gluiormmatrix4v( modelmatrixlocatio, 1, GL_FALSE, glm::value_ptr(ewmodel)); drawmodel(); Vi demos/trackball-demo a pgr-framework/src/trackball.cpp PGR 66
Virtual trackball - implemetace 1. Detekce stisku myši a uložeí výchoích souřadic P1 //mouse butto pressed withi a widow or released void mousecb(it butto, it state, it x, it y) { i(butto == GLUT_LEFT_BUTTON) { i(state == GLUT_DOWN) { startgrabx = x; // poit P1 startgraby = y; glutmotiofuc(mousemotiocb); //. start mouse trackig retur; } else { // GLUT_UP glutmotiofuc(null); // 3. stop mouse trackig } } } PGR 67
Virtual trackball - implemetace. Sleduj pohyb myši -> P // mouse motio withi the widow with ay butto pressed (drag) void mousemotiocb(it x, it y) { edgrabx = x; // poit P edgraby = y; i(startgrabx!= edgrabx startgraby!= edgraby) { /* get rotatio icremet rom trackball */ trackball.addrotatio(startgrabx, startgraby, edgrabx,//abc) edgraby, wiwidth, wiheight); /* build rotatio matrix rom trackball rotatio */ trackball.getrotatiomatrix(trackballrotatiomatrix); startgrabx = edgrabx; // move poit P1 to curret P startgraby = edgraby; glutpostredisplay(); // d) } } PGR 68
Virtual trackball - implemetace abc) Přidáí pootočeí k celkové rotaci trackballu void CClassicTrackball::addRotatio( it startpoitx, it startpoity, it edpoitx, it edpoity, it wiwidth, it wiheight ) { loat edx, edy, startx, starty; i(startpoitx == edpoitx && startpoity == edpoity) retur; // o move => o rotatio mapscreecoords( startx, starty, startpoitx, startpoity,// a) wiwidth, wiheight); //D => 3D mapscreecoords( edx, edy, edpoitx, edpoity, // a) wiwidth, wiheight); //D => 3D glm::mat4 ewrotatio; // rotatio icremet computerotatio(ewrotatio, startx, starty, edx, edy); // b) // trackball rotatio = rotatio icremet * previous rotatio _rotatiomatrix = ewrotatio * _rotatiomatrix; // c) } PGR 69
Virtual trackball mapováí a kouli a) Mapováí souřadice myši a ormaliovaou kouli w_height 1 Myš OpeGL -1 1 w_width -1 Převod itervalu, w_width a rosah -1, 1 x = 1. + (scree_x / w_width) *. y = 1. (scree_y / w_height) *. PGR 7
Virtual trackball - implemetace a) Mapováí souřadice myši a plochu koule Myš OpeGL w_height widow coordiates mouse click [m x,m y ] 1 [x,y,] -1 1 w_width -1 void CTrackball::mapScreeCoords(loat& outx, loat& outy, it screex, it screey, it wiwidth, it wiheight) { outx = -1. +. * screex / wiwidth; outy = 1. -. * screey / wiheight; } PGR 71
Virtual trackball - implemetace b) Výpočet matice potočeí trackballu void CClassicTrackball::computeRotatio(glm::mat4& rotatio, loat startpoitx, loat startpoity, loat edpoitx, loat edpoity) { i(startpoitx == edpoitx && startpoity == edpoity) { rotatio = glm::mat4(1.); // Zero rotatio retur; } glm::vec3 axis; loat agle; computerotatioaxisadagle(axis, agle, startpoitx, startpoity, edpoitx, edpoity); } rotatio = glm::rotate(glm::mat4(1.), agle, axis); PGR 7
Virtual trackball - implemetace b) Výpočet osy otáčeí a úhlu #deie TRACKBALLSIZE (.8) void CTrackball::computeRotatioAxisAdAgle( glm::vec3& axis, loat& agle, loat startpoitx, loat startpoity, loat edpoitx, loat edpoity) { // Compute -coordiates or projectio o P1, P to sphere glm::vec3 p1(startpoitx, startpoity, projecttosphere(trackballsize, startpoitx, startpoity)); glm::vec3 p(edpoitx, edpoity, projecttosphere(trackballsize, edpoitx, edpoity)); axis = glm::ormalie(glm::cross(p1, p)); // AXIS // ALGLE to rotate aroud that axis. glm::vec3 d = p1 - p; // chord (tětiva), t=si(), / double t = glm::legth(d) / (. * TRACKBALLSIZE); //* Avoid problems with out-o-cotrol values...s i(t > 1.) t = 1.; i(t < -1.) t = -1.; agle = loat(radtodeg(. * asi(t))); // ANGLE d } // (i degrees) PGR 73 1
Virtual trackball - implemetace a) Projekce D bodu a kouli (uvitř) či hyperbolu (vě) loat CTrackball::projectToSphere(loat radius,loat x,loat y) { double d, t, ; d = sqrt(x*x + y*y); i(d < radius *.7716781186547544) { // Iside sphere = sqrt(radius*radius - d*d); } else { // O hyperbola t = radius / 1.414135637395488; = t*t / d; } } retur (loat); PGR 74
Virtual trackball Roger Crawis: Implemetig a Virtual Trackball or Examier Viewer, http://www.cse.ohio-state.edu/~crawis/cis781/slides/virtualtrackball.html pro starou veri OpeGL, kterou se de eučíme Mírě odlišý postup po celou dobu iterakce se vtahuje k prvímu bodu P1 Gavi Bell: Implemetatio o a virtual trackball https://github.com/dapig/coslam/blob/master/src/gui/trackball.cpp a.h Zde uvedeá vere trackballu PGR 75
Odkay [NASA] The begiers guide to aeroautics. NASA Gle Research Ceter, http://www.grc.asa.gov/www/k-1/airplae/ [Homa] Gerot Homa, http://www.ho-emde.de/~homa/gimbal98.pd [Ha-Wei] Ha-Wei She. Quaterio ad Virtual Trackball. CSE 781 Itroductio to 3D Image Geeratio, 7 http://www.cs.suysb.edu/~mueller/teachig/cse564/trackball.ppt PGR 76