Algunas cosillas de computer graphics

En computer graphics se manejan varios sistemas de referencia para describir los objetos que componen una escena e identificar qué parte de la escena estamos visualizando.

Para describir un objeto en un archivo de texto se puede utilizar un formato de archivo popular como el .obj, .rib o .blen; en general, todos los formatos de archivo para un modelo 3D proporcionan la misma información sobre el objeto (malla poligonal, luces, etc. ) con una sintaxis distinta.

De la variedad de marcos de referencia que se pueden usar para describir cada objeto en la escena, los más importantes son el espacio global, el espacio de la cámara virtual y el espacio de imagen.

Espacio global

Nombre que se le da al espacio vectorial \mathbb{R}^{3} generado por la base {\textbf{x},\textbf{y},\textbf{z} }; todos los objetos, cámaras, luces, etc. en la escena tienen coordenadas en este espacio.

Espacio de la cámara virtual

Representa qué parte de la escena estamos visualizando por medio de un frustum piramidal (la cámara virtual).

525px-ViewFrustum.svg.png

 Viewing frustum (frustum piramidal)

La cámara virtual está basada en una cámara de verdad, especificamente, de acuerdo al modelo de la cámara estenopeica (pinhole camera).

La cámara estenopeica, como se muestra en la imagen, tiene una apertura llamada centro de proyección por donde pasan los rayos de luz y al fondo de la cavidad trasera se forma una imagen invertida.pinholecam.png

Para simular este modelo de cámara hace falta un espacio de referencia distinto al espacio global, que es el espacio de la cámara virtual.

Este sistema de referencia necesita tener el centro de proyección, que simulará la apertura de la cámara estenopeica y también representará dónde estará posicionada la vista junto con su dirección e inclinación.

Su base está formada por

Screenshot_20170422_094139.png

  1. El vector \textbf{v} , que indicó (antes de ser ortonormalizado) la dirección inicial del plano de la parte superior de la cámara virtual.
  2. El vector \textbf{n} que indica la dirección opuesta de la cámara y se usa también para definir el plano de proyección.
  3. El vector \textbf{u} que es calculado con el producto cruz entre \textbf{n} y \textbf{v}

Estos tres vectores forman la base ortonormal de {\textbf{u},\textbf{v},\textbf{n} } en \mathbb{R}^{3} que ayudará a realizar las proyecciones en perspectiva para cuando se quiera realizar un renderizado de la escena.

Espacio de imagen

El plano de proyección está definido por un plano perpendicular a \bf{n} tal que:

\langle \textbf{n} ,  ( \textbf{r} - \textbf{r}_{0} ) \rangle = 0

donde \textbf{r},\textbf{r}_{0} son puntos del plano de proyección y \langle , \rangle es el producto interno euclideano en \mathbb{R}^{n}  .

No obstante, la cámara virtual tendrá problemas con proyecciones de objetos muy cercanas al centro de proyección por una posible división entre cero o problemas de precisión para ordenar los objetos a renderizar de una manera correcta, para eso se define otro plano paralelo al plano de proyección, llamado el plano cercano (near plane) y el plano de proyección lo llamaremos desde ahora el plano lejano (far plane); esto forma el volumen de visualización e introduce unas nuevas variables, la distancia, n, desde el centro de proyección al plano cercano y la distancia, f, al plano lejano.

Screenshot_20170422_174736.png

Volumen de visualización (viewing volume)

La virtual screen/canvas/image plane de la imagen anterior hace referencia a que usaremos el plano en esa posición para realizar el renderizado.

Por simplicidad, manejaremos que la pantalla virtual está en la misma posición que el plano cercano.

nearFar.png

Diferentes posiciones del plano cercano

Nótese que en la imagen anterior se puede simular el acercamiento del objeto cambiando la posición del plano cercano.

A9kJG

Campo de visión (field of view)

La relación de aspecto de la cámara virtual (el campo de visión), puede ser una relación de aspecto horizontal o vertical, depende del programa que se use al renderizar o de la preferencia del usuario y está relacionado con la posición de la virtual screen y la distancia focal.

