Lenguaje de Programación: C++ GLUTTransformaciones

Documentos relacionados
3.- Vista Tridimensional.

Gràfics per computador

Lenguaje de Programación: C++ GLUT

Tema 4: Viendo en 3D

La matriz de proyección especifica el tamaño y forma del volumen de visualización (0,100,1)

Lenguaje de Programación: C++ GLUTIluminación

Geometría Proyectiva. Héctor Navarro

Transformaciones en OpenGL

El pipeline de visualización es el conjunto de

Lección 8 Vistas y Proyecciones

Transformaciones en OpenGL

Introducción a 3D Transformaciones 3D

Lenguaje de Programación: C++ GLUT (como instalarlo)

Una Aplicación Informática para la Enseñanza de las Transformaciones Geométricas 3D

Laboratorio de Graficación. Garibaldi Pineda García

C =[x 1,y 1,x 2,y 2,...,x n,y n ]

Visualización y Realismo: Problemas Capítulo 2

6.1 Una primera aplicación de los cuaternios: rotación de un cuerpo rígido

Escenarios 3D en OpenGL. Ivan Olmos Pineda

2 Transformaciones en 3D

Tema 1 Introducción. David Vallejo Fernández. Curso 2007/2008. Escuela Superior de Informática

Modeler. Renacido. LightWave 3D. Menú Edit (Edición) 6ta Parte. Pestaña Viewports. Poder Increible Velocidad Sorprendente Valor Sobresaliente

Contenido Semana 2 (Apropiándonos de AutoCAD 3D)

GUÍA NÚMERO 22 TRANSFORMACIONES ISOMÉTRICAS

Es un SW (en forma de librería C) que permite la comunicación entre el programador y el HW de la máquina para el diseño de gráficos.

Departamento de Matemática

Introducción a la Programación Gráfica con OpenGL

Gráficos tridimensionales

Visión artificial y Robótica Geometría. Depto. de Ciencia de la Computación e Inteligencia Artificial

Geometría Computacional. Dr. Antonio Marín Hernández

Manual de usuario MetaTrader 4 TraderNovo:

Gráficos por Computador

Lenguaje de Programación: C++ Arreglos

12Direcciones de internet

Cómo introducir las coordenadas de un punto? Cómo representar gráficamente las coordenadas de un punto? Puntos en el plano

Guía de Ejercicios Sistemas Gráficos

Contenido Semana 1 (Introducción a AutoCAD 3D)

MyOpenLab. Objetos Canvas. Versión Documentación para el usuario. MyOpenLab Objetos Canvas para Animaciones.

1. INTRODUCCIÓN A OPENGL: DIBUJANDO UNA TORTUGA CON OPENGL

Ejercicios de Gráficos Proyecciones

GPU - Procesadores de vértices

EJERCICIOS DE SELECTIVIDAD DE GEOMETRIA

Comenzando a diseñar con el sistema Focus 3D

Blender Overview. Interface, Navigation & Modeling. Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur

MyOpenLab. Versión Manejo de datos en Matrices y Tablas.

Construcción de Sólidos 3D

TUTORIAL DE TORTUGARTE

Imágenes de fondo [background-image] La propiedad CSS background-image se usa para insertar una imagen de fondo.

x-z = 0 x+y+2 = [2012] [EXT-B] Halla el punto simétrico del P(2,1,-5) respecto de la recta r definida por

Visión artificial y Robótica Modelos de movimiento y mapas. Depto. de Ciencia de la Computación e Inteligencia Artificial

Degradados. Aplicación de un relleno degradado. Última modificación 8/6/2011

Elementos esenciales de Word

Lenguaje de Programación: C++ Directivas al preprocesador

UNIDAD DE APRENDIZAJE II

Mini Manual de OpenGL Por Daniel Barrero - 11/6/2002

Apuntes de OpenGL y GLUT Cristina Cañero Morales

Mapping de texturas. Víctor Theoktisto

AutoCAD 2D. por Fernando Montaño. FA Universidad ORT

Introducción AutoCAD 3D

Dr. GEO. Versión 10.12

8.1. Traslación de puntos. Investigación: Figuras en movimiento CONDENSADA

Arquitectura básica de los gráficos

Bases Matemáticas para la Educación Primaria. Guía de Estudio. Tema 5: Transformaciones geométricas planas. Orientación espacial

Programación Gráfica II. 7. Diseño de Cámaras.

TECNUNLOGO: UN LOGO EN TRES DIMENSIONES

