Infografia: Practica 2, Pipeline gráfica
Última actualización 8/05/2012Introducción
Escribir en C++ para Linux un programa que recibe como entrada un fichero ASCII con una superficie poligonal y permite su visualización 3D (grabando el resultado en una imagen a disco).
“3D Computer Graphics, 3rd edition”, por Alan Watt. Capítulos 5 y 6.
Funciones a implementar
- Lectura de un fichero ASCII con los datos 3D de la superficie poligonal (el formato de este fichero se especifica más abajo).
- Creación de una estructura de datos para almacenar estos polígonos y operar con ellos.
- Transformación de coordenadas del objeto a punto de vista (págs. 143-7).
- Culling o eliminación de caras no vistas (págs. 147-8).
- Transformación de coordenadas a espacio de pantalla 3D (págs. 155-6).
- Shading (págs. 171-182) (debéis especificar al menos una fuente de luz).
- Rasterization (págs. 183-7).
- Z-buffer (sección 6.6.4, págs. 192-3)
Opcionalmente se le pueden añadir funcionalidades al programa: clipping de polígonos que están parcialmente fuera del frustrum (págs. 168-171), interacción (cambio del punto de vista, rotaciones, traslaciones, escalas), cambio de propiedades de los materiales para shading, colores diferentes para objetos diferentes, etc.
Formato del fichero ASCII
Línea 1: <V (número de vértices)> <P (número de polígonos)>
Línea 2: <coordenada x1> <coordenada y1> <coordenada z1>
Línea 3: <coordenada x2> <coordenada y2> <coordenada z2>
…
Línea V+1: <coordenada xN> <coordenada yN> <coordenada zN>
Línea V+2: <número de lados del polígono 1> <1er vértice> <2o vértice> … <último vértice> (ordenados tal que la normal sea saliente)
Línea V+3: <número de lados del polígono 2> <1er vértice> <2o vértice> … <último vértice>
…
Línea V+P+1: <número de lados del polígono P> <1er vértice> <2o vértice> … <último vértice>
Por ejemplo, esta sería la representación de una pirámide de base cuadrada:
5 5
0 0 0
0 1 0
1 1 0
1 0 0
0.5 0.5 1
4 1 2 3 4
3 1 4 5
3 4 3 5
3 3 2 5
3 2 1 5
Código ejemplo
Podéis usar el mismo código de la práctica 1 para trabajar con imágenes.
Entrega
Fecha límite: POR DETERMINAR, 9AM, a través del Aula Global. No se aceptan entregas tardías, no se hacen excepciones.
Defensa
POR DETERMINAR.
Duración: 10-15 minutos por equipo, con preguntas individuales. Todos los integrantes deben estar plenamente familiarizados con el trabajo de su equipo. Esta clase es de asistencia obligatoria.
Se entrega desde el Aula Global
Qué se entrega:
- Informe: introducción, el algoritmo, explicación del código, experimentos, conclusiones. En formatos html, ps, pdf o rtf.
- Código C++, comentado, listo para compilar (con su Makefile si es necesario). Formato: ASCII.
- Las imágenes (cualquier formato) y parámetros (ascii) usados en los experimentos.
- Se deben poder reproducir los experimentos con todos los materiales entregados, en cualquier PC de aulas, en Linux.
- En caso de copia (entre equipos, o de otras fuentes) todos los integrantes de los equipos involucrados suspenderán inmediatamente la asignatura, y el Departament abrirá un expediente solicitando la expulsión temporal de dichos estudiantes.
Consejos
- Leer el artículo con atención.
- Volver a leer el artículo con atención.
- Invertir un buen tiempo en planear el código, no ponerse a programar directamente.
- Hacer código modular: desglosar la tarea global en partes, hacer funciones para estas partes, llamar a las funciones desde un programa principal corto.
- Estudiar el programa C++ de ejemplo, ver qué operaciones con imágenes hay definidas y cómo se acceden y modifican los valores de los pixels.
- Mientras se escribe el código, y para hacer ‘debugging’, hacer pruebas con imágenes pequeñas y sencillas.
- Probar primero con imágenes en escala de grises.