//============================================================ // // Atmos2.pov // // A scene showing scattering media approximating a dispersive // atmosphere. With clouds, an island and water. // // By Michael Andrews, 13/8/99 // //============================================================ //========================================= // macro mAlign // Adapted from Giles Trans' Maketree.pov //----------------------------------------- // returns a matrix operation that aligns an object or texture along P2-P1 // the object is translated to P1 // translate to P2-P1 if you want the object to be on P2 #macro mAlign(P1,P2) #local yV1=vnormalize(P2-P1); #local xV1=vnormalize(vcross(yV1,z)); #local zV1=vcross(xV1,yV1); matrix #end //----------------------------------------- // end of mAlign macro //========================================= #include "colors.inc" global_settings { assumed_gamma 1.0 max_trace_level 25 } #declare lightDir = vnormalize(<-0.25,3.1,-4>); #declare lightLen = 1.5e8; #declare lightRad = lightLen*sin(radians(0.25)); #declare camPos = <0.0, .15, -.75>; #declare camLookAt = <0,3,20>; #declare camAngle = 60; camera { up <0, 1, 0> right <4/3, 0, 0> location camPos direction <0.0, 0.0, 1> angle camAngle look_at camLookAt } light_source { 0*x colour rgb 1 translate lightDir*lightLen media_attenuation on } union { sphere { 0, 1 pigment { rgb 1 } finish { ambient 1 diffuse 0 } } disc { 0, y, 1 pigment { spherical poly_wave 3 } finish { ambient 1 diffuse 0 } scale 15 } no_shadow scale 1e-3*lightRad mAlign(1e-3*lightLen*lightDir, camPos) } #declare baseRad = 6371.0; #declare grndRad = baseRad; #declare atmsScale = 8.4; #declare atmsDepth = atmsScale*7; #declare atmsRad = grndRad + atmsDepth; #declare cloudDepth = 4; #declare cloudBase = baseRad+2; #declare cloudTop = cloudBase + cloudDepth; #declare cloudVSize = cloudDepth; #declare cloudHSize = 2*cloudVSize; #declare scaleVal = cloudBase / cloudHSize; #declare turbVal = cloudVSize / cloudHSize; #declare mapVal = 0.01*turbVal; #declare Quick = false; #declare mSamples = 16; #declare cloudDensity = 1; #declare atmDisp = sqrt(15); #declare atmCol = <1/atmDisp, 1, atmDisp>; #declare atmDensity = 0.01; sphere { 0, 1 pigment { rgbf 1 } finish { ambient 0 diffuse 0 } interior { media { intervals mSamples #if (Quick) absorption atmCol*atmDensity*1 emission atmCol*atmDensity #else scattering { 4, rgb atmDensity extinction 1 } #end samples 2, sqrt(mSamples) confidence 0.9999 variance 1/1000 density { spherical frequency -1 colour_map { #declare maxCount = 40; #declare grndVal = grndRad/atmsRad; #declare Count = 1; #while (Count < maxCount) #declare curFrac = Count/maxCount; #declare curVal = (1-curFrac)*grndVal + curFrac; #declare curCol = atmCol*exp(-curFrac*atmsDepth/atmsScale); [curVal rgb curCol] #declare Count = Count+1; #end } } } } hollow scale atmsRad translate -baseRad*y } #declare baseVal = cloudBase/cloudTop; #declare topVal = 1; #declare midVal = 0.25*(baseVal*3+topVal); #declare cloudFn1 = function { pigment { spherical frequency -1 colour_map { [baseVal rgb 0] [midVal rgb 1] [topVal rgb 0] } } } #declare cloudFn3 = function { min(1, max(0, abs(4*noise3d(x,y,z)-2)+ 0.5*abs(4*noise3d(x*3,y*3,z*3)-2)+ 0.25*abs(4*noise3d(x*9,y*9,z*9)-2)+ 0.125*abs(4*noise3d(x*27,y*27,z*27)-2)- 1.875 ) ) } #declare Quick = false; #declare mSamples = 50; #declare S = cloudTop/(3*cloudDepth); difference { sphere { 0, 1 } sphere { 0, cloudBase/cloudTop } pigment { rgbf 1 } finish { ambient 0 diffuse 0 } interior { media { intervals mSamples #if (Quick) emission cloudDensity absorption cloudDensity #else scattering { 2, rgb cloudDensity extinction 0.5 } #end samples 1, sqrt(mSamples) confidence 0.95 variance 1/100 density { function { max(0,min(1,cloudFn1(x,y,z)+cloudFn3(x*S,y*S,z*S)-1))*max(0,min(1,z*cloudBase*0.05)) } colour_map { [0.1 rgb 0] [0.2 rgb 1] } } } } hollow scale cloudTop translate -baseRad*y } sphere { 0, grndRad texture { pigment { color rgb <80,90,94>/255.0 } finish { diffuse 0.2 ambient 0.05*<80,90,94>/94 reflection_max 1.0*<80,90,94>/94 reflection_min 0.4*<80,90,94>/94 reflection_exponent 0.5 specular 0.3 roughness 0.001 brilliance 0.01 metallic 0.5 } normal{ bozo normal_map { [ 0.00 waves 0.050 translate -0.5 rotate -132 scale 1000*baseRad frequency 500*baseRad] [ 0.70 ripples 0.025 translate -0.5 rotate 213 scale 1000*baseRad frequency 1000*baseRad] [ 0.85 waves 0.015 translate -0.5 rotate 23 scale 1000*baseRad frequency 1000*baseRad] [ 1.00 ripples 0.005 translate -0.5 rotate 73 scale 1000*baseRad frequency 2000*baseRad] } scale 1/100 scale 1/50 warp { turbulence 1/5 octaves 2 lambda 5 omega 1/5 } warp { turbulence -1/5 octaves 2 lambda 5 omega 1/5 } scale 50 } } translate -baseRad*y } #declare turbVal = 1/4; #declare landLevel = 0.92; height_field { pattern 600,600 { hf_gray_16 average pigment_map { [1 cylindrical cubic_wave scale 0.5 translate <0.5,0,0.5> scale 10 warp { turbulence 0.25 octaves 3 lambda 5 omega 1/5 } warp { turbulence 0.25 octaves 3 lambda 5 omega 1/5 } scale 1/10 colour_map { [0 rgb 0][0.4 rgb 1] } ] [1 cylindrical cubic_wave scale 0.5 translate <0.5,0,0.5> scale 10 warp { turbulence 0.25 octaves 3 lambda 5 omega 1/5 } warp { turbulence 0.25 octaves 3 lambda 5 omega 1/5 } scale 1/10 pigment_map { [0.41 rgb 0] [0.75 planar cubic_wave scale 2 translate -y warp { turbulence turbVal octaves 3 lambda 3 omega 1/sqrt(3) } warp { turbulence turbVal octaves 3 lambda 3 omega 1/sqrt(3) } warp { turbulence turbVal octaves 3 lambda 3 omega 1/sqrt(3) } warp { turbulence turbVal octaves 3 lambda 3 omega 1/sqrt(3) } colour_map { [0.15 rgb 0.05][0.85 rgb 1] } scale 1/6 ] } ] } } smooth texture { slope y texture_map { [landLevel-0.05 pigment { spotted frequency 4 colour_map{ [0.0 colour DarkBrown] [0.2 colour Gold] [0.2 colour Tan] [0.5 colour DarkBrown*0.7] [1.0 colour DarkBrown*1.2] } scale <4,20,4> warp { turbulence 1 } scale <10, 0.1, 10> rotate 23 scale 10/(<20,2,20>*2) } normal { granite 0.05 scale 0.15 } finish { diffuse 0.4 specular 0.3 ambient 0.1*DarkBrown brilliance 1 roughness 0.5 metallic // reflection_blur 0.2 reflection_samples 2 reflection_max 0.4*DarkBrown reflection_min 0.1*DarkBrown } ] [landLevel pigment { colour DarkBrown*0.5 } normal { granite 0.2 scale 0.5 } finish { diffuse 0.4 specular 0.2 ambient 0.05*DarkBrown brilliance 0.1 roughness 0.1 metallic // reflection_blur 0.2 reflection_samples 2 reflection_max 0.25*DarkBrown reflection_min 0.05*DarkBrown } ] [landLevel pigment { colour ForestGreen } normal { granite 0.1 scale 0.25 } finish { diffuse 0.7 specular 0 ambient 0.2*ForestGreen // brilliance 1 roughness 10 metallic // reflection_blur 0.05 reflection_samples 2 reflection_max 0.6*ForestGreen reflection_min 0.2*ForestGreen } ] } } translate -0.5 scale <20,2,20>*2 translate sqrt(grndRad*grndRad-20*2*0.4*20*2*0.4)*y rotate x*degrees(atan2(20*2*0.5,grndRad)) translate -baseRad*y }