Logo Studenta

Generación y Transformación Geométricas en 3D - Transformación de Vista -Transformación de Proyección

¡Este material tiene más páginas!

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

Continuar navegando