Sitio Web de Héctor E. Medellín Anaya

Tutorial POV-Ray

En este tutorial vamos a crear una escena simple pero con un acabado realista utilizando el programa POV-Ray.

Lo primero que hay que tener en cuenta es el sistema coordenado que utiliza POV-Ray. El sistema que usa POV-Ray es un sistema de mano izquierda. Esto significa que si orientamos el eje x positivo hacia la derecha y el eje y positivo hacia arriba, el eje z positivo apuntará hacia adentro de la pantalla.

Vamos a definir una primer escena para ubicar el origen de coordenadas y la dirección de los ejes. Para esto definiremos la cámara situada en la posición (0, 20, 15). De esta manera la cámara está sobre el plano y-z. Vamos a mirar hacia el origen de coordenadas. Es necesario poner al menos una fuente de luz y un objeto que visualizar.

camera {location <0, 20, 15> look_at <0, 0, 0>}

background { color <0, 0, .7>}

object {
  light_source {<20, 10, 15> color <1,1,1>}
}

plane { y, 0.0 
  pigment {checker color <1,0,0> color <1,1,0> scale 10 }
  finish{ambient 0.7 diffuse 0.7}
}

Hemos puesto un color de fondo (background) de tono azul, aunque no se aprecia en 3esta figura. Es costumbre poner al plano un patrón de tablero de ajedrez para  poder posicionar los objetos con facilidad. El patrón ha sido escalado con un factor de 10, esto significa que cada cuadro tiene dimensiones de 10x10. También se le ha pueto un acabado (finish) de iluminación ambiente y difusa. La imagen que se obtiene es la siguiente:

Agregamos una esfera en el origen mediante el siguiente código. Le hemos puesto un acabado con brillo mediante la sentencia phong 0.9 phong_size 50 para darle una apariencia un tanto plástica.

sphere { <0, 0, 0>, 5
pigment {color <1,0,0>}
finish{ambient 0.4 diffuse 0.7 phong 0.9 phong_size 50}
}

Ahora veamos como obtener un objeto más interesante. Vamos a tratar de obtener una copa de vino. Para esto, podemos partir de la esfera anterior, transformandola de alguna manera para lograr nuestro objetivo. Lo primero que haremos será escalarla en el eje y para obtener un elipsoide. Modificamos la esfera de la siguiente manera:

sphere { <0, 0, 0>, 5
  pigment {color <1,0,0>}
  finish{ambient 0.4 diffuse 0.7 phong 0.9 phong_size 50}
  scale y*2
}

Tenga en cuenta que la mitad de la esfera se encuentra bajo el plano. La imagen que se obtiene es la siguiente:

Lo siguiente es ahuecar la esfera y recortarla para ver el interior. Estas operaciones la llevamos a cabo definiendo un objeto mediante operaciones de conjuntos (unión, intersección, complemento, etc.). Para ahuecar utilizamos la operación de diferencia (difference) que le resta a un objeto un conjunto de objetos,  en nuestro caso al elipsoide le restamos un elipsoide ligeramente má pequeño y una caja que se extiene de (-5, 6, -5) a (5, 10, 5) para abrir la boca de la copa. Sustituimos el código del elipsoide por el siguiente:

difference {
  sphere { <0, 0, 0>, 5 scale y*2}
  sphere { <0, 0, 0>, 4.9 scale y*2 }
  box { <-5, 6, -5>, <5, 10, 5> }
  pigment {color <1,0,0>}
  finish{ambient 0.4 diffuse 0.7 phong 0.9 phong_size 50}
}

La imagen resultante es la sifguiente:

Es muy conveniente que definamos el objeto copa para poder manipularlo fácilemente. Esto se obtiene mediante la sentencia #declare. Además vamos a agregarle el vástago y la base de la copa. El vástago lo logramos con un cilindro de 10 unidades en y y radio 0.5 unidades. La base la podemos hacer con un cono de una unidad de altura y 5 unidades de radio inferior. Para poner todo en su lugar trasladamos la copa y la ponemos sobre el vástago. Hemops modificado la cámara para ver la copa completa. Note que debemos incluir el nombre del objeto que hemos definido. El código es el siguiemnte:

camera {location <0, 25, 35> look_at <0, 10, 0> }

// Copa
#declare Copa =object{
  union{
   difference {
     sphere { <0, 0, 0>, 5 scale y*2}
     sphere { <0, 0, 0>, 4.9 scale y*2 }
     box { <-5, 6, -5>, <5, 10, 5> }
     translate y*20
   }
   cylinder{ <0, 0, 0>, <0, 10, 0>, 0.5}
   cone { <0, 1, 0>, 0.0, <0, 0.1, 0>, 5.0 }
   pigment {color <1,0,0>}
   finish{ambient 0.4 diffuse 0.7 phong 0.9 phong_size 50}
  }


Copa

La imagen que se obtiene es la siguiente:

Falta darle una textura adecuada para que parezca más real. Incluiremos el archivo de texturas de cristal con la sentencia #include "glass.inc". Una textura con la apariencia adecuada es T_Glass3. Es necesario definir el índice de refracción del material de la copa especificando la propiedad ior del interior. Modificamos el código de la copa a lo siguiente:

camera {location <0, 25, 35> look_at <0, 10, 0> }

// Copa
#declare Copa =object{
  union{
   difference {
     sphere { <0, 0, 0>, 5 scale y*2}
     sphere { <0, 0, 0>, 4.9 scale y*2 }
     box { <-5, 6, -5>, <5, 10, 5> }
     translate y*20
   }
   cylinder{ <0, 0, 0>, <0, 10, 0>, 0.5}
   cone { <0, 1, 0>, 0.0, <0, 0.1, 0>, 5.0 }
   texture {T_Glass3}
   interior { ior 1.5 }
  }


Copa

La imagen resultante es:

Fácilemente podemos incluir más copas en la posición y tamaño que deseemos. Vamos a agregar una copa sobre el plano en posición horizontal. Esto lo logramos con una rotacón alrededor del eje z y trasladandola al lugar que queramos, en el ejemplo la ponemos atrás de la copa original. Agregamos el siguiente código:

object{ 
Copa
rotate z*90
translate <15,5,-5>
}

La imagen resultante es la siguiente:

Para hacer una animación POV define la variable clock que puede ser modificada desde un archivo ".ini". Como ejemplo modificamos la posición de la copa horizontal girándola alrededor del eje y de 0 a 90 grados. Las modificaciones al archivo son las siguientes:

object{ 
Copa
rotate z*90
translate <15,5,-5>
rotate y*90*clock
}

Para hacer la animación se escribe el siguiente código en un archivo ".ini" y se ejecuta en POV con run.

Input_File_Name=tutorial08.pov

Initial_Frame=1
Final_Frame=20
Initial_Clock=0
Final_Clock=1

En este caso el archivo con el reloj es tutorial08.pov. Posteriormente se convierte a un gif animado para visualizar, como se muestra a continuación: