3.11.2  La esfera celeste (sky sphere)

La esfera celeste (sky_sphere) puede ser utilizada para crear fácilmente un cielo cubierto de nubes, un cielo estrellado o cualquier tipo de cielo que tengas en mente.

En los siguientes ejemplos, comenzaremos con una esfera celeste bastante simple que se volverá cada vez más compleja a medida que le agreguemos más características

3.11.2.1  Creando un cielo con un gradiente de colores

Además de la esfera celeste de un solo color que se logra con el color de fondo visto anteriormente, la esfera celeste más simple es la que contiene un gradiente de colores. Puedes haber notado que el color del cielo varía con el ángulo a la normal de la superficie de la tierra. Si miras directamente hacia arriba, generalmente, el cielo tiene un color azul mucho más intenso que en el horizonte.

Queremos duplicar este efecto usando una esfera celeste como se muestra en la siguiente escena (skysph1.pov).

  #include "colors.inc"
  camera {
    location <0, 1, -4>
    look_at <0, 2, 0>
    angle 80
  }
  light_source { <10, 10, -10> White }
  sphere {
    2*y, 1
    pigment { color rgb <1, 1, 1> }
    finish { ambient 0.2 diffuse 0 reflection 0.6 }
  }
  sky_sphere {
    pigment {
      gradient y
      color_map {
        [0 color Red]
        [1 color Blue]
      }
      scale 2
      translate -1
    }
  }

La parte que nos interesa es la sentencia de la esfera celeste. Contiene un pigmento que describe cómo se ve la esfera celeste. Queremos crear un gradiente de color a lo largo del ángulo de la cámara medido con la normal de la superficie de la tierra. Ya que el vector de dirección de rayo es usado para calcular los colores del pigmento, debemos usar un gradiente en el eje y.

Las transformaciones de escalado y translación se utilizan para mapear los puntos que se derivan del vector dirección al lugar correcto. Sin esas transformaciones el patrón se repetiría dos veces en la esfera celeste. La sentencia scale se usa para evitar la repetición y la sentencia translate -1 mueve el color correspondiente al índice cero a la parte inferior de la esfera celeste (ese es el punto de la esfera celeste que verás si miras directamente hacia abajo).

Luego de esta transformación el color de la posición 0 estará en la parte de abajo de la esfera celeste, es decir debajo nuestro, y el color de la posición 1 estará en la parte superior, es decir sobre nosotros.

Los colores de todas las otras posiciones son interpolados entre estos dos colores, como puedes ver en la imagen resultante.

Un simple cielo con gradiente
Un simple cielo con gradiente

Si quieres hacer que un color comience a un ángulo específico, primero debes convertir el ángulo a un índice del mapa de colores. Esto se consigue utilizando la fórmula indice_mapa_color = (1 - cos(ángulo)) / 2, donde el ángulo es medido contra la superficie normal inversa de la tierra. Esto es la normal de superficie que apunta hacia el centro de la tierra. Un ángulo de 0 grados describe el punto debajo nuestro mientras que un ángulo de 180 grados representa el cenit.

En POV-Ray primero debemos convertir el valor de los grados a radianes como se muestra en el siguiente ejemplo.

  sky_sphere {
    pigment {
      gradient y
      color_map {
        [(1-cos(radians( 30)))/2 color Red]
        [(1-cos(radians(120)))/2 color Blue]
      }
      scale 2
      translate -1
    }
  }

Esta escena usa un gradiente que comienza de color rojo a un ángulo de 30 grados y se vuelve azul a un ángulo de 120 grados. Debajo de los 30 grados es todo rojo y por arriba de 120 grados es todo azul.

3.11.2.2  Añadiendo el sol

En el siguiente ejemplo vamos a crear un cielo con un sol rojo rodeado por una aureola roja que se convierte en un azul oscuro de cielo nocturno. Haremos esto usando solamente la esfera celeste.

La esfera celeste que utilizamos se muestra a continuación. También se añadió un plano para lograr un mayor realismo (skysph2.pov).

  sky_sphere {
    pigment {
      gradient y
      color_map {
        [0.000 0.002 color rgb <1.0, 0.2, 0.0>
                     color rgb <1.0, 0.2, 0.0>]
        [0.002 0.200 color rgb <0.8, 0.1, 0.0>
                     color rgb <0.2, 0.2, 0.3>]
      }
      scale 2
      translate -1
    }
    rotate -135*x
  }
  plane {
    y, 0
    pigment { color Green }
    finish { ambient .3 diffuse .7 }
  }

El patrón gradiente y la transformación dentro del pigmento son iguales que en el ejemplo de la sección anterior.

El mapa de colores consta de tres colores. Un rojo fuerte, levemente amarillo que es usado por el sol, un rojo mas oscuro para la aureola y un azul oscuro para el cielo nocturno. El color del sol cubre solo una pequeña parte de la esfera celeste porque no queremos que este sea muy grande. El color es usado en el mapa de colores en los valores 0.000 y 0.002 para obtener un contraste bien marcado a la altura del valor 0.002 (no queremos que el sol se confunda con el cielo). El color rojo mas oscuro que usamos para la aureola se combina con el color azul oscuro del cielo desde el valor 0.002 hasta el 0.200. Todos los valores superiores a 0.200 mostrarán un cielo azul oscuro.

La sentencia rotate -135*x es utilizada para rotar el sol y la esfera celeste completa a su posición final. Si no hacemos esta rotación el sol estaría a 0 grados, o sea justo debajo de nosotros.

Un rojo sol se pone en la noche
Un rojo sol se pone en la noche

Al observar la imagen resultante verás que efectos sorprendentes se pueden lograr con la esfera celeste.

3.11.2.3  Añadiendo unas nubes

Para mejorar aun más nuestra imagen queremos añadir algunas nubes, agregando un segundo pigmento. Este nuevo pigmento utiliza el patrón bozo para crear algunas buenas nubes. Como se encuentra por encima del otro pigmento, necesita algunos colores transparentes en el mapa de colores (mira los ingresos entre 0.5 y 1.0).

  sky_sphere {
    pigment {
      gradient y
      color_map {
        [0.000 0.002 color rgb <1.0, 0.2, 0.0>
                     color rgb <1.0, 0.2, 0.0>]
        [0.002 0.200 color rgb <0.8, 0.1, 0.0>
                     color rgb <0.2, 0.2, 0.3>]
      }
      scale 2
      translate -1
    }
    pigment {
      bozo
      turbulence 0.65
      octaves 6
      omega 0.7
      lambda 2
      color_map {
          [0.0 0.1 color rgb <0.85, 0.85, 0.85>
                   color rgb <0.75, 0.75, 0.75>]
          [0.1 0.5 color rgb <0.75, 0.75, 0.75>
                   color rgbt <1, 1, 1, 1>]
          [0.5 1.0 color rgbt <1, 1, 1, 1>
                   color rgbt <1, 1, 1, 1>]
      }
      scale <0.2, 0.5, 0.2>
    }
    rotate -135*x
  }
Un cielo con nubes en el ocaso
Un cielo con nubes en el ocaso

La esfera celeste tiene un inconveniente, como habrás notado al ver la imagen final (skysph3.pov). El sol no emite luz y las nubes no proyectan ninguna sombra. Si quieres nubes que proyecten sombras tendrás que usar una esfera real, grande, con una textura apropiada y alguna fuente de luz en algún lugar fuera de la esfera.