Está en la página 1de 5

?

Transformaciones en OpenGL
OpenGL y las bibliotecas asociadas componen por nosotros las transformaciones usuales; las del modelo, las de proyeccin y las de texturas. Aqu analizaremos las dos primeras que componen las transformaciones necesarias para posicionar los objetos, las luces y la c mara en la escena, proyectarlos y armar la ima!en.

Dispositivo de salida y ventana:


La "entana del pro!rama o del dispositi"o de salida se define al inicializar el subpro!rama !r fico, cuando se pide una "entana al sistema operati"o. #on GL$% se &ace as' glutInitWindowSize(width, height); glutInitWindowPosition(x, y); los par metros son coordenadas y tama(os )enteros* en el sistema de coordenadas del dispositi"o o ima!en donde se "aya a renderizar )de"ice coordinates*. +n este caso se trata de una salida al monitor )para !lut y para el ,O' -,- . upper,left* pero bien podra &aber sido un buffer en memoria que se !uardar posteriormente como ima!en o tambi/n una impresora. +sta primera llamada es la 0ltima transformacin que sufre el modelo en el pipeline, la que mapea la "entana de dibujo en el dispositi"o de salida, aplasta y rasteriza. La pen0ltima es la que lo mapea en un "ie1port o "entana de dibujo con sus coordenadas de "entana )1indo1 coordinates*' glViewport(x, y, width, height) los n0meros, enteros, definen el rect n!ulo en pxeles referidos a la "entana del pro!rama, donde se dibujaran los objetos. 2ara OpenGL el ori!en para x,y es lo1er,left. ,i !l3ie1port no esta presente, se considera que es toda la "entana del pro!rama. +l tama(o del "ie1port cambia junto con el tama(o de la "entana del pro!rama, por lo tanto solo aparece en la rutina que maneja el resize.

Stacks de Matrices:
A partir de aqu &ay que definir la matriz acti"a con una llamada a la funcin !l4atrix4ode' glMatrixMode(GLenu ode) +sa funcin &ace que las operaciones subsi!uientes se apliquen sobre la matriz adecuada, indicada por el par metro mode que debe ser una de las si!uientes tres constantes' GL!M"#$LVI$W GL!P%"&$'(I") GL!($*(+%$ OpenGL mantiene tres stac5s o pilas de matrices &omo!/neas )67*. #omo sus nombres indican, una es para las transformaciones del modelo al sistema de la c mara, con una profundidad !arantizada de 89; otra para las proyecciones, que puede alber!ar al menos 9 matrices y la tercera para la aplicacin de texturas )que no trataremos aqu*. +n cada stac5 se parte de una matriz )normalmente la identidad* que se "a multiplicando por las que aparecen para obtener la matriz actual. :ay tres operaciones b sicas que alteran la matriz actual' ;eemplazo por pop ;eemplazo por car!a 2ostmultiplicacion 2us& y 2op' son funciones de manejo del stac5' glPushMatrix() y glPopMatrix() La llamada al pus& !uarda )sal"a* una copia de la matriz actual en el stac5 sin modificarla; la altura del stac5 aumenta una unidad. La llamada al pop reemplaza la matriz actual por la 0ltima que se puso en el stac5 )<lifo= o last>in, first>out*, la altura del stac5 decrece una unidad.

La funcin glLoadMatrixd(GLdou,le - ) car!a el conjunto de ?@ doubles apuntados por m y lo pone en lu!ar de la matriz actual, la matriz que estaba no se !uarda, se perdi. +sta llamada es para introducir al!una matriz especial calculada por soft1are. glLoadIdentity() es una llamada especial que car!a la matriz identidad y es la llamada &abitual para empezar el proceso, el punto de partida. La combinacin de transformaciones se realiza con operaciones autom ticas de postmultiplicacin, eso puede &acerse con matrices !eneradas autom ticamente por OpenGL o multiplicando por una matriz !uardada en un array' glMultMatrixd(.onst GLdou,le - )
Aota' OpenGL usa las matrices ordenadas por columnas )transpuestas*' ?* ,i m se define como doubleB?@C, el se!undo elemento es el de la columna - y fila ?. 9* ,i se define como doubleB6CB6C, mB-CB?C es el elemento en la columna - y fila ?, mB9C es la columna 9.

Las Operaciones &abituales como translacin, rotacin y escalado se pueden aplicar en forma autom tica usando al!una de las si!uientes llamadas' gl(ranslated(tx, ty, tz) gl%otated(ang, rx, ry, rz) glS.aled(sx, sy, sz) Los par metros son ob"ios excepto para la rotacin que consiste en una rotacin de n!ulo an! )en !rados* alrededor de una recta por el ori!en definida por el "ector Drx,ry,rzE, el sentido de la rotacin esta dado por el si!no del n!ulo y la re!la de la mano derec&a sobre el "ector. +n todos los casos de composicin, la matriz actual a es reemplazada por una que consiste en el producto de a por la matriz que entra m' aij ai5 m5j. Las operaciones las &ace OpenGL )normalmente en la placa !r fica*

