Enfocando el Problema

por Malefico



Vamos a ver qué es el efecto de "Profundidad de Campo" o "Depth of Field" (DoF) y cómo podemos simularlo con Blender. O algo así.

Cuestiones Profundas

El DoF es un efecto muy común en fotografía, consiste en la pérdida de nitidez de los objetos a medida que se alejan de la zona de foco. Objetos muy cercanos o muy lejanos a la cámara aparecen en las fotografías como "borrosos". Esto es particularmente visible en las fotografías de objetos muy pequeños, donde un pequeño desplazamiento del foco puede arruinar la fotografía.

En las imágenes generadas por computadora esto no ocurre, por lo que una forma de darle "realismo" a las mismas es tratar de imitar el efecto DoF (es decir, arruinar la imágen). Blender no posee ninguna opción para hacer esto aunque veremos sí es posible hacerlo echando mano a algunas técnicas muy astutas.

Las técnicas que describiremos son:

Casi todas estas técnicas pueden emplearse tanto para el uso en animaciones como en imagenes estáticas. La preferida por nosotros dependerá casi siempre del proyecto en cuestión, algunas se adaptan mejor a determinadas circunstancias que otras.

Con Z de Z-Buffer

El Z-Blur de Strubi es un plugin que hace uso del Z-Buffer de Blender y fue escrito por Strubi un conocido "blenderhead" autor de varios plugins. El código fuente puede bajarse gratuitamente de http://honk.physik.uni-konstanz.de/~strubi/3d/ (donde hay instrucciones mas claras que estas tambien ;) ) o de la página de Blender (sección "Resources"). Para windows ya viene compilado como zblur.dll, los linuxeros deberemos compilarlo por nuestra cuenta. Es un plugin para el "Sequencer Editor" que alguno de ustedes conocerá.

Para utilizarlo en nuestra escena deberemos entrar pues en el sequence editor de Blender (el botoncito con el icono de una película) e insertar nuestra escena con SHIFT+A --> SCENE --> 1 (o como se llame la escena). Ubiquemos la escena donde nos plazca aunque el mejor lugar será en el frame 1. Ahora cargamos el plugin con la secuencia SHIFT+A --> PLUGIN --> "ruta a zblur.so o zblur.dll". Una barra aparecerá encima exactamente de la que representa nuestra escena.

Y ahora qué ?, Bueno si ahora seleccionamos el objeto creado y pusamos "N" aparecerán las opciones del plugin que se ven así:

ZBlur Plugin

Antes de adentrarnos en su uso deberemos entender las opciones. El ZBlur colabora estrechamente con el parámetro ClipSta de nuestra cámara (revisen el tutorial al respecto). Este valor conjuntamente con el parámetro Zmin del plugin establecen donde comienza la zona de máximo "borroneo" más cercana a la cámara. De esta manera si nuestro ClipSta es muy pequeño (normalmente 0.10) no se verá nada "fuera de foco" hasta la distancia relativa indicada por "Focus" en el plugin. Ideal para imagenes con "fondo borroso" pero frente nítido. Si por el contrario ClipSta es un número mayor digamos 1.2, existirá una zona borrosa al frente, entre la cámara y la zona enfocada.
Sin embargo existe el problema que si aumentamos mucho el ClipSta se pierda parte de la imágen al no ser renderizada la zona cercana a la cámara. Deberemos entonces jugar con el parámetro Lens y el ClipSta de forma de conseguir un ClipSta lo más alto posible sin que se pierdan los objetos que queremos renderizar. Se entiende ?, bueno ya lo entenderán con la práctica.

Los parámetros mas importantes del plugin son Focus y ZMin.
Focus, como ya dijimos establece la distancia relativa donde se hace "foco". Esta distancia relativa se calcula considerando el rango del ZBuffer, es decir que va desde 0 que es donde está la cámara a 1 que es donde ya no se ve de lejos.
Zmin es la distancia relativa donde deberá empezar el borroneado. Este valor dará distintos resutados dependiendo del valor de ClipSta, lograndose borroneados más intensos o más ligeros. Cuando ClipSta no pueda ser aumentado por el problema descrito lineas arriba, será útil aumentar Zmin para lograr una zona "borrosa" mayor sin variar ClipSta. Sin embargo Zmin no podrá ser mayor que Focus en cuyo caso obtendremos una imágen roja al renderizar (original como mensaje de error, no creen ?)

Para ver esto más graficamente veamos algunos ejemplos. He preparado una escena de experimentación. La escena sin DoF se ve así:

sin DoF

Ahora si cargamos la escena en el sequence editor y ajustamos los parametros del plugin segun se ve, obtendremos cosas como estas:

ZMin=0.75 Focus=0.1ZMin=0 Focus=0.1

Zmin = 0.75
Focus = 0.1

Zmin = 0
Focus = 0.1

ZMin=0.75 Focus=0.8ZMin=0 Focus=0.1

