Posicionamiento Básico de la Cámara
Resumen: En este segundo artículo sobre RenderMan nos meteremos en la configuración y posicionamiento de la cámara y veremos los efectos que es capaz de crear. Veremos que, aunque el posicionamiento no es tan intuitivo como en Pov-Ray, tiene la ventaja de que es muy fácil programar trayectorias. Esto lo veremos en el siguiente artículo.
Introducción
En esta segunda entrega veremos con detalle el modelo de cámara de RenderMan. La cámara es uno de los elementos más importantes de un renderizador y con ella se pueden crear los efectos más interesantes como el Motion Blur (¿qué es lo que se ve cuando fotografiamos algo que va muy deprisa?) y el Depth of Field (enfoque y desenfoque). Aunque se podrían haber modelado muchos más efectos como por ejemplo el Lens Flare (el brillo de las luces cuando las fotografiamos), muchos de ellos se consiguen, no modificando el modelo de la cámara (haciéndolo más complejo), sino que se modelan como propiedades de los objetos gracias al avanzado sistema de shaders (shaders entendido como texturas de los objetos) que posee, con el cual podemos crear nuestros propios "sombreadores" y crear efectos bastante impresionantes. El modo en que se programan y compilan estos sombreadores lo veremos en otro artículo, aunque este tema es bastante amplio (muy, muy amplio y además no tengo ni idea y lo tendré que mirar bien). Como explicábamos en el artículo anterior, para renderizar las imágenes debemos poner:
rendrib fichero.rib
salida a fichero
rendrib -d fichero.rib
salida por pantalla.
Posicionamiento básico de la cámara
El sistema de coordenadas de la cámara es "left-handed" y coincide con la superficie del monitor. El origen se sitúa en el centro de la pantalla con el eje x hacia la derecha, el y hacia arriba y el z hacia "dentro". Por defecto, el "sistema de coordenadas actual" coincide con el "sistema de coordenadas de la cámara" tal y como se ve en la primera figura (el eje x es rojo, el y verde y el z azul). La primera imagen es una vista "aérea" de como va a quedar la escena y la segunda es la escena propiamente dicha (las luces no están en el mismo sitio en las dos imágenes para que se vean bien). Aunque la escena no sea especialmente compleja (la verdad es que es bastante horrible) nos servirá para comprender los ficheros RIB de ejemplo sin que nos estorben complicados modelos geométricos.
A continuación probaremos a posicionar la cámara. Lo más lógico, sobre todo si se ha usado Pov-Ray, es mover la cámara. Para ver la escena desde un poco más lejos trasladaríamos la cámara a la posición <0,0,-20>, con este movimiento moveríamos la cámara hacia atrás, vamos a hacer esto con RenderMan, para ello pondremos un Translate 0 0 -20 antes del WorldBegin:
¡La cámara se ha movido hacia delante! En realidad lo que hemos movido no es la cámara, hemos movido el sistema de coordenadas actual hacia detrás, lo que hace que la cámara "avance". Por tanto, para poner la cámara donde queríamos hemos de hacer lo contrario, mover el sistema de coordenadas actual hacia delante (con Translate 0 0 20):
Ahora si que está la cámara donde queríamos. A partir de ahora, toda la geometría que incluyamos en la escena estará referida a esta nueva posición del sistema de coordenadas actual. En el siguiente ejemplo dejaremos el monigote en el origen de coordenadas y moveremos la cámara a su alrededor:
Podemos ver en el fichero RIB las transformaciones que hemos aplicado a la cámara para posicionarla:
Display "camara_default2.tif" "file" "rgb"
Projection "perspective" "fov" 45
Format 320 240 1
LightSource "ambientlight" 1 "intensity"
0.3 "lightcolor" [1 1 1]
LightSource "distantlight" 2 "intensity"
1.0 "from" [10 10 -10] "to" [0 0 0]
Translate 0 0 20
Rotate 45 1 0 0
Rotate 135 0 1 0
WorldBegin
Color 1 1 1
# Background blanco
Sphere 10000 -10000 10000 360
# Objeto de la escena
TransformBegin
Color 1 0 0
Sphere 3 -3 3 360
TransformEnd
TransformBegin
Rotate -90 1 0 0
Translate 0 0 2
Cone 3 3 360
Disk 0 3 360
TransformEnd
TransformBegin
Rotate -90 0 1 0
Cylinder 1 -4 4 360
Disk 4 1 360
Disk -4 1 360
TransformEnd
WorldEnd
Observamos una translación (Translate 0 0 20) y dos rotaciones, una alrededor del eje x (Rotate 45 1 0 0) y otra alrededor del eje y (Rotate 135 0 1 0). Esto puede desconcertar a los usuarios de Pov-Ray ya que en éste las transformaciones se aplican por orden de aparición, sin embargo RenderMan apila las transformaciones hasta que encuentra un token significativo (en nuestro caso el WorldBegin) y entonces las aplica. De todo esto se deduce que las transformaciones hemos de indicárselas al revés, es decir, la última transformación sería la primera en aplicarse. Por tanto nuestro ejemplo debe leerse como:
1. Estado Inicial |
|
2. Rotar el sistema de coordenadas alrededor del eje y 135 grados |
|
3. Rotar el sistema de coordenadas alrededor del eje x 45 grados |
|
4. Desplazar el sistema de coordenadas 20 unidades a lo largo del eje z |
|
Hay que tener en cuenta que todas las transformaciones del sistema de coordenadas actual (rotaciones y translaciones) son relativas al sistema de coordenadas de la cámara, por tanto, una rotación en el eje x se refiere a que la rotación es respecto del eje x de la cámara, no del sistema de coordenadas actual.
A partir de aquí entramos en la parte más interesante ya que nos metemos de lleno con los efectos que se pueden hacer con la cámara de RenderMan.
Motion blur (simulación de objetos móviles)
El primero que veremos es el Motion Blur, es algo así como "movimiento borroso" y es el efecto que se produce cuando fotografiamos algo que se mueve deprisa.
Para que la cámara sea capaz de simular este efecto debemos incluir en el fichero el token Shutter 0 1 (por supuesto en la parte del fichero dedicado a la cámara), con esto definimos el tiempo de exposición de nuestra cámara, en nuestro caso una unidad de tiempo por lo que el objetivo se "abrirá" en el instante 0 y se cerrará en el 1. Este tiempo de exposición lo dejaremos casi siempre con 0 1 ya que, como veremos, solo indica la forma de actuar de RenderMan.
A partir de aquí tenemos que decirle a RenderMan que es lo que se mueve, esto se hace con el par MotionBegin MotionEnd. Como podemos ver en la siguiente figura (y en su fichero RIB), tenemos una pelota que se mueve desde la posición 0 10 5 en el instante 0 a la posición 5 10 0 en el instante 1. MotionBegin [0 1] indica a RenderMan que tiempos se corresponden con las transformaciones (instante 0 la primera e instante 1 la segunda) y los valores deben coincidir con los indicados en la sección Shutter. Como se puede comprobar en el ejemplo el efecto es bastante real y en una animación el efecto es más impactante.
Por supuesto, las transformaciones que podemos incluir dentro de MotionBegin MotionEnd no se limitan a las translaciones, RenderMan es capaz de renderizar trayectorias no lineales con Motion Blur.En el siguiente ejemplo lo que tenemos es una rotación de los ejes 25 grados alrededor de su eje y.
Aunque normalmente lo que se mueve son los objetos de la escena, RenderMan contempla la posibilidad de que sea la cámara la que se mueve, por lo tanto también el efecto de Motion Blur se puede aplicar al movimiento de la cámara. En este ejemplo movemos la cámara 5 unidades a la izquierda (movemos el sistema de coordenadas actual 5 unidades a la derecha), y todos los objetos de la escena están borrosos. Por supuesto el par MotionBegin MotionEnd se encuentra en la parte de la cámara en el fichero RIB:
Depth of field (enfoque y desenfoque)
Otro de los aspectos que nos ofrece RenderMan es la posibilidad del Depth of Field, o lo que es lo mismo, la capacidad de enfocar o desenfocar objetos en la escena. La forma de indicar esto es con DepthOfField. Este token necesita tres parámetros: el primero es f-stop, el segundo fov (field of view o ángulo de visión) y focus-lenght (longitud focal o la distancia a la cual un objeto aparecerá enfocado). f-stop nos indica la distancia a la cual se deja de desenfocar más, en nuestro caso, un objeto que esté a 2 unidades o menos de distancia de la cámara aparecerá igual de desenfocado (o enfocado). El parámetro fov se suele dejar con el valor 1.0 ya que se suele definir antes (con Projection "perspective" "fov" 45 en nuestro ejemplo) y lo que conseguiríamos seria multiplicar el valor anterior por el nuevo. focus-lenght es el parámetro que nos interesa y define la distancia a la que deben estar los objetos para estar enfocados. En el siguiente ejemplo tenemos la cámara en el origen y tres bolas (una alejada 10 unidades, otra 20 y la última 30), veremos como variando focus-lenght enfocamos las diferentes esferas.
En el primer ejemplo tenemos DepthOfField 2.0 1.0 10, lo que quiere decir que los objetos alejados diez unidades de la cámara estarán enfocados (la esfera roja):
A continuación tenemos DepthOfField 2.0 1.0 20. Ahora lo que está enfocado es la esfera verde (ya que está a 20 unidades de la cámara):
Para enfocar la última esfera (la azul que está alejada 30 unidades) debemos poner DepthOfField 2.0 1.0 30:
El efecto que se consigue al aplicar el depth of field da mayor realidad a las imágenes que generamos. Por supuesto el tiempo del rendering aumenta al introducir estos efectos (tanto el Motion Blur como el Depth of Field) ya que se realizan varias pasadas de renderizado.
Texto original en Castellano
|