Construcción de Sólidos 3D Introducción a la Computación Gráfica Andrea Rueda Pontificia Universidad Javeriana Departamento de Ingeniería de Sistemas
Generación de sólidos y objetos 3D: Superficies de polígonos y cuádricas. Geometría Sólida Constructiva. Métodos procedimentales. Modelado basado en la Física.
Representaciones: Malla de alambre. Malla sólida.
Polígonos de construcción: Triángulo. Cuadrilátero.
Polígonos de construcción: Triángulo. Preferido para la construcción de objetos 3D: Todos los vértices contenidos en un sólo plano 3D. Figura convexa.
Representación de objetos 3D: Malla de polígonos: Colección de vértices, aristas y caras que definen la forma de un objeto 3D. Vértice: posición en el espacio, junto con otra información relevante (color, normal, textura). Arista: conexión (línea) entre dos vértices. Cara: conjunto cerrado de aristas: Cara triangular: 3 vértices, 3 aristas. Cara cuadrangular: 4 vértices, 4 aristas.
Representación de objetos 3D: Malla de polígonos: Considerada una grilla sin estructura, o un grafo no dirigido, con propiedades adicionales de geometría, forma y topología. Polígono: conjunto coplanar de caras. Superficie: o grupo de suavizado, conjunto de polígonos contiguos.
Representación de objetos 3D: Malla de polígonos: http://en.wikipedia.org/wiki/polygon_mesh
Superficies cuádricas (ec. de segundo grado): Esfera: Coordenadas cartesianas: x 2 + y 2 +z 2 =r 2 Representación paramétrica: x=r cos φ cosθ, y=r cos φ sin θ, π /2 φ π /2 π θ π z=r sin φ
Superficies cuádricas (ec. de segundo grado): Elipsoide: Coordenadas cartesianas: ( x r x )2 + ( y r y )2 + ( z r z Representación paramétrica: x=r x cos φ cosθ, )2 =1 π /2 φ π /2 y=r y cos φ sin θ, π θ π z=r z sin φ
Superficies cuádricas (ec. de segundo grado): Toro (donut) a base de un círculo: Coordenadas cartesianas: ( x 2 + y 2 r axial ) 2 + z 2 =r 2 Representación paramétrica: x=(r axial +r cos φ)cos θ, y=(r axial +r cos φ)sin θ, π φ π π θ π z=r sin φ
Superficies cuádricas (ec. de segundo grado): Toro (donut) a base de una elipse: Coordenadas cartesianas: ( x 2 + y 2 r axial r y )2 + ( z r z Representación paramétrica: x=(r axial +r y cos φ)cos θ, )2 =1 π φ π y=(r axial +r y cos φ)sin θ, π θ π z=r z sin φ
Superficies cuádricas en OpenGL: Primitivas ya disponibles para dibujo de poliedros en malla de alambre y malla sólida. Primitivas de áreas de relleno (para combinar): GL_POLYGON GL_TRIANGLES GL_TRIANGLE_STRIP GL_TRIANGLE_FAN GL_QUADS GL_QUAD_STRIP
Superficies cuádricas en OpenGL (GLUT): Esfera: void glutsolidsphere(radius, slices, stacks); void glutwiresphere(radius, slices, stacks); radius: radio de la esfera. slices: # de subdivisiones alrededor del eje Z (líneas de longitud). stacks: # de subdivisiones a lo largo del eje Z (líneas de latitud).
Superficies cuádricas en OpenGL (GLUT): Cubo: void glutsolidcube(size); void glutwirecube(size); size: longitud de los lados del cubo.
Superficies cuádricas en OpenGL (GLUT): Cono: void glutsolidcone(base, height, slices, stacks); void glutwirecone(base, height, slices, stacks); base: radio de la base del cono. height: altura del cono. slices: # de subdivisiones alrededor del eje Z. stacks: # de subdivisiones a lo largo del eje Z.
Superficies cuádricas en OpenGL (GLUT): Toro (donut): void glutsolidtorus(innerradius, outerradius, nsides, rings); void glutwiretorus(innerradius, outerradius, nsides, rings); innerradius: radio interno del toro. outerradius: radio externo del toro. nsides: # de lados por cada sección radial. rings: # de divisiones radiales para el toro.
Superficies cuádricas en OpenGL (GLUT): Tetraedro (4-lados): void glutsolidtetrahedron(); void glutwiretetrahedron(); tetraedro centrado en el origen y radio raiz(3).
Superficies cuádricas en OpenGL (GLUT): Octaedro (8-lados): void glutsolidoctahedron(); void glutwireoctahedron(); octaedro centrado en el origen y radio 1.0.
Superficies cuádricas en OpenGL (GLUT): Dodecaedro (12-lados): void glutsoliddodecahedron(); void glutwiredodecahedron(); dodecaedro centrado en el origen y radio raiz(3).
Superficies cuádricas en OpenGL (GLUT): Icosaedro (20-lados): void glutsolidicosahedron(); void glutwireicosahedron(); icosaedro centrado en el origen y radio 1.0.
Superficies cuádricas en OpenGL (GLUT): Tetera: void glutsolidteapot(size); void glutwireteapot(size); size: tamaño relativo de la tetera.
Superficies cuádricas en OpenGL (GLU): Esfera: GLUquadricObj *sphere1 = glunewquadric(); gluquadricdrawstyle (sphere1, GLU_LINE); glusphere (sphere1, r, slices, stacks); sphere1: objeto cuádrico. r: radio de la esfera. slices: # de subdivisiones alrededor del eje Z. stacks: # de subdivisiones a lo largo del eje Z.
Superficies cuádricas en OpenGL (GLU): Cilindro (sirve para cono también): GLUquadricObj *cylind1 = glunewquadric(); gluquadricdrawstyle (cylind1, GLU_LINE); glucylinder (cylind1, rbase, rtop, height, slices, stacks); cylind1: objeto cuádrico. rbase: radio de la base del cilindro. rtop: radio del tope del cilindro. height: altura del cilindro. slices: # de subdivisiones alrededor del eje Z. stacks: # de subdivisiones a lo largo del eje Z.
Superficies cuádricas en OpenGL (GLU): Corona circular plana (disco): GLUquadricObj *disk1 = glunewquadric(); gluquadricdrawstyle (disk1, GLU_LINE); gludisk (disk1, rinner, router, slices, loops); sphere1: objeto cuádrico. rinner: radio interno del disco. router: radio externo del disco. slices: # de subdivisiones alrededor del eje Z. loops: # de círculos concéntricos de subdivisión.
Superficies cuádricas en OpenGL (GLU): Eliminar memoria asignada: gludeletequadric (quadricobject); Modos de visualización: GLU_LINE: líneas. GLU_FILL: áreas rellenas. GLU_SILHOUETTE: líneas (sin aristas comunes). GLU_POINT: conjunto de puntos.
Visualización 3D + Animación
Animación Hasta ahora, sólo hemos generado escenas gráficas estáticas. Incluso con las transformaciones, para verificar cada cambio teníamos que compilar y ejecutar nuevamente. Cómo hacer para que, por ejemplo, podamos aplicar una rotación incremental en el tiempo? y así ver girar un objeto?
Animación Opción 1: utilizar una función que se ejecuta cuando no hay otros eventos (idle function): void idle () { display(); } int main (int argc, char* argv[]) {... glutidlefunc(idle);... glutmainloop(); return 0; }
Animación Opción 1: utilizar una función que se ejecuta cuando no hay otros eventos (idle function): void idle () { glutpostredisplay(); } int main (int argc, char* argv[]) {... glutidlefunc(idle);... glutmainloop(); return 0; }
Animación Opción 1: utilizar una función que se ejecuta cuando no hay otros eventos (idle function). Para hacer la animación más fluida y continua, se requiere habilitar el uso de dos búferes. - Fijar el uso de dos búferes: glutinitdisplaymode(glut_double); - En la función de visualización, reemplazar glflush() por: glutswapbuffers ();
Animación Opción 2: utilizar una función de Timer, la cual se ejecuta cada cierto intervalo de tiempo. Esta opción permite controlar la unidad de tiempo de la animación: void Timer () { glutpostredisplay(); gluttimerfunc(miliseconds, Timer, 0); }
Animación Opción 2: utilizar una función de Timer, la cual se ejecuta a un cierto intervalo (control). int main (int argc, char* argv[]) {... gluttimerfunc(0, Timer, 0);... glutmainloop(); return 0; }
Animación Ejercicio: - Descargar el ejemplo de animación: sophia.javeriana.edu.co/~rueda-andrea/intrcog r/docs/bouncingball.cpp - Analizar su funcionamiento. - Modificar el código para usar un Timer y variar el intervalo de animación entre 1 y 5 segundos. - Modificar el código para introducir profundidad, empujar el círculo hacia el fondo. - Reemplazar el círculo por otra figura.
Animación Ejercicio: - Descargar el ejemplo de rotación 3D: sophia.javeriana.edu.co/~rueda-andrea/intrcog r/docs/rotatingcube.cpp - Analizar su funcionamiento. - Qué pasa con la visualización del cubo? Modificar el código para incluir el test de profundidad. - Reemplazar el cubo por otra figura 3D, y variar los ángulos de rotación.
Animación Ejercicio: Generar un programa en el cual se ubiquen en el espacio 3D un ejemplo de cada uno de los poliedros OpenGL (todos en un mismo espacio, diferentes colores y tamaños, modo de dibujo): www.opengl.org/documentation/specs/glut/spec 3/node80.html Utilizar los ejercicios de animación para poner a rotar todos los elementos alrededor del eje y.
Referencias D. Hearn, M.P. Baker. Gráficos por computadora con OpenGL, 3a edición. Pearson Prentice Hall, 2006. J.D. Foley, A. van Dam, S.K. Feiner, J.F. Hughes. Computer graphics: principles and practice, 2 nd edition in C. Addison- Wesley, 1996. en.wikipedia.org/wiki/polygon_mesh www.glprogramming.com/red/chapter07.html