I always make a digital/electronic xmas card rather than sending out paper ones. I modified my card this year to send a special message out to the settlers!
It was produced using the free POV-Ray raytracer. You can make your own using this file!
// PoVRay 3.7 Scene File
#version 3.7;
global_settings{ assumed_gamma 1.0
radiosity{}
}
background {rgb <0.1,0.1,0.25>*0.25}
#default{ finish{ ambient 0.0 diffuse 0.9 }}
// camera ------------------------------------------------------------------
#declare mclock=clock;
#declare endflyink=1;
#declare starttextk=1.3;
#declare endtextk=18;
#declare maxk=endtextk-starttextk;
#declare flyoutstartk=20;
#declare endk=21;
#declare rotx=1;
#declare roty=-1;
#declare rotz=1;
#declare rotatenum=maxk*(1-cos((mclock-starttextk)*pi/maxk))/2;
camera {perspective angle 50
location <0 , 0 ,-9>
right x*image_width/image_height
look_at <0.0 , 0 , 0.0>
}
// sun ----------------------------------------------------------------------
light_source{< 100,100,-200> color rgb 0.5 }
// sky/snowflakes------------------------------------------------------------------
#declare n=0;
#declare maxn=1000; //default: 1000
#declare R1=seed(0);
#while(n<maxn)
sphere{ <0,0,0>, .07
pigment { colour rgb 1}
finish { diffuse 0 ambient 0 emission 0.75 }
no_shadow
no_radiosity
translate <(rand(R1)+2)*4,3*sin(4*pi*mclock/21),3*cos(4*pi*mclock/21)>
rotate<rand(R1)*360,rand(R1)*360,rand(R1)*360>
}
#declare n=n+1;
#end
//---------------------------------------------------------------------------
//---------------------------- objects in scene ----------------------------
//---------------------------------------------------------------------------
#include "shapes.inc"
#declare edgenum=0.075;
#declare startblock=object{ Round_Box(<-2,-1,-1>,<2,1,1>, edgenum , 1) }
#declare chipsize=1;
#declare chipover=0.01;
#declare cutbox=object{ box{<-chipover,-chipover,-chipover>,<chipsize+chipover,chipsize+chipover,chi psize+chipover>} }
#declare chippiecebox=object{ Round_Box(<-chipsize/2,-chipsize/2,-chipsize/2>,<chipsize/2,chipsize/2,chipsize/2>,0.035,1) }
#declare chipremove=object{cutbox translate 1000}
#declare chiparraysize=16;
#declare chiparray=array[chiparraysize]{
<-2,-1,-1>,<-1,-1,-1>,<0,-1,-1>,<1,-1,-1>,
<-2,0,-1>,<-1,0,-1>,<0,0,-1>,<1,0,-1>,
<-2,-1,0>,<-1,-1,0>,<0,-1,0>,<1,-1,0>,
<-2,0,0>,<-1,0,0>,<0,0,0>,<1,0,0>
}
#macro Sort_Swap_Data(Array, IdxA, IdxB)
#local Tmp = Array[IdxA];
#declare Array[IdxA] = Array[IdxB];
#declare Array[IdxB] = Tmp;
#end
#declare n=0;
#declare R2=seed(1);
#while(n<10000)
Sort_Swap_Data(chiparray, floor(rand(R2)*0.9999999*dimension_size(chiparray, 1)), floor(rand(R2)*0.9999999*dimension_size(chiparray, 1)))
#declare n=n+1;
#end
#declare starttimearray=array[2][chiparraysize]{
{0, 2.5, 4, 4.9, 5.75, 6.5, 7, 7.5, 8.5, 9, 9.75, 11, 12, 13, 14.5, 16}
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
}
#declare n=0;
#while(n<chiparraysize)
#declare starttimearray[1][n]=maxk*(1-cos(starttimearray[0][n]*pi/maxk))/2;
#declare starttimearray[0][n]=starttimearray[0][n]+starttextk;
#if(mclock>=starttimearray[0][n])
#declare currentn=n;
#end
#declare n=n+1;
#end
#if(mclock>=starttimearray[0][0])
#if(mclock>=starttimearray[0][chiparraysize-1])
#declare chipremove=object{box{<-3,-2,-2>,<3,2,2>}}
#else
#declare chipremove=
union{
object{cutbox translate 1000}
#while(currentn>=0)
object{cutbox scale 1 translate chiparray[currentn]}
#declare currentn=currentn-1;
#end
}
#end
#end
#declare mainmat=
material{
texture{
normal{bumps 0.15 scale 0.1}
pigment{ color rgbt <0.65,0.65,1,0.85> }
finish {
emission 0.5
ambient 0.5 // ambient surface reflection color [0.1]
diffuse 0.6 // amount [0.6]
brilliance 1.0 // tightness of diffuse illumination [1.0]
specular 0.99 // amount [0.0]
roughness 0.00005 // (~1.0..0.0005) (dull->highly polished) [0.05]
reflection {
0.25 // minimal reflection value (for variable reflection)
0.6 // reflection amount (maximum for variable reflection)
fresnel on // realistic variable reflection
falloff 1.0 // falloff exponent for variable reflection
exponent 1.0 // influence surface reflection characteristic
}
conserve_energy // more realistic
} // finish
}
interior { ior 1.3 dispersion 1.1}
}
#declare simplemat=
material{
texture{
normal{bumps 0.15 scale 0.1}
pigment{ color rgbt <0.65,0.65,1,0.85> }
finish {
emission 0.5
ambient 0.5 // ambient surface reflection color [0.1]
// (---diffuse lighting---)
diffuse 0.6 // amount [0.6]
brilliance 1.0 // tightness of diffuse illumination [1.0]
specular 0.99 // amount [0.0]
roughness 0.00005 // (~1.0..0.0005) (dull->highly polished) [0.05]
reflection { 0.6 }
} // finish
}
interior { ior 1.3 }//dispersion 1.1}
}
#declare mymat1=
material{texture{
pigment{colour rgb <0.65, 0.65, 1>}
finish{emission 0.5}
}}
#declare thick=0.2;
#declare letscale=0.6;
#declare settlers=
text { ttf "tramp.ttf", "MERRY XMAS", thick/letscale, 0.0
scale letscale translate<-1.9,0.2,0.5> }
#declare letscale=0.76;
#declare xmas= text { ttf "tramp.ttf", "SETTLERS", thick/letscale, 0.0
scale letscale translate<-1.85,-0.6,-0.9> }
object{
merge{
difference{
object{startblock}
object{chipremove}
}// end diff
object{settlers}
object{xmas}
}//end merge
material{mainmat}
#if(clock<endflyink)
translate 6.6*x*(1-clock/endflyink)
#end
#if(clock>=starttextk & clock<=endtextk)
rotate <rotatenum*360*rotx/maxk,rotatenum*360*roty/maxk,rotatenum*360*rotz/maxk>
#end
#if(clock>=flyoutstartk)
translate -x*6.5*(clock-flyoutstartk)/(endk-flyoutstartk)
#end
}
#declare n=0;
#while(n<chiparraysize)
#declare R1=seed(n+10);
#declare exps1=1+1*rand(R1); //speed of pieces
#declare exps1a=1.75; //variation between pieces
#declare exps2=0.8+.08*rand(R1); //speed of centre of mass
#declare exps3=1+1*rand(R1); //speed of rotation of mass
#declare exps4=5+5*rand(R1); //speed of rotation of pieces
#declare expd=2+2*rand(R1); //number of clocks explosion lasts
#declare ntime=starttimearray[0][n];
#declare noffset=starttimearray[1][n];
#declare randdirection=vrotate(vnormalize(chiparray[n]),<noffset*360*rotx/maxk,noffset*360*roty/maxk,noffset*360*rotz/maxk>);
#if(mclock>=ntime & mclock-ntime<=expd)
union{
object{chippiecebox scale 0.5-0.499*(mclock-ntime)/expd rotate <90*rand(R1),90*rand(R1),90*rand(R1)>*(mclock-ntime)*exps4/expd translate <-chipsize/4,-chipsize/4,-chipsize/4>
translate <-chipsize/4,-chipsize/4,-chipsize/4>*(mclock-ntime)*(exps1+exps1a*rand(R1))
}
object{chippiecebox scale 0.5-0.499*(mclock-ntime)/expd rotate <90*rand(R1),90*rand(R1),90*rand(R1)>*(mclock-ntime)*exps4/expd translate < chipsize/4,-chipsize/4,-chipsize/4>
translate < chipsize/4,-chipsize/4,-chipsize/4>*(mclock-ntime)*(exps1+exps1a*rand(R1))
}
object{chippiecebox scale 0.5-0.499*(mclock-ntime)/expd rotate <90*rand(R1),90*rand(R1),90*rand(R1)>*(mclock-ntime)*exps4/expd translate <-chipsize/4, chipsize/4,-chipsize/4>
translate <-chipsize/4, chipsize/4,-chipsize/4>*(mclock-ntime)*(exps1+exps1a*rand(R1))
}
object{chippiecebox scale 0.5-0.499*(mclock-ntime)/expd rotate <90*rand(R1),90*rand(R1),90*rand(R1)>*(mclock-ntime)*exps4/expd translate < chipsize/4, chipsize/4,-chipsize/4>
translate < chipsize/4, chipsize/4,-chipsize/4>*(mclock-ntime)*(exps1+exps1a*rand(R1))
}
object{chippiecebox scale 0.5-0.499*(mclock-ntime)/expd rotate <90*rand(R1),90*rand(R1),90*rand(R1)>*(mclock-ntime)*exps4/expd translate <-chipsize/4,-chipsize/4, chipsize/4>
translate <-chipsize/4,-chipsize/4, chipsize/4>*(mclock-ntime)*(exps1+exps1a*rand(R1))
}
object{chippiecebox scale 0.5-0.499*(mclock-ntime)/expd rotate <90*rand(R1),90*rand(R1),90*rand(R1)>*(mclock-ntime)*exps4/expd translate < chipsize/4,-chipsize/4, chipsize/4>
translate < chipsize/4,-chipsize/4, chipsize/4>*(mclock-ntime)*(exps1+exps1a*rand(R1))
}
object{chippiecebox scale 0.5-0.499*(mclock-ntime)/expd rotate <90*rand(R1),90*rand(R1),90*rand(R1)>*(mclock-ntime)*exps4/expd translate <-chipsize/4, chipsize/4, chipsize/4>
translate <-chipsize/4, chipsize/4, chipsize/4>*(mclock-ntime)*(exps1+exps1a*rand(R1))
}
object{chippiecebox scale 0.5-0.499*(mclock-ntime)/expd rotate <90*rand(R1),90*rand(R1),90*rand(R1)>*(mclock-ntime)*exps4/expd translate < chipsize/4, chipsize/4, chipsize/4>
translate < chipsize/4, chipsize/4, chipsize/4>*(mclock-ntime)*(exps1+exps1a*rand(R1))
}
material{mymat1}
translate <chipsize/2,chipsize/2,chipsize/2>+chiparray[n]
rotate<noffset*360*rotx/maxk,noffset*360*roty/maxk,noffset*360*rotz/maxk>
translate randdirection*(mclock-ntime)*exps2
}
#end //end if
#declare n=n+1;
#end //end while