Con los tutoriales de Povray de este Blog estamos haciendo un recorrido que tienen un valor de minicurso. Esta vez volvemos una vez más a la isla Macaula, pero esta vez obtendremos una animación infográfica en 3D que nos permite apreciar la isla desde diferentes perspectivas como si voláramos al rededor de ella.

En la primera visita a mi isla Macaula hablé de ella como escenario de ciencia ficción, haciendo una breve descripción de la misma. En cierto modo es una isla con un pasado misterioso, pero ahora nos centraremos en la reconstrucción infográfica de la misma y tengo una buena noticia para vosotros. Muchos detalles de esta reconstrucción no necesitaremos tratarlos porque han sido utilizados para explicar algunas técnicas de dibujo y/o retoque fotográfico.

La parte más importante sobre como construir un relieve ya la vimos en ¿Cómo modelar un terreno 3D usando Gimp? En este artículo demostré como podemos usar Gimp para lograr un relieve. Hay programas específicos para ello (modeladores de relieve) pero ¿Quién los necesita? (probablemente los profesionales sí lo necesitan). Al final de aquel artículo obtuvimos un resultado. (Fig.Macaula7).

(Fig. Macaula7)

Podría parecer que eso que estamos llamando resultado es la parte derecha de la Fig. Macaula7.

Esa parte derecha es mucho más vistosa por el efecto del sombreado obtenido con el filtro de repujado, pero lo cierto es que solo hemos usado el repujado para visualizar el relieve. El mapa de relieve que usaremos es la imagen de la izquierda donde la altura del relieve en cada punto viene representada por la oscuridad del pixel.

La sentencia del lenguaje de descripción de escenas de Povray que transformará eso en un relieve es height_field. Gracias a ella se puede construir una superficie que viene a ser una especie de mosaico realizado con triángulos.Cada tres píxels obtenemos tres alturas para tres vértices de uno de esos triángulos.

Puedes ver la explicación en http://www.povray.org/documentation/view/3.6.0/279/ Evidentemente el resultado no sería perfecto, pero hay un truco muy interesante que usa Povray para disimular el efecto mosaico. En cualquier trazador de rayos los objetos son meras representaciones matemáticas y podemos aplicar propiedades totalmente inventadas.

La perpendicularidad de una superficie en un punto.

Sabemos que tres puntos que no estén en línea recta  definen perfectamente un único plano. En un plano las direcciones de los rayos perpendiculares a la superficie son paralelas. Eso hace que una tabla plana de color uniforme y expuesta por ejemplo al Sol se vea también con un color uniforme, pero el trazador Povray para evitar que aparezcan mosaicos triangulados define en la superficie de cada triangulo pequeño una condición llamada ‘perpendicularidad’ (también llamada normalidad) que altera el efecto de la luz al incidir en ese punto.

Muchas propiedades de una superficie tales como reflexión, refracción, iluminación Phong, especular y difusa dependen del ángulo entre el rayo de luz y el vector perpendicular a la superficie que es denominado vector normal a la superficie.

Si un punto de una superficie cualquiera tiene asociado un vector de normalidad alterado respecto a lo esperado por su geometría, en lugar de iluminarse de forma previsible lo hará asumiendo que la superficie presenta una inclinación distinta.

De esa forma, gracias a esa propiedad, una superficie plana puede aparentar rugosidad, y una superficie rugosa puede aparentar ser lisa. En el caso de height_field se podrá disimular el mosaico con un suavizado aplicando el atributo smooth.

Esta propiedad también se usa para simular rugosidades en superficies planas y en nuestro caso la usaremos para convertir un mar plano en un mar con un efecto de oleaje.

Pigmentación

El relieve no lo es todo, una isla real tendrá una coloración que vendrá dada por el tipo de sustrato, por la vegetación, etc. Necesitaremos pintar la isla con una imagen que incorpore toda la pigmentación.

Imagen para la pigmentación de la isla Macaula

Imagen para la pigmentación de la isla Macaula

De alguna manera necesitamos pintarla y casualmente (o quizás no),  ya vimos Cómo usar GIMP para pintar usando texturas creadas por nosotros mismos. En realidad para este trabajo lo que hice fue buscar fotos de paisajes caribeños (Macaula está localizada en el caribe) y usar trozos de esas fotos para crear texturas de praderas, bosques, playas, zonas rocosas, etc.

¿Cómo se consiguió la animación?

La animación se consiguió haciendo que la cámara girara al rededor de la isla sin perderla de vista. Al fondo se sitúa un letrero (no hay que desperdiciar la oportunidad de hacer publicidad de este sitio) que girará de forma síncrona. Tanto la isla como la iluminación permanecen inmóviles, por el contrario el mar tiene un movimiento de oleaje.

No vamos a describir la escena entera para no alargar el artículo innecesariamente. Nos concentramos en los elementos más importantes. La cámara  se definió de la siguiente forma:

camera{
 location <0, 1.2, -10>
 look_at  <0, 0, 0>
 right <16/9,0,0> // ** solo para formato panoramico (16:9)
 angle 22
 rotate y*clock
}

Adviertase que la cámara está lejos del punto <0,0,0>  que es donde se encuentra la isla inmovil. Concretamente la cámara se situó en el punto <0,1.2,-10>.  El giro es al rededor del eje Y, así que la cámara se desplazará manteniendo la distancia original a la isla y hemos declarado que siempre se mantenga mirando al punto <0,0,0> que es donde hemos situado la isla.  Al indicar rotate y*clock necesitaremos valores de clock comprendidos entre 1 y 360 para lograr un giro completo. (nosotros haremos un giro completo y un poco más).

Respecto a como funcionan las animaciones en Povray ya habíamos  explicado Povray conceptos básicos de animación, que a su vez necesitaba de conocimientos sobre  Giros, traslaciones, y escalado de objetos en Povray, que igualmente explicamos en su momento.

Tal como dijimos este tutorial en realidad se sustenta en una serie de artículos previos que tratan distintas temáticas. Ahora pasamos a explicar como se ha implementado la isla gracias a la sentencia height_field :

 object {
    height_field {
       png "macaula7.png"
       smooth // suaviza el resultado
       texture {
          pigment { image_map { jpeg "macaula_pigment.jpg"  } }
          finish { phong 0.3 phong_size 10 }
          rotate x*90
       }
    }
    translate <-0.5,-0.5,-0.5> // Esto traslada el centro de la isla a la posición <0,0,0>
    scale <3.5, -0.4, 3.5>
 }

No verás la variable clock en parte alguna de la isla porque está inmovil. La imagen en tonos de grises que define el relieve es «macaula7.png», y la imagen «macaula_pigment.jpg» es la que le dará todo el colorido. Podemos ver como se ha implementado la textura del mar:

#declare AzulOscuro = rgb <0,0.5,0.7> ;
#declare Mar = texture {
pigment { color AzulOscuro }
   normal {
      waves 0.10
      frequency 95.0
      phase  clock*0.06  // (permitiría usar animación del oleaje
   }
   finish {
      ambient 0.1
      diffuse 0.1
      reflection 0.5
      specular 0.3
   }
   scale <15,15,15>
}

La animación del oleaje se ha conseguido haciendo que el valor phase de la sentencia  ‘waves’ varíe en función de la variable clock. Hay sentencias distintas que ofrecen resultados de oleajes diferentes. Esta sentencia es muy apropiada para simular el oleaje del mar. Para lograr un oleaje lento hemos multiplicado el valor de clock (que variará de 1 a 360) por 0.06. Este valor se eligió por el sistema de prueba y error.



<0, 1.2, -10>