Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
COMPUTACIÓN GRÁFICA Y VISUAL Docente: Ing. Edgard Ramirez UNIDAD II COMPUTACIÓN GRÁFICA II ▪ Generación y Transformación Geométrica en 3D. ▪ Transformación de Vista. ▪ Transformación de Proyección. Semana 05 Al término de la sesión, el estudiante genera una escena aplicando transformaciones geométricas en 3D y Transformaciones de Vista y Proyección. Logro de Aprendizaje 2 ¿Cuáles son transformaciones Geométricas? ¿Cuáles son transformaciones Geométricas? Responder en el foro COMPOSICIONES Y TRANSFORMACIONES DE MODELADO Generación y Transformación Geométricas en 3D ❑ Una representación 3D se define por puntos, líneas y planos que la compone. ❑ Nos movemos en un mundo 3D y utilizamos coordenadas cartesianas bajo 3 ejes para representar vértices que definen a nuestra geometría. ❑ Para tener escenas de una representación 3D es necesario hacer cambios en el sistema de coordenadas y este se realiza mediante transformaciones geométricas: Rotación, traslación y escalado. Composiciones y Transformaciones de Modelado Un vértice 3D V=(x,y,z) es representado en OpenGL como una matriz de 4 x 1 columnas. Los métodos para las transformaciones y modelado geométricas de objetos en 3D se extienden de los métodos bidimensionales pero incluyendo la coordenada Z. Las transformaciones geométricas se expresan en forma de matrices homogéneas. La matriz que representa un modelado en 3D debe de ser una matriz de 4 x 4 para incorporar los términos de traslación, rotación o escalado Matriz T o matriz de transformación. Generación y Transformación Geométricas en 3D Composiciones y Transformaciones de Modelado Aplicar esta transformación al vértice V consiste en multiplicar V desde la izquierda por la matriz de transformación. Generación y Transformación Geométricas en 3D Composiciones y Transformaciones de Modelado Ahora, si uno aplica t2 seguido de t1 a un vértice V, entonces V se mapea de la siguiente manera Generación y Transformación Geométricas en 3D Composiciones y Transformaciones de Modelado Ejemplo: La transformación del vértice (x, y, z) mediante la secuencia de código: Generación y Transformación Geométricas en 3D Composiciones y Transformaciones de Modelado La matriz de la composición de dos transformaciones es el producto de sus matrices. Generación y Transformación Geométricas en 3D Composiciones y Transformaciones de Modelado Generalizando, si se aplican sucesivamente las transformaciones tn, tn-1, ..., t1 (en ese orden, tn siendo la primera) a un vértice V, entonces esto se mapea a: t1(t2(…tn(V)…))=M1(M2(…(MnV)…))=(M1M2…Mn)V Con la ayuda de la asociatividad de la multiplicación matricial, donde la matriz Mi corresponde a la transformación ti, 1 <= i <= n. Se ve que la matriz de la composición de transformaciones es precisamente el producto de las matrices correspondientes a las transformaciones individuales. TRANSFORMACIONES 3D Sistemas de Coordenadas ❑ Una escena 3D se define por los puntos, líneas y planos que la compone. ❑ Hace falta un tercer eje, Z, perpendicular al X y al Y. Y X Z 0,0,0 CUBO lado 1 0,1,1 1,1,1 1,0,1 0,0,1 0,1,0 1,1,0 1,0,0 Transformaciones 3-D ❑Son extensiones de las transformaciones en dos dimensione ❑En el caso 2D teníamos inicialmente matrices 2x2, pero eso sólo nos permitía operaciones del tipo: Transformaciones 3-D ❑Por eso pasamos a matrices 3x3, utilizando coordenadas homogéneas. ❑Por tanto, en 3-D, aplicando la misma regla, habrá que pasar a matrices 4x4. Traslación ❑Reposiciona un objeto desplazándolo a las nuevas coordenadas. ❑Cualquier punto P = (x, y, z) puede ser ubicado en P' = (x', y', z') con sumarle tx, ty y tz a x, y y z, de acuerdo a la siguiente expresión: P’ ❑Para trasladar objetos, trasladamos sólo sus vértices y redibujamos. ❑ De forma matricial se representa: Traslación Es decir: P’ = T. P Donde T= Matriz de traslación Escalado con Respecto al Origen ❑La posición del punto se multiplica por una constante positiva, donde se altera el tamaño del objeto. ❑Cualquier punto P = (x, y, z) puede ser escalado multiplicándole el parámetro de estala Sx, Sy y Sz a: x, y y z respectivamente, según la expresión: P’ ❑Representación en forma matricial Escalado con Respecto al Origen Es decir: P’ = T. P Donde T= Matriz de escalamiento Rotación Plana alrededor del eje Z ❑El eje de rotación es paralelo a uno de los ejes principales. ❑El signo del ángulo viene dado por la regla de la mano derecho. ❑El punto al rotar permanece en el plano perpendicular al eje de rotación. ❑La expresión para la rotación en el eje Z es: Rotación Plana alrededor del eje Z ❑En forma matricial: P’ Es decir: P’ = T. P Donde T= Matriz de rotación en el eje Z Rotación Plana alrededor del eje X ❑Para calcular la expresión de rotación alrededor del eje X, intercambiamos las variables. ❑ En forma matricial: P’ P’ Es decir: P’ = T. P Donde T= Matriz de rotación en el eje x Rotación Plana Alrededor del eje Y ❑Para calcular la expresión de rotación alrededor del eje Y, intercambiamos las variables. ❑En forma matricial Es decir: P’ = T. P Donde T= Matriz de rotación en el eje Y PILA DE TRANSFORMACIONES EN OPENGL Pila de Matriz La matriz Modelview, es la más alta de una pila de matriz modelview. OpenGL mantiene tres pilas de matrices diferentes: modelview, proyección y textura. Cada vértice antes de renderizarse se multiplica por una pila de matriz guardada en OpenGL , Esta matriz se denomina modelview, esta matriz no obstante la podemos modificar, cargar la identidad o obtener los valores actuales. El comando es glMatrixMode(mode), determina que pila esta actualmente activa, donde mode es el nombre de la pila: GL_MODELVIEW, GL_PROJECTION o GL_TEXTURE respectivamente. ❑ La pila para las transformaciones geométricas o transformaciones de vista es GL_MODELVIEW, para las transformaciones de proyecciones se denominada GL_PROYECTION y texturas GL_TEXTURE. Por ejemplo si activamos la matriz de transformación geométrica o de vista, sería: glMatrixMode(GL_MODELVIEW); ❑ OpenGL ofrece los siguientes comandos para manejar estas pilas: glLoadIdentity(); Para cargar la matriz identidad, cuando se multiplica la matriz identidad por cualquier otra matriz se obtiene una copia de la segunda matriz. Cuando queramos iniciar una cadena de transformaciones siempre iniciamos con una Matriz Identidad. glPushMatrix( ); Guardamos el estado actual de la matriz, hace una copia de la matriz actual en la pila de la matriz modelview y colocarla encima de la pila; glPopMatrix( ); Recuperamos el estado de la matriz, esta función elimina la matriz superior de la pila de la matriz modelview de modo que la que está debajo se convierte en la actual. ❑ Lo primero que debemos hacer es inicializar la matriz GL_MODELVIEW. Esto se hace cargando en ella la matriz identidad que es el elemento neutro de la multiplicación de matrices. Con esto nos aseguramos de “limpiarla” por completo antes de añadir nuevas transformaciones. Pila de Matrices Transformaciones geométricas con OpenGL ❑ Traslación: Imaginemos que queremos pintar un cubo de 10 unidades y que queremos desplazarlo 10 unidades sobre el eje X. El código sería: glTranslatef(10.0, 0.0, 0.0); ❑ Rotación: El ángulo de rotación es siempre un ángulo en sentido en contra de las agujas del reloj y medido en grados. Si por ejemplo quisiéramos rotar 45 grados nuestro cubo sobre el eje x el código sería el siguiente: glRotatef(45.0, 1.0, 0.0, 0.0); ❑ El escalado: No tiene porqué ser uniforme, y podemos expandir por tanto un objeto más en anchura que en altura o profundidad. Un ejemplo que ensancha el tamaño del cubo al doble en el eje X: glScalef( 2.0, 1.0, 1.0 ); -→ glScalef (anchura, altura, profundidad) Las funciones de transformaciones geométricas en OpenGL son: Tipo de proyección ❑Luego de definirla posición y orientación de la cámara (gluLookAt), hay que definirel tipo de “foto” que hace, un poco como si seleccionásemos el objetivo. Esto es lo que nos va a definir la forma del volumen de visualización. ❑La primera elección que tenemos que hacer es si queremos una proyección ortogonal o perspectiva. Dependiendo del tipo de aplicación, utilizaremos una u otra. ❑Para hacer esto, tendremos que hacer una llamada a glMatrixMode(GL_PROJECTION), para indicarle que vamos a modificar esta matriz. A partir de ese momento, todas las funciones de transformación (glRotatef, glTranslatef, glScalef) y las de pila (glPushMatrix y glPopMatrix) se aplican sobre esta matriz. Tipo de proyección ❑ Equivale a definir un volumen de visualización en forma de caja alrededor del eye de la cámara (esto es, podemos ver detrás) Para hacer esto, llamamos a: Proyección ortogonal glOrtho(left, right, bottom, top, near, far) Tipo de proyección ❑ Para conseguir una proyección perspectiva, tenemos la función: left, right, bottom y top definen el tamaño y forma del plano near de proyección, los parámetros near y far ahora cumplir la relación 0 < near < far. Proyección perspectiva glFrustum(left, right, bottom ,top, near, far) Para las funciones glFrustum y gluPerspective, NUNCA poner near <= 0. Los resultados son impredecibles. La imagen obtenida de TORUS sale mucho mayor que la tetera, que está más lejos. Esta es la principal diferencia con la proyección ortogonal, que los rayos proyectivos no son paralelos. PRACTIQUEMOS LAS TRANSFORMACIONES 3D CON OpenGL Crea una escena donde muestre un cubo de 1 unidad de tamaño en cada lado y con uno de sus lados ubicado en el origen de coordenadas. La escena rota en sentido positivo sobre el eje-X si se teclea la flecha izquierda y en sentido negativo si se teclea la flecha derecha. Cuando se teclee la letra ‘e’ la escena debe aumentar. void teclado_normal (unsigned char key, int x, int y){ switch (key){ case 'e’: escala+=0.05; break; } … glutPostRedisplay(); } Llamar desde el main con la subrutina: glutKeyboardFunc(nombre función) void teclado_espacial(int key, int x, int y) { switch (key) { case GLUT_KEY_LEFT: (rotar_x+= 5); break; case GLUT_KEY_RIGHT: (rotar_x-= 5) ; break; case GLUT_KEY_UP: (rotar_y+= 5) ; break; case GLUT_KEY_DOWN: (rotar_y-= 5) ; break; … } glutPostRedisplay(); } Llamar desde el main con la subrutina: glutSpecialFunc(nombre función) Usa las funciones para la llamada de teclado normal y especial: static double escala=0, rotar_x, rotar_y; ❑ ¿Qué aprendí? ❑¿Qué necesito reforzar? ¿Preguntas o dudas? REFERENCIAS BIBLIOGRÁFICAS Benstead, Luke. (2012) Programación de videojuegos con OpenGL. https://upn.vitalsource.com/books/9786074817621. Bosque, Jose. (2007). Introducción a OpenGL. https://elibro-net.eu1.proxy.openathens.net/es/ereader/upnorte/35680?page=2 Donald, Hearn. (2006). Gráficos por computadora con OpenGL: Pearson Educación https://upn.vitalsource.com/books/9786074817621 https://elibro-net.eu1.proxy.openathens.net/es/ereader/upnorte/35680?page=2
Compartir