Proyeccin:
+n primer lu!ar se llama a' glMatrixMode(GL!P%"&$'(I")); glLoadIdentity(); Lue!o &ay que definir el tipo de proyeccin o <modelo de c mara=. La <c mara= tiene sus particularidades' un campo "isual o n!ulo de "isin rectan!ular y la profundidad de campo definida mediante un plano cercano y uno lejano, entre los cuales se "en los objetos. %odo lo que est/ por fuera de ese recinto tronco>piramidal no se "isualiza )clippin!*. OpenGL ofrece dos modos de proyeccin o <modelos de c mara=' orto!onal y perspecti"a, cuyas matrices se pueden !enerar autom ticamente a partir de al!unos datos rele"antes. 2royeccin orto!onal )paraleleppedo*' gl"rtho(le/t, right, ,otto , top, near, /ar) 2royeccin perspecti"a )frustum o tronco de pir mide*' gl0rustu (le/t, right, ,otto , top, near, /ar) +stos datos se definen en el sistema de coordenadas de la c mara o del obser"ador. +n ambos casos se especifican las coordenadas del "olumen a "isualizar. +n el caso de la "ista en perspecti"a, los planos near y far deben estar delante del ojo )mayores que cero y far F near*. Las bases del frustum tienen distinto tama(o, por lo tanto es necesario destacar que otros los par metros definen las dimensiones del rect n!ulo en el plano near; la distancia del ojo al plano near es entonces la que define el n!ulo del campo "isual )field of "ie1 o fo"*. Otra opcin para la proyeccin perspecti"a es con una funcin de la biblioteca GL$' gluPerspe.ti1e(/o1y, aspe.t, z)ear, z0ar), fo"y es el n!ulo de "isin "ertical en !rados y aspect la relacin anc&oGalto.

+l "olumen de "isualizacin o clip space se mapea internamente en un cubo )normalized de"ice coordinates*, conser"ando las coordenadas z para poder realizar despu/s el ocultamiento de lneas )entre otras cosas*. +ste "olumen ya esta definido, pero aun no esta ubicado en la escena.

Composicin de la escena:
%odos los objetos se dibujan y posicionan en un sistema de coordenadas arbitrario que es se suele denominar 1orld coordinate system o sistema de coordenadas !lobal o espacio del modelo, este sistema es arbitrario, del usuario o del pro!ramador. Los objetos indi"iduales se suelen definir en un sistema propio del objeto pero lue!o son ubicados en el espacio )intermediario* del modelo y finalmente todas las coordenadas son transformadas al espacio "isual de la c mara. ,e comienza con la llamada de definicin del estado inicial de la matriz model"ie1' glMatrixMode(GL!M"#$LVI$W); glLoadIdentity(); A partir de aqu estamos en el sistema de coordenadas "isual o de la c mara Ha se defini el tipo de c mara y a&ora &ay que ubicarla en la escena, &ay que asi!narle posicin y orientacin. :ay dos formas de &acerlo' una es ubicar la c mara )el sistema de coordenadas del ojo* en el espacio del modelo, con !luLoo5At)* y la otra es ubicar el espacio del modelo en el sistema del ojo con traslaciones y rotaciones. La primera es muc&o m s intuiti"a' gluLoo23t(eyex,eyey,eyez,.enterx,.entery,.enterz,upx,upy,upz) los par metros son las coordenadas del ojo o c mara )eye*, el punto al que se mira )center* y un "ector que indica la direccin de la cabeza o parte superior de la c mara, para fijar la rotacin de la c mara alrededor del eje ojo>centro. A&ora estamos en el sistema de coordenadas !lobal o espacio del modelo. Aqu suelen posicionarse las luces fijas respecto del modelo. 2ero, si la luz es <tipo flas&= y se mue"e con la c mara, se define su posicin antes que la de la c mara )antes del Loo5At*, directamente en el sistema de coordenadas "isual. A&ora solo resta ubicar los objetos. +l stac5 de matrices permite armar modelos complejos utilizando partes preensambladas. #uando se preensambla una pieza en una rutina, se car!an y se mue"en al!unos objetos )probablemente preensamblados en otra rutina*. +jemplo, auto'
Posi.ionar el auto en el odelo #i,u4ar auto5 6 Push ( atriz auto) Mo1er el siste a de .oordenadas al .entro de rueda delantera iz7uierda #i,u4ar rueda5 6 Push ( atriz rueda di) Posi.ionar ,ul8n 9 #i,u4ar ,ulon 95 6Push::;Pop< Pop ( atriz rueda di) :;; :;; Push ( atriz rueda di) Posi.ionar ,ul8n = #i,u4ar ,ulon =5 6:;< Pop ( atriz rueda di) #i,u4ar .u,ierta #i,u4ar llanta < Pop ( atriz auto) :; :; Mo1er al .entro de rueda trasera iz7uierda #i,u4ar rueda5 6:;< #i,u4ar otras partes del auto;;;; Pop ( atriz auto) <

