Skip to content

Davacas/Visualizador-Archivos-OBJ

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 

Repository files navigation

Visualizador de archivos Wavefront .obj

Descripción General

El programa carga cualquier archivo Wavefront .obj cuya maya esté triangulada y tenga normales, le aplica una textura tipo checker, renderiza el modelo y lo despliega en una ventana del gestor X con un par de luces predeterminadas. Además, permite rotar el modelo sobre los ejes X y Y (en coordenadas de plano de proyección), así como desplazar la cámara por el mundo.

No se utilizó ninguna biblioteca de gráficos. Sólo utiliza las bibliotecas Eigen y X11.

A continuación, se muestra un ejemplo de render generado con el programa.

Render del conejo de Stanford.

En la carpeta "renders" de este repositorio se encuentran algunos de los renders de diferentes archivos, generados con este programa.

Código fuente y bibliotecas externas

El programa se escribió en C++ sobre Ubuntu 18.04 y sólo requiere de las bibliotecas de desarrollo de X11 y de la biblioteca para operaciones de álgebra lineal Eigen. No utiliza ninguna biblioteca de gráficos.

En Ubuntu (y probablemente en otras distribuciones Debian) se pueden descargar e instalar las bibliotecas de desarrollo de X11 mediante el comando de consola:

sudo apt install libx11-dev

La última versión estable de Eigen se puede descargar de: https://gitlab.com/libeigen/eigen/-/archive/3.3.7/eigen-3.3.7.zip. Una vez descargada, se puede descomprimir y colocar en cualquier carpeta.

Compilación

Para compilar el programa utilizando GCC, se debe incluir Eigen utilizando la bandera -I y ligar la biblioteca de X11 con la bandera -l. Adicionalmente, se recomienda utilizar la opción de optimización de código de GCC -O3 para reducir los tiempos de renderizado, aunque aumenta el tiempo de compilación y el tamaño del ejecutable. El comando completo para compilar es el siguiente:

g++ proyecto1.cpp -o proyecto1 -I/path/to/eigen/ -lX11 -O3

Ejecución

El programa recibe como argumento por consola el nombre del archivo con extensión .obj que se desea renderizar. Si no lo recibe o es incorrecto, termina automáticamente.

Instrucciones de uso

Una vez que el programa inicia, se indica en la consola que se está cargando el modelo. Este proceso puede tardar dependiendo de la complejidad del mismo.

Posteriormente, aparecerá en la consola el mensaje “Renderizando.” y un porcentaje de progreso en el render. Además se podrá ver en la ventana desplegada cómo se va dibujando el modelo cara por cara. Si no aparece nada coherente, puede que la cámara no esté viendo el modelo o que esté dentro de él.

Una vez que el renderizado haya terminado, se puede interactuar con el modelo y la cámara usando las teclas como se muestra en la siguiente tabla:

Tecla(s) Función
W y S Mover la cámara 0.5 unidades sobre el eje Y+ y Y-, respectivamente.
A y D Mover la cámara 0.5 unidades sobre el eje X+ y Y-, respectivamente.
A y D Mover la cámara 0.5 unidades sobre el eje X+ y Y-, respectivamente.
Q y E Mover la cámara 0.5 unidades sobre el eje Z+ y Z-, respectivamente.
I, J, K y L Rotar el modelo 10° sobre los ejes X+, Y+, X- o Y-, respectivamente.
ESC Terminar el programa.
Otra Cualquier otra tecla muestra estas instrucciones en la consola.

Una vez que se aplica una transformación sobre la cámara o sobre el modelo, se notifica la transformación realizada en la consola y se renderiza nuevamente el modelo, considerando dicha transformación. Cabe notar que cualquier interacción que se haga durante el proceso de renderizado se almacena en un buffer y se ejecutará una vez terminado el último render, por lo que recomiendo esperar a que termine el proceso de renderizado para interactuar nuevamente con el programa.

Flujo detallado de la implementación

El programa renderiza cualquier archivo Wavefront .obj cuya maya esté triangulada y contenga normales. Para ello, me basé bastante en los tutoriales de Scratchapixel 2.0, en particular en la lección “Rasterization: a Practical Implementation” disponible en esta liga.

Para cargar los modelos, se escribió desde cero un procesador de archivos Wavefront .obj, el cual genera un vector que contiene todas los atributos de cada cara.

Posteriormente, ese vector se pasa a la función de renderizado, la cual despliega las imágenes utilizando el proceso de rasterización descrito en el tutorial de Scratchapixel 2.0 anteriormente mencionado.

Para la iluminación se asumen dos luces: una roja en la esquina superior izquierda del modelo y una azul en la esquina superior derecha del modelo. Estas luces permanecen estáticas, independientemente de las transformaciones que se apliquen al modelo.

Para el sombreado, se utilizó el modelo de iluminación de Phong. Sin embargo, para que funcione correctamente, el archivo .obj debe contener las normales suavizadas.

Para el texturizado, el programa ignora las UVs incluidas en el .obj y genera sus propias utilizando un mapeo esférico sobre el modelo. Sobre ellas se aplica el patrón de checker.

Finalmente, el resultado se despliega en una ventana del gestor de ventanas X, donde se puede desplazar la cámara virtual sobre cualquiera de los tres ejes y rotar el modelo sobre los ejes X y Y en coordenadas de plano de proyección, lo cual permite visualizar el modelo desde diferentes perspectivas.

Releases

No releases published

Packages

No packages published

Languages