Zmin = 0.75
Focus = 0.8

Zmin = 0.75
Focus = 0.8
ClipSta menor, la hace menos borrosa cerca de la cámara.

La intensidad del "borroneado" en toda la imágen puede regularse con el parámetro BlurSize. A mayor valor, mayor será la intensidad o "pérdida de foco".

Cuando rendericemos no debemos olvidar tener activa la opción "Do Sequence" en Blender o el efecto del plugin no se verá.

Strubi sugiere una técnica para determinar los valores correctos de Focus y Zmin y es empleando la opción "Autofocus" del plugin. Cuando se activa esta opción, el foco queda "clavado" y uno puede controlarlo moviendo un empty previamente emparentado a la cámara mediante un "Make Track" (CTRL+T). Así al mover el empty a la posición que queramos la cámara seguirá su movimiento y el foco se establecerá en el punto central del empty. Si arrancamos Blender desde una terminal podremos ver el valor de Focus empleado, ya que el plugin lo envía por la salida estándar. Esto es útil para determinar el valor de Focus al tanteo y luego ingresarlo manualmente. Otra técnica que Strubi sugiere para conocer la amplitud del ZBuffer (y por lo tanto conocer el rango de DoF disponible) es empleando la opción IPO-Focus que nos permite asignar una curva IPO a lo largo del ZBuffer. En el eje Y de la curva IPO se mapea el rango completo normalizado del ZBuffer o Foco (desde 0 a 1) y en el eje X se normaliza de 1 a 100 la duración de la animación.

Aunque Strubi se empecina en declarar que el plugin no ofrece resultado realistas en todas las situaciones, en mi experiencia personal funciona bastante bien.
Una ventaja que tiene este método es que es rápido y compacto en su uso, la única desventaja es que deberemos aprender a usar el sequence editor y a manejarnos con el. Por ejemplo, para ver un cambio efectuado en el plugin debemos "limpiar" (botón "Clear") el ZBuffer entre renders porque de lo contrario veremos la información "antigua".

El viejo truco de la cámara borracha

Creo que fue Randall Rickert el primero en hablar de este método, no lo sé a ciencia cierta. De cualquier manera, una descripción detallada del mismo escrita por Macke puede leerse en http://www.elysiun.com , un sitio muy bonito por otra parte.

En este método lo que se hace es hacer girar sobre sí misma la cámara manteniendola enfocada en un punto de la escena (el "punto focal"). El giro de la cámara ocurre en un único frame, y la escena se renderiza con la oción "Motion Blur" activada. De esta manera (detalles aparte) se consigue una imágen donde todos los objetos están desenfocados excepto la zona del punto focal.

La preparación de la escena es como sigue:

Una vez hecho esto (seguir el tutorial en Elysiun que es mucho más claro ) ya tenemos un seteo básico para aplicar la técnica. Lo que resta es activa MBLUR en los botones de Render y ver el resultado.

El resultado del render dependerá de varias cosas. Principalmente del tamaño de la curva sobre la que gira nuestra camara, mientras mas grande sea mas "tosco" será el efecto conseguido. No menos importante serán el valor del Buffer de Motion Blur y la forma de la curva IPO asignada.

Aquí se ven algunos ejemplos y los parámetros usados:

Foco adelante, con Bf=0.5, IPO=1:1

Foco atrás. Iguales parámetros que anterior

Foco en el infinito. Bf=2.5

Idem. Bf=5.0 (máximo)

Foco atras, IPO=3:1, Bf=2.5

Idem, IPO=10:1, Bf=2.5

La proporción indicada en IPO es la posición del segundo punto en el orden X, Y. Es decir IPO=3:1 es X=3, Y=1 para el segundo punto de la IPO (el primero siempre es X=0, Y=0). Esto afecta la velocidad de "recorrido" de la cámara produciendo los efectos que se ven.

Esta técnica presenta varias ventajas y desventajas. En primer lugar es la más lenta de todas. Cada cuadro renderizado llevará alrededor de 8 cuadros adicionales renderizados para el Motion Blur, por lo que no es recomendable para animaciones (a no ser que tengan un Pentium 4 de 2 Ghz). Luego es bastante complicado setear los parámetros satisfactoriamente, por lo que se requiere tiempo para "ajustar" las cosas. Es muy fácil lograr una imágen que parece "movida" mas que fuera de foco.
Sin embargo, en lo que respecta a la "verosimilitud" de los resultados es la que más se aproxima al efecto real del DoF. Una vez dominada los resultados pueden ser bastante impresionantes (no busquen ejemplos de esto entre mis imágenes)

Desde el lejano Plutón

Caronte, ha desarrollado una técnica que no requiere plugins ni otras extravagancias giroscópicas como las que hemos visto, aunque requiere otras no menos entretenidas.
La técnica propuesta por nuestro amigo está explicada en su sitio web Caronte's World por lo que me limitaré a explicar someramente su principio de funcionamiento (además con lo que me ha costado entenderlo...).