La rutina para dibujar el auto se puede llamar tantas "eces como se quiera, armando una rutina dibujarIauto)* y definiendo las transformaciones necesarias para lle"ar cada auto a la posicin que le corresponde en la escena. Lo mismo sucede con las piezas. 2or eso es indispensable que cada rutina de dibujo <deje las cosas como estaban= antes de salir, las matrices y el resto del estado )attrib*. +l modelado en s suele realizarse en pro!ramas de #A7 o cualquier otro soft1are para lue!o dejar que OpenGL posicione las primiti"as ledas. %ambi/n puede realizarse directamente en OpenGL, pero con muc&simas limitaciones, componiendo primiti"as b sicas con al!unas piezas de alto ni"el pro"istas por GL$ o GL$%.

Pipeline:
La secuencia de operaciones es la si!uiente'

%oda la escena' modelo, luces y c mara, se transforma mediante la matriz model"ie1 )model"ie1* &acia el sistema "isual. La escena, "ista desde el ojo, es transformada lue!o mediante la matriz de proyeccin, que recorta )clip* el espacio "isible, pero conser"ando el 1 del espacio proyecti"o )67*. Lue!o se procede a la )mal llamadaJ* di"isin perspecti"a, que simplemente di"ide las coordenadas por 1 y <normaliza= a un cubo B>?,?C8 conser"ando un z no>lineal que a0n sir"e para &acer ocultamiento. Lue!o se utiliza la definicin del !l3ie1port )y !l7ept&;an!e, pero no se usa* para acomodar los "alores a un dispositi"o de salida especfico )conser"ando un dept& buffer*. Kinalmente se realizan las operaciones <por pxel=, ocultando, rasterizando y rellenando.

En gl t!"ase
,i se lee el pro!rama se puede obser"ar la secuencia de sucesos explicada' ?* +l tama(o de la "entana se define en el main y cambia junto con el "ie1port en el resize. 9* ,e define el campo "isual car!ando la matriz de proyeccin y la proyeccin adecuada. 8* Lue!o se inicializa la matriz model"ie1 y se car!an las luces y la c mara )o "ice"ersa*. 6* Kinalmente se dibujan los objetos. +n el pro!rama se mantiene el ori!en del espacio del modelo en el centro del "ie1port, pero podra &acerse otro mapeo cualquiera de las coordenadas del modelo a las "isuales. Los !iros se &icieron <complicados= para mostrar dos mecanismos a la "ez' alrededor de y !ira el modelo )amy* y alrededor de x !ira la c mara )ac*. Aotar que la c mara siempre mira al ori!en y el "ector up se recalcula manteni/ndose perpendicular, tanto al eje x, como al "ector camara>ori!en, sin que la "ista se <de "uelta=. +l zoom es esencialmente bidimensional, la escala se aplica a x e y, pero no a z. +so se nota pues afecta a 1- que define los clippin! planes izquierdo y derec&o; a &-, para el superior y el inferior, pero no afecta a near y far que se mantienen en 9 y L. +stos n0meros se entienden as' la c mara siempre

est a distancia M del ori!en, por lo tanto se "e lo que est/ a menos de 8 unidades del ori!en. %odos los objetos fueron escalados para caber en una esfera de radio 8.

Tra"a#os de aplicacin:
+n !lutIbase' ?* #omentar la llamada a !l3ie1port y analizar el resultado. #ambiar !l3ie1port' )?--,M-,1,&*, )?--,M-,1>?--,&>M-*, )9-,?-,1>6-,&>9-*. Noomear muc&o para "er el "ie1port lleno y deszoomear muc&o para "er donde esta el centro. 9* #ambiar el znear y el zfar a 6.8 y M.O respecti"amente. 8* Analizar los par metros en la definicin de la proyeccin perspecti"a y orto!onal. 6* 7onde se inicializa la matriz model"ie1 cambiar' glMatrixMode(GL!M"#$LVI$W); glLoadIdentity(); gl(ranslated(9,>,?); dou,le at@9AB; glGet#ou,le1(GL!M"#$LVI$W!M3(%I*, at); /or (int 4CD;4E9F;4GG) .out EE at@4B EE H,H; .out EE at@9FB EE endl; glLoadIdentity(); M* #ambiar !luLoo5At)P* por lo si!uiente' dou,le dCs7rt(eye@DB-eye@DBGeye@9B-eye@9BGeye@>B-eye@>B), a.Catan>(eye@9BId,eye@>BId)Iatan(9)-=F; gl(ranslate/(D,D,Jd); gl%otate/(a.,9,D,D); @* Analizar el par metro que cambia de luz posicional a direccional. O* Analizar la ubicacin de la luz fija o con la c mara. L* Analizar las dos interpretaciones de la rutina que dibuja el cubo a partir de copias del cuadrado. Q* #omponer un nue"o objeto' una mano cuyos elementos )palma y falan!es* sean copias del mismo cubo deformado y reubicado en distintas posiciones. ?-* Animar al!0n mo"imiento jer rquico de la mano y los dedos. ??* #omprobar el efecto de una reduccin centrada y uniforme del cuadrado ori!inal al Q-R de su tama(o y el cambio por un crculo.

También podría gustarte