|
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
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.
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.
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.
Al observar la imagen resultante verás que efectos sorprendentes se pueden lograr con la esfera celeste.
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 }
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.
|