Lo más eficiente es bajarse el archivo .blend original de Caronte de aquí. Esta es una escena bastante útil que describiremos brevemente:

Consta de un empty (sugestivamente llamado "Focus"), un cubo (llamado "Material Deposit") y una arista que sirve la función de "ajuste focal" llamada "Lenght" actuando sobre el empty. El cubo, posee un material bastante particular con las siguientes texturas en canales sucesivos:

Este material lo llamamos DoF y ya volveremos sobre el más adelante.

¿ Qué se hace con esto para aplicar el DoF a nuestra escena ? Bueno, primero abrimos nuestra escena, la renderizamos y guardamos la imagen como Targa según se dijo. Importamos de la escena original de Caronte (dof.blend) los objetos "Material Deposit", "Focus" y "Lenght" (SHIFT + F1). Al importar el "Material Deposit" lo que nos interesa es haber traído el material DoF a nuestra escena, el cubo no es necesario "per se" y no aparecerá en nuestro render (inclusive puede estar en un layer que desactivemos al momento de renderizar).

Este material DoF lo asignaremos a TODOS los objetos de nuestra escena original seleccionando los objetos de la escena y el cubo (en ese orden) y haciendo CTRL+L->Materials.

Ahora todos los objetos tienen el material DoF aplicado que al tener las texturas Image mapeadas como WIN, se verán en pantalla como si se tratase de un único objeto ya que se mapean con las coordenadas X,Y de la ventana, no diferenciandose las aristas de ninguno de ellos. Además como el material es "Shadeless" se verá con la intensidad de luz original de la imagen y nada más. Para ver qué raro es esto, desactiven el "Shadeless" del material DoF o mejor aún, no asignen este material a todos los objetos y dejen por ejemplo el "suelo" con un material convencional y verán la verdad desenmascarada (o casi).

En esta imagen, el material del piso es el original, las monedas tienen asignado el material DoF "shadeless". La imagen se ha renderizado usando una cámara extra para que se note el mapeo WIN, de haberse hecho con la misma cámara no habria sido posible notarlo (justamente esa es la idea). Observar que el contorno de las monedas actúa como "ventana" mapeada con las coordenadas X,Y de la imagen original.

Esto fue solo un experimento, volvamos a asignar el material DoF a todos los objetos de la escena, ¿ si ?

Ahora vamos a copiar la ubicación y rotación del cubo "Material Deposit" a nuestra cámara (CTRL+C -> Loc y CTRL+C->Rot seleccionando primero el empty y luego la cámara).

Finalmente se ajusta la posición del foco, agrandando la arista "Lenght" hasta la posición deseada. Por la forma en que Caronte ha seteado la escena esto es muy cómodo y simple. La zona focal se puede ampliar escalando el empty "Focus".

Rendericemos nuevamente la escena y disfrutemos los resultados. Veremos que se ha aplicado el efecto DoF según la textura Blend (que se mapea según la coordenada del "Focus"). ¿ No es genial ?.

Foco adelante. Blend tipo Ease
Colourband con interpolación tipo S (Spline)

Foco atrás. Idem anterior.

Cabiamos el Blend a tipo Quad
Colourband tipo E (Ease)

Textura Blur con Filter=15
Blend tipo "Lin"

Esta técnica permite un grado de ajuste y versatilidad bastante amplio, las combinaciones de gradientes y colorbands, junto con el grado de Filter de las texturas Images y el escalado del empty "Focus" nos permite hacer prácticamente cualquier cosa con el DoF. Es muy rápida y se aplica convenientemente a animaciones con la única modificación de asignar un AVI en lugar de un TGA a las texturas Blur y Sharp. En fin , qué les puedo decir, es una monada !

Conclusiones

Hemos cubierto los métodos más importantes de DoF en Blender, esto no pretende ser una explicación detallada de cada uno sino más bien un panorama de posibilidades. ¿Qué metodo es mejor ? dependerá de la situación. Para una imágen estática quizás el método de Spinning sea el mejor ya que después de una cuidadosa preparación dará un aspecto más real. Sin embargo tanto ZBlur como Caronte darán resultados más que aceptables y con un tiempo mucho menor haciendolas mis favoritas. Por eso para una animación habrá que decantarse por estos dos últimos métodos casi exclusivamente. Ambas técnicas sin embargo podrán "fallar" en algunas situaciones si el paladar del usuario es muy exquisito. En cualquier caso el defecto que pueda observarse pasará practicamente desapercibido para la mayoría de los mortales.

Un último consejo. El DoF es un efecto. NO es lo principal de una imágen. Para lograr una imágen "realista" es fundamental usar los efectos y tecnicas pero sin ABUSAR de ellas, recuerden que una textura mal preparada no la corregirá ningún DoF.

Así que ya ven, tienen las opciones aquí, elijan la que mejor les convenga. Y a blenderear !