Bolas de navidad.

Bolas de navidad.


Felices fiestas queridos amigos; Me pareció apropiado por estas fecha felicitar a mis lectores usando un motivo navideño.  Este es un ejemplito muy sencillo pese a lo cual nos va a permitir comentar un par de detalles técnicos que no habíamos comentado con anterioridad.

Formas torneadas (sor):
Es muy fácil de usar. Para el diseño toma un papel cuadriculado y dibuja a lapiz una líneavertical que representará el eje ‘Y’ al rededor del cual deseamos generar la forma.

Dibujo para diseñar un cuerpo de revolución (sor)

Dibujo para diseñar un cuerpo de revolución (sor)

Habrá observado el astuto lector que esto no se parece en nada al estrecho cuello de las bolitas de adorno de la imagen de cabecera. La razón es que al no disponer de papel milimetrado hemos dibujado la forma mucho más ancha para poder precisar las coordenadas de los puntos con mayor comodidad. Luego escalaremos la forma resultante hasta lograr las proporciones idóneas.

#declare Cima = sor { // Cuerpo de revolución
6,
<0,-1>
<11,2>
<7,4>
<5, 6>
<4, 8>
<0,8.2>
translate <0,-4,0>
scale <0.07, 0.24, 0.07>
}

Valores aleatorios (rand):
La función rand() devuelve un valor seudoaleatorio comprendido entre 0 y 1. La secuencia de números que irá generando irá variando dependiendo del valor inicial de la semilla. Nosotros hemos construido una pequeña macro para que devuelva un valor aleatorio comprendido entre un valor mínimo y un valor máximo.La semilla solo se inicializa una vez con un valor arbitrario.

Cada vez que se invoca la macro Bola(RadMin, RadMax), obtendremos una bola diferente en color, brillo, reflejos, etc. ¿Cuantas bolas de navidad diferentes necesitas? pues aquí las tienes todas.

Si se cambia el valor inicial de la semilla, la generación de las bolas tomará valores aleatorios distintos y el resultado de la imagen será diferente porque cada semilla determina una secuencia predeterminada de valores seudoaleatorios.

Los fuentes POV:
Hemos separado los fuentes en dos partes. Un fichero «bolas_navidad.inc» para usar como repositorio de nuestras bolas de navidad, y otro «bolas_navidad.pov». Puede usar nuestro lanzador pov.py para generar la imagen con el comando siguiente:  pov.py bolas_navidad t 11 11

«bolas_navidad.inc»:

// bolas_navidad.inc
// (C) Antonio Castro Snurmacher
// Licencia GPL de GNU

#include "colors.inc"
#include "textures.inc"
#include "shapes.inc"
#include "stones.inc"
#include "metals.inc"

#declare Metal1 = texture {
pigment {White}
finish { ambient 0.2 diffuse 0.45 reflection 0.35 phong 0.7 phong_size 7 }
}

// Conviene evitar que la semilla se redefina varias veces por sucesivas operaciones de include.
#ifndef (R1)
#declare R1 = seed (55556);
#end

#macro Rnd(Min,Max) // Devuelve un valor aleatorio comprendido entre Min y Max
((Max-Min)*rand(R1))+Min;
#end
#declare Chapa = object {
cylinder {<0,0,0>,<0,1,0> 1
translate <0,2.3,0>
scale 0.35
texture { Metal1 }
}
}

#declare Cima = sor { // Cuerpo de revolución
6,
<0,-1>
<11,2>
<7,4>
<5, 6>
<4, 8>
<0,8.2>
translate <0,-4,0>
scale <0.07, 0.24, 0.07>
}

// Bola con un montón de atributos convenientemente aleatorizados
#macro Bola(RadMin, RadMax, Completa)
#local Rad= Rnd(RadMin,RadMax);
#local Pig= pigment { rgb }
#local Diffus= Rnd(0.25, 0.4);
#local Specul=Rnd(0.25, 0.75);
#local Ambient=1-Diffus-Specul;
#local Phong=Rnd(0.8,1);
#local PhongSize=Rnd(1,50);
#local Roughn=Rnd(0, 0.7);
#local Reflect=Rnd(0, 1);
#local Finish= finish {
diffuse Diffus
ambient Ambient
specular Specul
phong Phong
phong_size PhongSize
roughness Roughn
metallic
reflection Reflect
}

union{
#if (Completa)
object {Chapa translate <0,Rad,0> }
object {Cima
scale Rad*.5 // Tamaño proporcional al radio
pigment {Pig}
finish {Finish}
translate <0,Rad,0>
}
#end
object{
sphere{<0,0,0>, Rad}
pigment {Pig}
finish {Finish}
}
}
#end

«demo_bolas_navidad.pov» (Ejemplo de uso de «bolas_navidad.inc»):
// demo_bolas_navidad.pov
// (C) Antonio Castro Snurmacher
// Licencia GPL de GNU

#include "colors.inc"
#include "bolas_navidad.inc"
#declare Luz=light_source { <30, 60, -40> color Gray50 }
#declare MaxR=2;
#declare MinR=1.6;
#declare CameraUp= camera {
location <0, 30, -30>
look_at <0,0,-MaxR>
angle 50
// AspectRatio debe declararse en el '.ini'
// Su valor es el ancho/alto y normalmente valdrá 16/9 o 4/3
right AspectRatio*x
}
#declare EscalaSuelo=8;
#declare Suelo2= plane { y,-2.5
texture {T_Stone21}
scale EscalaSuelo
}

camera {CameraUp}
Luz
Suelo2
// Ahora usaremos dos bucles anidados para repartir las bolas de navidad en el suelo.
#declare ContX=-4;
#while (ContX<=4) #declare ContZ=-3; #while (ContZ<=3) object{ Bola(MinR, MaxR, 1) translate < ContX*2*MaxR, 0, ContZ*2*MaxR>
}
#declare ContZ=ContZ+1;
#end
#declare ContX=ContX+1;
#end