#version 3.7; global_settings { assumed_gamma 1.3 max_trace_level 16 radiosity { pretrace_start 0.08 pretrace_end 0.01 count 200 nearest_count 10 error_bound 0.5 recursion_limit 2 low_error_factor 0.5 gray_threshold 0.0 } } background { color rgb <0.80, 0.90, 1.00> } // ------------------ Camera (16:9) ------------------ camera { location <0.0, 2.05, -7.40> look_at <0.0, 1.35, 0.95> angle 40 up <0,9,0> right <16,0,0> // right,up -> 16:9 } // ------------------ Warm lights (soft shadows via area_light) ------------------ light_source { <8.5, 10.5, -7.5> color rgb <1.00, 0.86, 0.70>*1.00 area_light <1.8,0,0>, <0,0,1.8>, 5, 5 adaptive 1 jitter spotlight point_at <0, 1.4, 1.0> radius 22 falloff 42 tightness 10 } light_source { <-7.5, 8.5, -5.5> color rgb <1.00, 0.90, 0.78>*0.55 area_light <1.4,0,0>, <0,0,1.4>, 4, 4 adaptive 1 jitter spotlight point_at <0.2, 1.2, 0.9> radius 28 falloff 55 tightness 7 } light_source { <0, 9.5, 9.5> color rgb <1.00, 0.92, 0.82>*0.22 area_light <2.2,0,0>, <0,0,2.2>, 4, 4 adaptive 1 jitter spotlight point_at <0, 1.6, 2.2> radius 36 falloff 80 tightness 5 } // ------------------ Simple shading (no heavy textures) ------------------ #declare SkinTex = texture { pigment { color rgb <0.80, 0.69, 0.62> } finish { diffuse 0.82 specular 0.18 roughness 0.07 } } #declare ClothBlueTex = texture { pigment { color rgb <0.16, 0.22, 0.32> } finish { diffuse 0.86 specular 0.07 roughness 0.13 } } #declare ClothRedTex = texture { pigment { color rgb <0.46, 0.14, 0.12> } finish { diffuse 0.88 specular 0.06 roughness 0.14 } } #declare SandTex = texture { pigment { color rgb <0.92, 0.86, 0.70> } finish { diffuse 0.92 specular 0.03 roughness 0.18 } } #declare SeaTex = texture { pigment { color rgb <0.18, 0.40, 0.52> } finish { diffuse 0.65 specular 0.10 roughness 0.06 reflection 0.05 } } // ------------------ Environment: sky dome + beach + ocean + simple cyclorama ------------------ // Sky gradient dome (fast) sphere { <0,0,0>, 2000 hollow pigment { gradient y color_map { [0.00 color rgb <0.74, 0.86, 1.00>] [0.55 color rgb <0.90, 0.96, 1.00>] [1.00 color rgb <0.98, 0.99, 1.00>] } scale 1200 translate <0, 200, 0> } finish { diffuse 1 } no_shadow } // Sand plane plane { y, 0 texture { SandTex } } // Ocean band (kept subtle and mostly behind subjects) plane { y, -0.06 texture { SeaTex } clipped_by { plane { z, 2.55 } } clipped_by { plane { -z, 120 } } } // Thin wet-sand strip near shoreline box { <-80, -0.001, 2.40>, <80, 0.001, 2.85> texture { pigment { color rgb <0.80, 0.73, 0.58> } finish { diffuse 0.80 specular 0.08 roughness 0.10 reflection 0.02 } } } // Soft backdrop ramp (keeps framing clean; prevents large empty sky) cylinder { <0,0,3.6>, <0,4.0,3.6>, 7.2 open texture { pigment { color rgb <0.90, 0.92, 0.96> } finish { diffuse 1 specular 0 roughness 0.2 } } no_shadow } // ------------------ Blob Person parts (seamless overlap at joints) ------------------ #macro PersonBodyBlob(ArmOut, ArmFwd, HeadTurn) blob { threshold 0.62 // Pelvis/hips anchor (built around y~0.90) sphere { <0, 0.86, 0.00>, 0.62, 1.35 } sphere { <0, 0.72, 0.00>, 0.55, 1.15 } sphere { <-0.30, 0.80, 0.02>, 0.46, 1.05 } sphere { < 0.30, 0.80, 0.02>, 0.46, 1.05 } // Belly -> chest sphere { <0, 1.12, 0.02>, 0.58, 1.28 } sphere { <0, 1.42, 0.03>, 0.60, 1.30 } sphere { <0, 1.70, 0.03>, 0.58, 1.25 } sphere { <-0.22, 1.62, 0.08>, 0.46, 1.05 } sphere { < 0.22, 1.62, 0.08>, 0.46, 1.05 } // Neck + head sphere { <0, 2.02, 0.03>, 0.26, 1.05 } sphere { <0, 2.32, 0.04>, 0.45, 1.25 } sphere { <0, 2.46, 0.12>, 0.32, 0.85 } // Shoulder girdle sphere { <0, 1.78, 0.06>, 0.56, 0.85 } sphere { <-0.50, 1.72, 0.06>, 0.34, 1.10 } sphere { < 0.50, 1.72, 0.06>, 0.34, 1.10 } // Left arm sphere { <-0.62-ArmOut, 1.58, 0.08+ArmFwd>, 0.30, 1.10 } sphere { <-0.90-ArmOut, 1.32, 0.10+ArmFwd>, 0.28, 1.05 } sphere { <-1.02-ArmOut, 1.10, 0.10+ArmFwd>, 0.26, 1.05 } sphere { <-0.90-ArmOut, 0.86, 0.08+ArmFwd>, 0.24, 1.00 } sphere { <-0.72-ArmOut, 0.66, 0.06+ArmFwd>, 0.22, 0.85 } sphere { <-0.62-ArmOut, 0.56, 0.10+ArmFwd>, 0.23, 0.80 } // Right arm sphere { <0.62+ArmOut, 1.58, 0.08+ArmFwd>, 0.30, 1.10 } sphere { <0.90+ArmOut, 1.32, 0.10+ArmFwd>, 0.28, 1.05 } sphere { <1.02+ArmOut, 1.10, 0.10+ArmFwd>, 0.26, 1.05 } sphere { <0.90+ArmOut, 0.86, 0.08+ArmFwd>, 0.24, 1.00 } sphere { <0.72+ArmOut, 0.66, 0.06+ArmFwd>, 0.22, 0.85 } sphere { <0.62+ArmOut, 0.56, 0.10+ArmFwd>, 0.23, 0.80 } // Left leg sphere { <-0.25, 0.55, 0.00>, 0.34, 1.20 } sphere { <-0.28, 0.25, 0.00>, 0.32, 1.18 } sphere { <-0.30, -0.05, 0.00>, 0.29, 1.12 } sphere { <-0.28, -0.36, 0.02>, 0.27, 1.10 } sphere { <-0.25, -0.62, 0.06>, 0.25, 1.00 } sphere { <-0.22, -0.80, 0.18>, 0.27, 0.85 } sphere { <-0.20, -0.86, 0.28>, 0.20, 0.55 } // Right leg sphere { <0.25, 0.55, 0.00>, 0.34, 1.20 } sphere { <0.28, 0.25, 0.00>, 0.32, 1.18 } sphere { <0.30, -0.05, 0.00>, 0.29, 1.12 } sphere { <0.28, -0.36, 0.02>, 0.27, 1.10 } sphere { <0.25, -0.62, 0.06>, 0.25, 1.00 } sphere { <0.22, -0.80, 0.18>, 0.27, 0.85 } sphere { <0.20, -0.86, 0.28>, 0.20, 0.55 } texture { SkinTex } // Grounding: sole bottoms sit at y=0 translate <0, 0.90, 0> rotate <0, HeadTurn, 0> } #end #macro PersonShirtBlob(ArmOut, ArmFwd, HeadTurn) blob { threshold 0.62 sphere { <0, 1.72, 0.05>, 0.60, 1.05 } sphere { <0, 1.44, 0.05>, 0.62, 1.05 } sphere { <0, 1.18, 0.04>, 0.56, 0.98 } sphere { <-0.50, 1.70, 0.06>, 0.38, 0.85 } sphere { < 0.50, 1.70, 0.06>, 0.38, 0.85 } sphere { <-0.66-ArmOut, 1.56, 0.08+ArmFwd>, 0.30, 0.75 } sphere { < 0.66+ArmOut, 1.56, 0.08+ArmFwd>, 0.30, 0.75 } texture { ClothBlueTex } translate <0, 0.90, 0> rotate <0, HeadTurn, 0> } #end #macro PersonShortsBlob(ArmOut, ArmFwd, HeadTurn) blob { threshold 0.62 sphere { <0, 0.88, 0.02>, 0.64, 1.05 } sphere { <0, 0.66, 0.02>, 0.60, 1.00 } sphere { <-0.26, 0.52, 0.02>, 0.40, 0.92 } sphere { < 0.26, 0.52, 0.02>, 0.40, 0.92 } sphere { <-0.28, 0.34, 0.00>, 0.32, 0.75 } sphere { < 0.28, 0.34, 0.00>, 0.32, 0.75 } texture { ClothRedTex } translate <0, 0.90, 0> rotate <0, HeadTurn, 0> } #end #macro Person(Pos, RotY, Sc, ArmOut, ArmFwd, HeadTurn) union { object { PersonBodyBlob(ArmOut, ArmFwd, HeadTurn) } object { PersonShirtBlob(ArmOut, ArmFwd, HeadTurn) } object { PersonShortsBlob(ArmOut, ArmFwd, HeadTurn) } scale Sc rotate <0, RotY, 0> translate Pos } #end // ------------------ Group of blob people on the beach ------------------ Person(<-1.40, 0, 0.55>, 12, 1.00, 0.01, 0.03, 8) Person(< 0.00, 0, 0.35>, 0, 1.03, 0.00, 0.02, 0) Person(< 1.35, 0, 0.60>, -14, 0.99, -0.01, 0.03, -8) Person(<-0.75, 0, 1.55>, 20, 0.98, 0.03, -0.01, 10) Person(< 0.90, 0, 1.50>, -22, 1.01, 0.01, -0.02, -10)