vector Tuplasfs LineLoop coordenadas Vertices std i vector for int izo tuplazfs ian unsigned ni coordenadas int pushback go.sxcosfiz.oxM coordenadas y PIxilnl 0.5xsinfl2co MPIxiNn1YI return coordenadas vector TuplasfscoordenadasVerticesLines unsigned std i vector tuplazfs ni coordenadas pushback I 21.00.041 coordenadas µ coordenadas coordenadas PIxilnl 0.5xsinfl2co MPIxiNn1yI pushback go.sxcosfiz.oxM PIxilnl 0.5xsinfl2co MPIxiNn1yI pushback go.sxcosfiz.oxM pushback I 21.00.041 coordenadas return coordenadas y void coordenadasVertices IndicesTriangles coordenadas for coordenadas unsigned ir ni pushback go.sxcosfiz.oxM ian 1 izo void coordenadasVerticesIndices lines coordenadas 40 itt.it 24 1 0 n unsigned n vector Tuplazfs coordenadas vectoraunsigned indices l pushback 20.0.0.041 int i o coordenadas for PIxilnl 0.5xsinfl2co MPIxiNn1YI i l indices insert indicesendll for l vector unsigned indices int indices insert indicesendo y coordenadas n vectoratuplazfs pushback 20.0.0.041 int izo for unsigned unsigned ia n int pushback go.sxcosfiz.oxM izo ian 1 int 0 ite indices inserte indicesendes indices inserte indicesendo ir y uh indices inserte indicesendo 0 indices inserte indicesendo 111 1.041 indices inserte indicesendo n ti o PIxilnl 0.5xsinfl2co MPIxiNn1SI void openglminino MI normalunsigned ni assert l glGetErrorC static std vector tuplazfs EL NO ERROR coordenadas LineLoop ni coordenadas Vertices void openglminino MI Ind assert l unsigned ni EL NO glGetErrorC static std vector static std vector unsigneds indices tuplazfs ERROR coordenadas if l coordenadasempty I coordenadas VerticesIndices Triangles n l coordenadas indices void openglminino MD normalunsigned ni assert l glGetErrorC static std vector tuplazfs EL NO ERROR coordenadas LineLoop ni coordenadas Vertices void openglminino MD Indiunsigned ni assert l EL NO glGetErrorC static std vector static std vector unsigneds indices tuplazfs ERROR coordenadas if l coordenadasempty I coordenadas VerticesIndices Triangles n l coordenadas indices K meridianos y paralelos evértice intersección y µ K celdas B cubitospequeños y K K 1024 128MB Es Tin TTE 2K vértices 212.1KA away 4 2.21K11 4ktrinqu 4 3.2K B 43.4K B K 16 18KB K 1024 72Mis 72K B sup D 4sientenmal Bt 4 sea.mn B entuma En Esta na III nata t Mitad devértices quede triángulos int numtiras a11 413t 8mB 183 4 3 2m21B m 4sientasmal Bt 4sea min B Bt 8mB d ntt m 12m21m 183 4 3 canta B m T El m Imita oponil o au tiempo de procesamiento de tiras detriángulos malla in 1 5 Aproxun 50 másdememoriaocupa la con respecto al modelo detirasde triángulos modelo del modelo de mallasindexada es aprox la mitadrespecto al Arial vector tuplazis generar unsigned for En unsigned izo ion Itt c is 0 for unsigned izo ion int l for unsignedfaith en Htt if clisa k and pa k fort to if I te tri sinell tal i and tries tritio i and titties triaca i and trienios tricks i and tritio trick i and trite 1 ari pushback lijl Ccitt Ccitt µ return ari trigla jI jI jI jI ji or or or or Area constmallaInd floatcalcular malla ii float area 0 f Tuplas forI a vi int i o u irmalla sizes triángulos it mallavertices mallatriangules tis 1 mallavertices mallatriangulasCisco mallavertices mallatriangules tis 23 mallavertices mallatriangulesCisco area return area sqrtlu.crosscul.lengthsq.ch 2.0 TÍ Ta B É x E su x rota E d 10 0.5 01 Occ 0.5 ñ de d ñ 10,110 El II 0 El d 10 0.5 01 a dec l ñ ñ E 0.5 dec d I E El I ta 0 El El nodistorsiona f Ea s ez b z 1 Cx E r ext E ay sir nodistorsiona n sur f f.cz E G r ext E La Crt En re E Ab Es W g Dec E t oy En b G n Ea ca l Occ ñ Cats s c s Occ n te Cytsk b ay sie a li up 10,201 pimp a o el brilloes máx en p co1,01 cosca 1 Este punto no es visible para el observador 20,01 copia li p lis como Ip µ K EEEE E E I E 2 E OI 01 up IEaEz 01 ri zlli.nplup.li 21k 111Ea Ea 01 Li 2 01 p O sí es visible para el observador E E Este punto el brilloes máx en P EnE o 24vértices 8.31 siiiiiiii am siiiiiiii iii iii siiiiiiii 0,010 40,0 11 20,1101 40.1.14 21.0.04 41,014.41.1.0441,411 0,0101 40,0 11 20,1101 40.1.14 21.0.04 41,014.41.1.0441,411 4 7 4 sentido antihorariodesde fuera 0.3.24 0,1 34 triángulos Izq dcha 447,54 4 4 6,71 8 13,94 8112,134 10,11 154 4 1015,141 Abajo arriba 16.22.204 416,181224 17.21.234 c tt_ver t.gl E E TE Ej t no_Ver 4 17.231194 Y E El 14 Atrás delante 41,31 I J I El 41,04 4 1 0,04 4 1 0,04 40 1,04 40 1,04 40 1,04 40 I II E J4 1,0 04,4 1 0,04 1 1 20 f El 1,53 E El LEÍ t El 20,53 E E 14 1 0,04 f 1 0,04 E Eh Í O 1 0,04 1.0.0 04,40 1,04 40 1,04 40 1,04 40 1,04 14 40,0 0,0 14 40,0 14 40,0 14 40,0 14 40,0 14,4 0,0 14 40,0 1 s const s Void ti desplazar static u Occ 1 a 1 n Zec y 10 1,01 E Oo E 0 E do t.az Oea a Ey tea III i ye Zec x Tec ÉI EE Va Vo a Si I d Si II d to devolver fase O resolver no loot tdo Vool nada nodo Si te 0 Si t o Si 7 solución T t ta vo O y sacarte It I PeVol malo tal Von nooo mon t yo t ha losttdaVato noveo navontravor nada nada devolver fase to t y resolver Ro Vo aba0 O e atbe 1 aut bu devolvertrue disco C c NF LEI Si I Si I d to iii d no loot tdo devolver fase O resolver col NI Pe CI malo tal Cnl nodo Si te 0 Si t o yo nada iiii T tal C O y sacarte t ha losttda c o nada devolver fase to t y resolver llRo ell e r En casoafirmativo devolvertrue total unpuntoPeestáen elrayosi pe Otto tso spe loottdo.onttdn.at Yestáen start si 1pct pedirdonde o Viper pel r Flp Ipecac Oo Co tdoOn Ca tal o la total 2 OoCo tacit Oral pelCECI Oo OitOEI Co Cita ad attoodo 11011 t t 2t Orde Halt Loc Fac b adit adultildotdidil codo atad atad t lldi Ej EE YÉL La ato pues de10.0.01 Si ta ta co Si ta ta so Si tiro no hay return tiro intersección pe return o t minkti te4 d p o ti d l casoextremo un puntoPeestáen elrayosi pe Otto tso Está en Csi Oo ttdottlattdzt Y OEOnttd.es Entonces Fac b de 0.1.01 y Si a o 00 del cilindro hola I R el rayo cortaría al 1 y 0 t 0 tomamos 00.0.021 EEEEE t y ÉL 2a sólo si q.iq spe loottdo.onttdn.at 0 si Cortaría en el punto te el primero tal que Onto 100,011021 Si aro sea y a cilindro y P 01 01101,01 Ont tarde ya Ontteda Si Os y el y ya 0,13 pe O trd Si Os y el y Ya 0,13 pe O tad Si yaya Y 0,13 no hay Si Os 1 Yael return intersección pe otminkti.tk d o Pelottdo.onttdn.attal un puntoPeestáen elrayosi pe Otto tso Está en el cono si y sólo si oitoitzcoodotordaltttldoi.de Oit tan Ear be t 2a si a o to Si aro sea y y ÉI osonttd.tt intersección Ont tarde ya Ontteda Si Os y el y ya 1 Pe Si Os y el y ya 1 Pe 1 ya 1 y si oeonttd.es on 00 OI 2100cLaditordal En otrocaso no hay Si t t atonda es no hay Si Os 1 Yael return Ottid Ottad intersección pe otminkti.tk d return PtosOtto 1 O EjeX E sxttx.sx.tt Eje Y E sytty sytty szttz.se te Eje Z al 2 settee O b carbitt cases n sexta f I sita a sx ca b.fi cabina ca b ni Traslación 100 de o 10 dy Escalado sx o o o o o 10 a 1 Y 001 de 00 o o o 1 s o o yo I o o sto 1 o o o 1 Rotación cosasino o sino cosa o O o a cosa yo o o sysino sismo sycoso 1 o o 1 o a no ser quesusy Sx o o o yo O o sino sino cosa o o o y a a cosa sismo sysino sycoso o o o o 1 a GL_LINE LOOP staticGlenun nombre_vao_O constunsigned int n 5 std vectoratuplazas posiciones forCintio ian posiciones it pushback Laos a M PI it In sin a mil ilIn if nombre_veo 01 nombre_vao CrearVall else y Vertex Bind Array nombre_vao ge b GL LINES staticGlenun nombre_vao_O constunsigned int n 5 std vectoratuplazas posiciones forCintio ian posiciones posiciones it pushback Laos a M PI it In sin a mil ilIn pushback Laos a M PI Iii Iu sin a mil ti if nombre_veo 01 nombre_vao CrearVall else y Vertex Bind Array nombre_vao ge D In a SECUENCIANOINDEXADI static Glenun nombre_vao 0 constunsigned int n 5 std vectoratupla3 s posiciones df for int i O i cn i back 0.00.00.04 posicionespush posiciones pushback Lcos a M PI posiciones pushback Lcos it In sin 2 M Pi il In 0.04 a M PI Iii Iu if nombre_veo 01 nombre_vao CrearVall É else g geBindVertexArray nombre_vao posiciones sin 2 M Pi i 1 n 0.04 b CONSECUEIAINDEXADA static Glenun nombre_vao_O constunsigned int n 5 std vectoratupla3 std vector dfs posiciones Tuplazas indices back 40.0.0.00.04 posicionespush forCintio ian posiciones for int in isn i pushback Laos it indicespushback a M PI it In sin 2 M Pi i n 0.04 40 i i et.nl if nombre_veo 01 nombre_vao CrearVall Crear V30Atri blindatrib_posiciones G CrearUBoInd indices else geBindVertexArray nombre_vao UBLE 2 posiciones posiciones.sizposiiom.li void visualizarFrame11 std using namespace Sea C Sea á_ á Ax Ax iii á ó OÍ Ax Ay Az 5 marco un y B axixtay.ytaz.si I bx.it by Y b E ay h bx.IgItby de referencia cartesiano C bx.by be 0 bx.jxby.pe Éi bz.El i bx.it by Y bz.tl azfi.Ibx.x by.y un marco cartesiano bz son perpendiculares tienen longitud unidad az.bz E ayfbfj.xby.Ijtbztaz.fbx.ifb.az Los versores de ax.bxtay.by ba Sea C Ex 5 marco un Ax Ay Az 05 y á_ Sea Ax iii á ó a I ay B I az.si y x de referencia cartesiano C bx.by be 0 maldad bx.jtby.pe ba.iq bz.El ixlbx.xtby.ytbz.EDtayfyxfbx.itby Y bz.tl azfxbx.x by.y axfbxIFtbyIxxyl bzli.it ayfbxlixxl axbyz axbzy I aybz Í bylIibzlixzD azfbx Exxl bylE I bzfif ayb.isE ay bei azbxy azbyx azbyltyfazbx axbzi zfaxby aybxl aybz.azby ax azbx ax be by aybx Ix I D J J Fx É d El vinilo que lo cumplees Ó Sea C i I É ó á_ Sea Ax Ay Az Hemos visto áxb OÍ de referencia cartesiano marco un B y C bx.by be 0 que I aybz azby I azbx ax ba E axby ay b Ahora bien á I taxi ay aybz azby Y axfaybz azby az E fi I azbx ax ba aybz azby E yfazbx ay azbx axbzltazlaxby aabz aafzbytafazbx Análogo para b axby ay b axbz z axby aybx aybx afaxbz.azazaio Grado en Informática y Matemáticas. Informática Gráfica. Curso 2014-15. Teoría. Examen de la convocatoria ordinaria de febrero. Viernes, 6 de Febrero de 2015. nombre: apellidos: e-mail: 1. (2.5 puntos) Dado un cubo de lado 1, con una de sus esquinas en la posición (0,0,0) y otra en (1,1,1) –el resto las puede usted averiguar fácilmente-, dibuje cómo se vería el cubo (y el origen y los ejes del sistema de coordenadas del mundo) en un viewport cuadrado si la cámara tiene cada uno de los siguientes conjuntos de parámetros: (1) O = (0,0,5); VPN = (0,0,1); VUP = (0,1,0) (2) O = (0,0,5); VPN = (0,0,1); VUP = (0,-1,0) (3) O = (5,5,5); VPN = (1,1,1); VUP = (0,1,0) (4) O = (0,5,0); VPN = (0,1,0); VUP = (1,0,0) (5) O = (5,0,5); VPN = (1,0,1); VUP = (0,1,0) Suponemos en todos los casos que se usa una proyección paralela (ortográfica), y que el cubo aparece completamente dentro del viewport, sin recortarse ninguna parte del mismo. • O es la posición del observador (origen del sistema de coordenadas de la cámara), • VPN es el vector perpendicular al plano de visión (eje Z+ del sistema de coordenadas de la cámara), • VUP es el vector que indica el sentido “hacia arriba” (eje Y+ del sistema de coordenadas de cámara) Respuesta 2. (2.5 puntos) Partiendo de un objeto definido por su tabla de vértices y caras (triángulos), escribir en código C o C++ una función que devuelva el área total del objeto. Usar la fórmula de Herón para el área de un triángulo: área = √ s ( s−a)( s−b)(s−c) donde: a+b+ c 2 s = (aquí a, b, y c son las longitudes de cada una de las tres aristas del triángulo) Respuesta // se hace como una función que devuelve el área: float Area( MallaTVT * m ) { float area = 0.0 ; // recorremos todas las caras for( unsigned i = 0 ; i < m->caras.size() ; i++ ) { // recuperamos las posiciones en WC de los tres vértices Tupla3f v0 = m->vertices[m->caras[i][0]], v1 = m->vertices[m->caras[i][1]], v2 = m->vertices[m->caras[i][2]]; // calculamos a,b,c,s float a = (v1-v0).longitud(), b = (v2-v0).longitud(), b = (v1-v2).longitud(), s = 0.5*(a+b+c) ; // sumamos área del triángulo al área total area += sqrt( s*(s-a)*(s-b)*(s-c) ) ; } return area ; } 3. (2.5 puntos) Se quiere texturizar una lata formada por un cilindro con una tapa superior (figura de la derecha) usando una sola imagen (a la izquierda de la figura). Explicar mediante un código en C cómo se han de asignar las coordenadas de textura a los vértices del objeto (superficie lateral y tapa superior) durante la generación de la tabla de vértices por revolución, usando N copias de un perfil formado por dos puntos: P1=(r,0,0) y P2=(r,h,0) (siendo r el radio de la lata, y h su altura). Las coordenadas de textura están en el rango 0-1. Se ha visualizado una cuadrícula de tamaño 4x4 sobre ella. No es necesario indicar como se crean las caras, solo los vértices. Respuesta // asumimos que 'n' es una constante con el número de copias del perfil // que queremos crear (sin incluir la ultima). Se crea solo la tapa de arriba. // asumimos que 'h' y 'r' son constantes reales predefinidas std::vector<Tupla3f> ver ; std::vector<Tupla2f> cct ; // tabla de posiciones de vértices // tabla de coordenadas de textura for( unsigned { float f = a = c = x = // // // // i = 0 ; i <= n ; i++ ) float(i)/float(n), 2.0*M_PI*f, cos(a), s = sin(alpha), r*c, z = r*s ; // añadir los tres vértices a ver.push_back( Tupla3f( x, 0, ver.push_back( Tupla3f( x, h, ver.push_back( Tupla3f( x, h, // insertar las coords. cct.push_back( Tupla2f( cct.push_back( Tupla2f( cct.push_back( Tupla2f( 'ver' z ) ); z ) ); z ) ); fracción de perfiles ya calculados ángulo del perfil (radianes) seno y coseno del 'a' coordenada x,z de los tres vértices // vértice inferior del cilindro // vértice superior del cilindro // vértice en la tapa (misma pos.) de textura a 'cct' f, 0.0 ) ); // vértice inferior del cilindro f, 0.5 ) ); // vértice superior del cilindro 0.25+0.25*c, 0.75+0.25*s ) ); // vértice en la tapa } // insertamos vértice en el centro de la tapa superior al final verts.push_back( Tupla3f( 0.0, h, 0.0 ) ); cct.push_back( Tupla2f( 0.25, 0.75 ) ); 4. (2.5 puntos). Supongamos que disponemos de los siguientes dos primitivas geométricas 3D: • • • Cilindro, sin tapas, de altura y radio unidad, con la base apoyada en el plano XZ y con el centro de la base en el origen de coordenadas. Disco: disco plano de radio unidad, perpendicular al eje Y y con el centro en el origen. Cubo: cubo de lado 2 unidades con centro en el origen. Con estas tres primitivas queremos construir un modelo de coche como en la figura (vemos el perfil, a la izquierda, y el alzado, a la derecha). Tiene cuatro ruedas de radio y ancho unidad, así como dos faros delanteros, de radio y ancho 1/2. El cuerpo está hecho con dos paralelepípedos (el inferior mide 8 x 2 x 4 unidades en X,Y, y Z, respectivamente, y el superior mide 4 x 2 x 4 unidades). Como producto de los movimientos del volante, las dos ruedas delanteras giran cada una en torno a un eje vertical (líneas verticales a rayas de la figura), de forma que el ángulo de rotación será cero en reposo (como en la figura). A este ángulo lo llamamos ang_giro, y es igual para ambas ruedas. Además, para que el coche pueda rodar, las cuatro ruedas giran sobre los ejes delantero y trasero del coche (línea a rayas horizontal), de forma solidaria (todas por igual), según un ángulo (que llamamos ang_rodar.) 4.a. (1.25 punto) dibuja el grafo de escena parametrizado correspondiente al modelo jerárquico del coche (hay dos grados de libertad: los valores de ang_giro y de ang_rodar). 4.b. (1.25 punto) escribe la función que, invocando a las transformaciones geométricas adecuadas y las funciones de dibujado del cilindro, disco y cubo, pinte el coche. Dicha función o método se declara de esta forma: void dibujaCoche( float ang_giro, float ang_rodar ) ; Respuesta: Coche( rodar, giro ): CuerpoSup CuerpoInf Faros ParRuedas( rodar, 0 ) Tra[ 6, 0, 0 ] ParRuedas( rodar, giro ) CuerpoSup Tra[ 4, 4, 3 ] Esc[ 2, 1, 2 ] Cubo CuerpoInf Tra[ 4, 2, 3 ] Esc[ 4, 1, 2 ] Cubo Faros: Tra[ 8, 2.5, 1.5 ] Faro Tra[ 0, 0, 3 ] Faro Faro: Rot[ -90o, Z ] Esc[ 1/2, 1/2, 1/2 ] CilindroTapas ParRuedas( rodar, giro ): Rueda( rodar, giro ) Tra[ 0, 0, 5 ] Rueda( rodar, giro ) Rueda( rodar, giro ): Tra[ 1, 1, 1 ] Rot[ giro, Y ] Rot[ -rodar, Z ] Rot[ 90o, X ] CilindroTapas CilindroTapas : Disco Cilindro Tra[ 0, 1, 0 ] Cilindro 1 Septiembre 2012-2013 Ejercicio 3. Describe brevemente para que sirven, en un programa OpenGL/glut, cada una de estas cuatro funciones: a) glutDisplayFunc(funcion); Esta función se llamará cada vez que se dibuje la ventana. b) glutReshapeFunc(funcion); Función de control del cambio de tamaño de la ventana de visualización. c) glutKeyboardFunc(funcion); Función de control de eventos con el teclado. d) glutSpecialFunc(funcion); Función de control de eventos con el teclado para cuando se ha pulsado una tecla especial. 2 Septiembre 2014 Ejercicio 1. Considera una malla de n triángulos almacenada en memoria con un vector caras (con n entradas), de forma que caras[i][j] es un entero, en concreto el índice del vértice número j de la cara número i (con 0 <= i <= n y 0 <= j < 3). 1. Con esta definición, escribe el código de una función con esta declaración: bool comparten_vertice(int c1, int c2); que devuelve true cuando las caras número c1 y c2 comparten un vértice (devuelve false si esto no es así). bool comparten_vertice(int c1, int c2){ const int NUMERO_VERTICES = 3; bool comparten_vertice = false; for (int j = 0; j < NUMERO_VERTICES && !comparten_vertice; ++j){ for (int k = 0; k < NUMERO_VERTICES && !comparten_vertice; ++k){ if (caras[c1][j] == caras[c2][k]) comparten_vertice = true; } } return comparten_vertice; } 1 2. Escribe el código de otra función: bool comparten_aristas(int c1, int c2); que devuelve true cuando las caras número c1 y c2 comparten una arista (devuelve false si esto no es así). bool comparten_arista(int c1, int c2){ const int NUMERO_VERTICES = 3; bool comparten_arista = false; bool comparten_vertice = comparten_vertice(c1, c2); int vertice_a; int vertice_b; vertice_a = -1; vertice_b = -1; if (comparten_vertice){ for (int j = 0; j < NUMERO_VERTICES && !comparten_arista; ++j){ for (int k = 0; k < NUMERO_VERTICES && !comparten_arista; ++k){ if ( caras[c1][j] == caras[c2][k] && vertice_a == vertice_b ) vertice_a = caras[c1][j]; else if ( caras[c1][j] == caras[c2][k] && vertice_a != vertice_b ) comparten_arista = true; } } } return comparten_arista; } 2