Introducción a la Programación de Videojuegos y Gráficos

EJERCICIO 26 DE EXCEL

CREAR DIBUJOS CON OPENOFFICE DRAW:

1 Representación por superficies de polígonos

REPRESENTAR FIGURAS Y BUSCAR SIMILITUDES. DOS TRIÁNGULOS ESTÁN UNIDOS POR UN LADO COMPLETO

Funciones GLUT para Eventos y Menús

MODULO 1 INTRODUCCION AL SISTEMA OPERATIVO

Cámara. Práctica Introducción Proyección

2.- (Puntuación máxima 2 puntos). Para cada valor del parámetro real a, se consideran los tres planos siguientes:

WORD. Barra de título Muestra el nombre del documento seguido del nombre del programa.

1. Nueva rejilla de datos

BgInfo v4.16 INTRODUCCIÓN

TUTORIAL 01B: CÁMARAS Y ESTILOS VISUALES

El color es una longitud de onda de luz, visible para el ojo humano

Descomposición de Prisma de Base Triangular en Pirámides Equivalentes.

TEMA 4. TRANSFORMACIONES EN EL PLANO

ANALISIS CINEMATICO DIRECTO E INVERSO

Tema 3: Transformaciones Geométricas

Problema Cinemático Directo

OPENOFFICE IMPRESS. Creación básica de presentaciones digitales

TRANSFORMACIONES ISOMETRICAS

COMANDOS BASICOS DE AUTOCAD

INGRESAR DATOS CON UN CONTROL VISUAL EN JAVA. CLASE JTEXTFIELD Y MÉTODO GETTEXT. EJEMPLOS (CU00928C)

Un dibujo simple con Gimp. . Elegimos un estilo de lápiz fino y pintamos el dibujo que se muestra en la

Transcripción:

UG Lenguaje de Programación: C++ GLUT Universidad de Guanajuato Noviembre 2010 Lenguaje de Programación: C++ GLUT

Como se convierte un vértice en un pixel La cámara desde que visualizaremos el mundo siempre esta colocada en el centro de coordenadas (0, 0, 0) y en vez de mover la cámara moveremos el mundo, es lo mismo mover la cámara hacia atrás que todo el mundo hacia adelante. Otra cuestión importante a tener en cuenta es que la zona que enfoca la cámara es el eje negativo de las z. Al estar enfocando de esta manera nos queda que el eje z positivo va de la pantalla hacia nosotros, el eje positivo de las x va de izquierda a derecha de la pantalla y el eje y positivo va de abajo a arriba en la pantalla. Lenguaje de Programación: C++ GLUT

Right Hand Lenguaje de Programación: C++ GLUT

Proceso de Visualización Un vértice especificado, en el sistema de coordenadas de OpenGL, se le aplican un serie de transformaciones hasta que se convierte en un pixel. Primero de todo se multiplica por la matriz de modelo vista (Modelview Matrix), a continuación se calcula la iluminación sobre el vértice si trabajamos con luces, después se le aplica la matriz de proyección (Projection Matrix) que permite realizar el clipping de los vértices que no son visibles. Una vez tenemos solo los vértices visibles se le aplica la división por la perspectiva (se utiliza el parámetro w para coordenadas homogéneas), por último se transforma a coordenadas ventana mediante la transformación de la ventana (Viewport Transformation). Lenguaje de Programación: C++ GLUT

Proceso de Visualización Coordenadas Vertice (x,y,z,w) Matriz de Punto de Vista Matriz de Proyección Modelview Transformation Projection Transformation Coordenadas de Corte Perspective Division Viewport Transformation Coordenadas Objeto Coordenadas Ojo Coordenadas de Dispositivo Coordenadas de Ventana (x,y) Lenguaje de Programación: C++ GLUT

3D 2D Una vez hemos visto que transformaciones se aplican a un vértice para pasarlo desde coordenadas 3D a un punto en la pantalla veremos que funciones están relacionadas con este proceso, veremos tres apartados: para modificar el punto de vista. Modificar la proyección y el tipo de proyección. Funciones para modificar la zona de la ventana donde debe ir la escena renderizada. Lenguaje de Programación: C++ GLUT