Screenshot_20170422_220157.pngEn resumen, la cámara virtual tiene:

  • Una posición inicial, el centro de proyección \textbf{C} = ( C_{x},C_{y},C_{z}) (P en la imagen).
  • Un sistema de referencia asociado { \textbf{u},\textbf{v},\textbf{n} } ( el vector \textbf{n} es el vector \textbf{w} en la imagen).
  • Campo de visión (relación de aspecto).
  • Distancia focal que viene de la simulación de la cámara estenopeica.
  • Distancia al plano cercano n.
  • Distancia al plano lejano f.

Estos parámetros y algunos más que definamos para la cámara virtual se pueden especificar de manera explícita (centro de proyección, distancia a los planos, distancia focal) o implícita (por ejemplo, pidiendo la relación de aspecto), también cada estudio cinematográfico o programas para renderizar tienen sus propios valores a usar para su cámara; por ejemplo, en Blender hay una variedad de plantillas a usar para la cámara virtual y parámetros a modificar.

Screenshot_20170422_221127.png

Algunos parámetros a modificar de la cámara virtual en Blender

Nota: Los vídeos fueron generados con mi propio render escrito de cero, sin usar Blender, 3DMax o algún software similar, tampoco usé OpenGL o alguna otra API para modelado 3D.

Todos los ejemplos fueron generados frame por frame a una resolución de 1920×1080 pixeles.

Z-buffer

Es de los algoritmos que tratan el problema de la visibilidad, que es decidir qué elementos están visibles y cuáles ocultos. La clave del Z-buffer está en guardar un buffer extra del tamaño de la imagen en donde se guardan las distancias de la cámara a cada pixel que se ha renderizado. Así, solo basta comparar que la distancia en el Z-buffer sea menor del pixel que se quiere renderizar; distancias más pequeñas implican objetos más cercanos a la cámara y que deben estar visibles.

Si el buffer que se usa tiene una precisión que no baste para diferenciar las distancias guardadas (por ejemplo, en enteros en lugar de flotantes) se da el Z-fighting y, como se nota en el vídeo, a veces no se puede diferenciar qué objeto es el más cercano a la cámara.

Flat Shading

Es una técnica de sombreado que calcula la luz que refleja o qué tan brilloso es cada triángulo del modelo tridimensional y, como todo modelo de iluminación, puede tener una o varias fuentes de luz, además de que sean de diferentes tipos, como la luz de ambiente (constante en toda la escena) o de un punto en particular.

Modelo de Phong

Usa la combinación de la luz ambiente, difusa y especular para dar un resultado más realista y tiene cuatro constantes:

K_s Para el reflejo de la luz del material

K_d Luz difusa

K_a Luz ambiente

\alpha Que maneja qué tan brilloso será el resultado.

Y se calcula por cada fuente de luz con:

2.pngDonde:

\hat{L}_m Es el vector de dirección desde la superficie a la fuente de luz.

\hat{N} Es la normal del triángulo.

\hat{R}_m Que es el vector de dirección que tomaría un rayo completamente reflejado

\hat{V} Que es el vector hacia la dirección del centro de la cámara virual.

La normal usada es una combinación lineal de las normales por vértice, resultando en una transición más suave entre los triángulos que forman el objeto.

phong.gif

Modelo de Gouraud

A diferencia del modelo de Phong, la normal usada es un promedio de la las normales por superficies. Y en el ejemplo también tiene colores aleatorios por cada triángulo.

gourand.gif

Curvas de Bézier

Finalmente, con las curvas de Bézier podemos generar curvas a través puntos de control. Y esto se logra, para empezar, con sacar ecuaciones de la recta de cada par de los puntos de control. A mayores puntos de control, mayor es el grado máximo de la curva que puedes representar.

Bézier_3_big.gif

Curva de Bézier con cuatro puntos de control

El ejemplo tiene cuatro puntos de control y simplemente se están rotando y trasladando hacia la derecha.

 

 

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s