#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.95, 0.97, 1.00> } camera { location <0, 2.55, -10.2> look_at <0, 1.55, 0.15> angle 40 up <0,9,0> right <16,0,0> // right,up -> 16:9 } light_source { <7, 10, -7> color rgb <1.00, 0.86, 0.72>*1.10 area_light <2.6,0,0>, <0,0,2.6>, 6, 6 adaptive 1 jitter } light_source { <-8, 7.5, -4.5> color rgb <1.00, 0.90, 0.78>*0.55 area_light <2.1,0,0>, <0,0,2.1>, 5, 5 adaptive 1 jitter } light_source { <0, 9, 7> color rgb <1.00, 0.92, 0.82>*0.18 area_light <3.0,0,0>, <0,0,3.0>, 5, 5 adaptive 1 jitter } // Floor plane { y, 0 pigment { color rgb <0.92, 0.92, 0.90> } finish { diffuse 0.88 specular 0.05 roughness 0.12 } } // ------------------ Simple shading (no heavy textures) ------------------ #declare SkinTex = texture { pigment { color rgb <0.80, 0.69, 0.62> } finish { diffuse 0.80 specular 0.20 roughness 0.06 } } #declare ClothBlueTex = texture { pigment { color rgb <0.16, 0.22, 0.32> } finish { diffuse 0.85 specular 0.08 roughness 0.12 } } #declare ClothRedTex = texture { pigment { color rgb <0.46, 0.14, 0.12> } finish { diffuse 0.86 specular 0.07 roughness 0.14 } } // ------------------ 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 (extra overlap to avoid "stacked balls" look) 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 (slight head turn supported via rotate outside) 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 } // forehead bulge for nicer silhouette // Shoulder girdle (bridge sphere makes arms fuse smoothly) sphere { <0, 1.78, 0.06>, 0.56, 0.85 } // collar/upper chest sphere { <-0.50, 1.72, 0.06>, 0.34, 1.10 } // left shoulder cap sphere { < 0.50, 1.72, 0.06>, 0.34, 1.10 } // right shoulder cap // Left arm (more overlap + bridge at elbow/wrist) sphere { <-0.62-ArmOut, 1.58, 0.08+ArmFwd>, 0.30, 1.10 } // upper arm 1 sphere { <-0.90-ArmOut, 1.32, 0.10+ArmFwd>, 0.28, 1.05 } // upper arm 2 sphere { <-1.02-ArmOut, 1.10, 0.10+ArmFwd>, 0.26, 1.05 } // elbow bridge sphere { <-0.90-ArmOut, 0.86, 0.08+ArmFwd>, 0.24, 1.00 } // forearm sphere { <-0.72-ArmOut, 0.66, 0.06+ArmFwd>, 0.22, 0.85 } // wrist bridge sphere { <-0.62-ArmOut, 0.56, 0.10+ArmFwd>, 0.23, 0.80 } // hand // 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 (built to reach ground after translate <0,0.90,0>) sphere { <-0.25, 0.55, 0.00>, 0.34, 1.20 } // upper thigh sphere { <-0.28, 0.25, 0.00>, 0.32, 1.18 } // thigh sphere { <-0.30, -0.05, 0.00>, 0.29, 1.12 } // knee bridge sphere { <-0.28, -0.36, 0.02>, 0.27, 1.10 } // shin sphere { <-0.25, -0.62, 0.06>, 0.25, 1.00 } // ankle bridge sphere { <-0.22, -0.80, 0.18>, 0.27, 0.85 } // foot (bulb) sphere { <-0.20, -0.86, 0.28>, 0.20, 0.55 } // toe taper // 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 // Torso cover (kept slightly outside by radius) 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 } // Shoulder/sleeve blending 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 } // Slight leg openings 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 alike people ------------------ // Arrange as a small cluster; small variations keep them alike but not cloned-feeling. Person(<-1.55, 0, 0.20>, 10, 1.00, 0.02, 0.02, 6) Person(< 0.00, 0, 0.00>, 0, 1.03, 0.00, 0.00, 0) Person(< 1.55, 0, 0.15>, -12, 0.99, -0.01, 0.02, -7) Person(<-0.80, 0, 1.35>, 18, 0.98, 0.03, -0.01, 10) Person(< 0.95, 0, 1.25>, -20, 1.01, 0.01, -0.02, -9)