Cada vértice antes de renderizarse se multiplica por una matriz guardada por OpenGL, MODELVIEW MATRIX, esta matriz no obstante la podemos modificar, cargar la identidad o obtener los valores actuales: Funciones existentes: glloadidentity(): Carga la matriz identidad. glmultmatrix{fd}(const TYPE *m): Multiplica por la matriz especificada por el puntero m, hay que tener en cuenta que los valores se encuentran en el siguiente orden: M = m[0] m[4] m[8] m[12] m[1] m[5] m[9] m[13] m[2] m[6] m[10] m[14] m[3] m[7] m[11] m[15] Lenguaje de Programación: C++ GLUT

Funciones existentes gltranslate{fd}(type x, TYPE y, TYPE z): Multiplica por una matriz que traslada el objeto por los valores x, y, z (o mueve el sistema de coordenadas local por los mismos valores). glrotate{fd}(type angle, TYPE x, TYPE y, TYPE z): Multiplica la matriz activa por una matriz que rota un objeto en el sentido de las agujas del reloj sobre el eje que pasa por el origen y a través de el punto (x, y, z). El ángulo se especifica en grados. glscalefd(type x, TYPE y, TYPE z): Multiplica la matriz activa por una matriz que escala por los valores x, y z. Lenguaje de Programación: C++ GLUT

Funciones existentes glulookat(gldouble eyex, GLdouble eyey, GLdouble eyez,gldouble centerx, GLdouble centery, GLdouble centerz,gldouble upx, GLdouble upy, GLdouble upz): Define una matriz de visualización y multiplica por la derecha la matriz activa. El punto desde el que se mira se especifica mediante las variables ejex, ejey, ejez. El punto al que se mira mediante las variables centerx, centery, centerz, y por ultimo upx, upy, upz define cual es la dirección hacia arriba de la cámara. Lenguaje de Programación: C++ GLUT

Cómo hemos visto siempre hacemos referencia a la matriz activa, por qué? Porque como hemos dicho en el punto anterior tenemos dos matrices GL MODELVIEW MATRIX y GL PROJECTION MATRIX, para modificar una u otra debemos seleccionarla como matriz activa, realmente tenemos tres matrices, la tercera es la matriz para modificar las coordenadas de las texturas que veremos en la sesión correspondiente. Para cambiar la matriz activa lo hacemos con la función: glmatrixmode(glenum mode): Especifica que matriz se modificará con las operaciones de matrices, usando el argumento GL MODELVIEW, GL PROJECTION, o GL TEXTURE). Las siguientes transformaciones se aplicarán a la matriz que hayamos seleccionada, como se deduce solo se puede modificar una matriz al mismo tiempo. Por defecto se modifica la matriz de punto de vista (MODELVIEW) y todas contienen José la identidad. Luis Alonzo Velázquez Lenguaje de Programación: C++ GLUT

Las transformaciones del apartado anterior se aplican en la mayoría de los casos a la matriz MODELVIEW (excepto glloadidentity que también se aplica a menudo), ahora veremos las transformaciones que llevan a cabo una proyección de la imagen (se pasa de tener un punto 3D a un punto 2D), estas transformaciones irán casi siempre acompañadas de glloadidentity y en la matriz PROJECTION. La matriz de proyección define el volumen de visualización, este volumen determina como se proyecta un objeto en la pantalla (proyección ortográfica o perspectiva) y define que objetos o partes de estos se eliminan de la imagen final al no ser visibles. Lenguaje de Programación: C++ GLUT

Proyecciones Ortográficas En una proyección ortográfica el volumen de visualización es un paralepípedo rectangular, o de una manera mas informal una caja, en este tipo de proyección la distancia a la cámara no afecta como de grande se ve el objeto. glortho(gldouble left, GLdouble right, GLdouble bottom,gldouble top, GLdouble near, GLdouble far): Multiplica por una matriz de proyección. El paralepípedo viene definido por los puntos (left, bottom, -near) y (right, top, -far), tanto near como far pueden ser valores positivos o negativos. Sin ninguna otra transformación la dirección de proyección es paralela al eje z, y el punto de vista mira hacia la parte negativa del eje z. Lenguaje de Programación: C++ GLUT

Proyecciones Perspectiva El volumen definido por este tipo de proyección es una pirámide truncada, esto hace que los objetos aparezcan más pequeños a medida que se alejan del punto de vista. Para definir este tipo tenemos la siguiente función: glfrustum(gldouble left, GLdouble right, GLdouble bottom,gldouble top, GLdouble near, GLdouble far): Define un volumen de visión tal y como se presenta en la figura, todos los objetos que están mas cerca del plano near o más alejados que far no aparecen en la escena. Lenguaje de Programación: C++ GLUT

Proyecciones Perspectiva gluperspective(gldouble fovy, GLdouble aspect, GLdouble znear,gldouble zfar): Esta función aunque de menor posibilidad que la anterior resulta más intuitiva. El volumen viene definido por el ángulo de visión, variable fovy, en el plano x-z y la relación de aspecto entre ancho y alto (x/y) mediante la variable aspect. Las variables znear y zfar como se deduce define la distancia a la que se encuentran los planos de corte perpendiculares al vector director de la cámara. Una vez más la parte que visualiza es la parte negativa del eje z. Lenguaje de Programación: C++ GLUT

Definición de la ventana de salida El sistema operativo, no OpenGL, se encarga de gestionar las ventanas, una vez aclarado esto veremos como definir la región de la ventana en la que renderizaremos la escena. Por defecto la porción de ventana de salida esta ajustada a toda la region de la ventana de renderización, mediante el comando glviewport se puede reducir a un área de dibujado menor. glviewport(glint x, GLint y, GLsizei width, GLsizei height): Los dos primeros parámetros especifican el punto 2D de la ventana donde empieza el área en que aparecerá la imagen renderizada, los otros dos especifican el tamaño. Esto nos permite renderizar cuatro escenas en una misma ventana. Para ello renderizamos cuatro veces, y en cada una de las renderizaciones especificamos una region de viewport diferente. Lenguaje de Programación: C++ GLUT

Multiplicación de Matrices. consecutivas Como sabemos disponemos de dos matrices de transformaciones que afectan al pixel, la matriz de MODELVIEW y PROJECTION. A cada una de ellas le podemos aplicar las transformaciones que hemos visto anteriormente (cargar identidad, traslación, rotación, escalado, proyección perspectiva,...), estas transformaciones se aplican siempre sobre la matriz activa, que seleccionamos con la instrucción glmatrixmode. El orden con que se aplican estas transformaciones es importante, no es lo mismo aplicar una traslación y posteriormente un rotación que el orden inverso rotación y traslación. El orden en que se aplican las transformaciones en OpenGL es al contrario de lo que parece intuitivo a primera vista. Lenguaje de Programación: C++ GLUT

Ejemplo glloadidentity(); gltranslatef(0.5, 0.5, 1.0); glrotatef(45.0, 1.0, 1.0, 1.0) glbegin(gl_triangle); glvertex3f(0.0, 0.0, 0.0); glvertex3f(1.0, 0.0, 0.0); glvertex3f(0.0, 1.0, 0.0); glend(); Primero carga la matriz identidad, luego multiplica por una matriz de traslación y por ultimo una de rotación. El resultado es que primero rota el triángulo y posteriormente lo traslada, esto es debido a que las multiplicaciones las realiza por el lado derecho: I R T vértice = (I (R (T vértice))) El vértice primero lo multiplica por la matriz T (de traslación) luego por R y finalmente por I. Lenguaje de Programación: C++ GLUT

Lectura La lectura se realiza de abajo arriba, hasta encontrar una función glloadidentity o glloadmatrix. Las transformaciones que haya después de la primitiva de dibujado glbegin - glend no se tienen en cuenta porque la primitiva ya ha sido renderizada. Si deseamos realizar multiplicaciones por la izquierda de una matriz N podemos aplicar el siguiente método: leer la matriz actual M cargar la identidad multiplicar por la nueva transformación N multiplicar por la matriz M En OpenGL seria: GLFloat fmatrizm[16]; glloadmatrixf(fmatrizm); glloadidentity(); glmultmatrixf(fmatrizn), gltranslatef(x, y, z), glscalef(sx, sy, sz) o glrotatef(ang, x, y, z); glmultmatrixf(fmatrizm); Lenguaje de Programación: C++ GLUT

Pila de Matrices En algunos casos nos puede interesar guardar la transformación que tenemos en la matriz activa para posteriormente recuperarla, por ejemplo si deseamos renderizar un coche formado por la carrocería y cuatro ruedas. El coche entero tendrá una transformación para colocarlo en el lugar (traslación + rotación) y cada una de las ruedas tendrá una transformación de rotación y transformación adicional que la colocara en relación al sistema de coordenadas del coche, para no tener que aplicar la misma transformación del coche a cada rueda podemos almacenarla en una pila y posteriormente recuperarla. Nota Disponemos de una pila de matrices para cada una de las matrices existentes: MODELVIEW, PROJECTION y TEXTURE. Lenguaje de Programación: C++ GLUT

Ejemplo glpushmatrix(); // Guardamos la transformacion del mundo gltranslatef(cochex, cochey, cochez); glrotatef(angulo, ejex, ejey, ejez); RenderCarroceria(); glpushmatrix(); // Guardamos la transformacion del coche gltranslatef(rueda1x, rueda1y, rueda1z); glrotatef(angulorueda1, eje1x, eje1y, eje1z); RenderRueda(); glpopmatrix(); // Recuperamos la transformacion del coche glpushmatrix(); gltranslatef(rueda2x, rueda2y, rueda2z); glrotatef(angulorueda2, eje2x, eje2y, eje2z); RenderRueda(); glpopmatrix(); glpushmatrix(); gltranslatef(rueda3x, rueda3y, rueda3z); glrotatef(angulorueda3, eje3x, eje4y, eje3z); RenderRueda(); glpopmatrix(); glpushmatrix(); gltranslatef(rueda4x, rueda4y, rueda4z); glrotatef(angulorueda4, eje4x, eje4y, eje4z); RenderRueda(); glpopmatrix(); glpopmatrix(); // Recuperamos la transformación del mundo Lenguaje de Programación: C++ GLUT

Objetos 3D. Z-Buffer La librería GLUT incorpora unas funciones para generar solidos 3D. Estas funciones siempre renderizan el objeto en el punto (0, 0, 0), será pues trabajo del programador aplicar las transformaciones para colocarlo en la posición y orientación deseado. glutsolidsphere, glutwiresphere glutsolidcube, glutwirecube glutsolidcone, glutwirecone glutsolidtorus, glutwiretorus glutsoliddodecahedron, glutwiredodecahedron glutsolidoctahedron, glutwireoctahedron glutsolidtetrahedron, glutwiretetrahedron glutsolidicosahedron, glutwireicosahedron glutsolidteapot, glutwireteapot Lenguaje de Programación: C++ GLUT

Objetos 3D. Z-Buffer Para cada objeto tenemos dos posibles funciones, solid y wire: Solid: renderización solida del objeto Wire: renderización alambrica del objeto Cuando renderizamos un objeto 3D, ya sea de la librería GLUT o nuestro, tenemos un problema, si renderizamos primero los poĺıgonos próximos a la cámara y posteriormente los más alejados, los últimos en renderizarse se superponen a los anteriores. Necesitamos un algoritmo que haga visibles los poĺıgonos más cercanos y oculte los más alejados. El algoritmo que utiliza OpenGL es Z-Buffer. Lenguaje de Programación: C++ GLUT

Objetos 3D. Z-Buffer Mediante este algoritmo tenemos un buffer adicional que guardamos para cada pixel la distancia entre la cámara y el pixel 3D. Para cada pixel que renderiza comprueba que la distancia del nuevo pixel sea menor que la distancia almacenada en el Z-Buffer, si es así, pasa el test de profundidad y el pixel se renderiza, de lo contrario se rechaza. El pixel que pasa el test de profundidad modifica el buffer de color con su color y el Z-Buffer con la profundidad del mismo. Para que el algoritmo funcione además necesitamos una inicialización del Z-Buffer a la profundidad máxima que se consigue con la llamada glclear(gl DEPTH BUFFER BIT). Lenguaje de Programación: C++ GLUT

Objetos 3D. Z-Buffer El Z-Buffer tiene una precisión 8, 16, 24... bits que nos da menor o mayor precisión cuando tengamos poĺıgonos a distancias similares. Para habilitar y deshabilitar el test de profundidad (Depth Test) tenemos: glenable(gl_depth_test): Habilita el test de profundidad gldisable(gl_depth_test): Deshabilita el test de profundidad Anteriormente hemos descrito la operación de comprobación del test de profundidad como un operación de menor que, el pixel entrante ha de tener menor distancia que el pixel ya existente, esta operación se puede cambiar: gldepthfunc(glenum func): Permite cambiar la operación del test de profundidad entre GL_NEVER, GL_LESS, GL_LEQUAL, GL_EQUAL, GL_GREATER, GL_NOTEQUAL, GL_GEQUAL, GL_ALWAYS. Lenguaje de Programación: C++ GLUT

Programming Principles and Practice Using C++, Bjarne Stroustrup. http://www.codeblocks.org http://www.wxwidgets.org (O Reilly) Practical C Programming (3rd Edition) http://www.cplusplus.com http://es.wikipedia.org/wiki/glut Lenguaje de Programación: C++ GLUT