#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.96, 0.98> } camera { location <0, 3.25, -11.2> look_at <0, 2.05, 0.15> angle 40 up <0,9,0> right <16,0,0> // right,up -> 16:9 } // Warm, soft key light_source { <7.5, 10.5, -8.5> color rgb <1.00, 0.92, 0.80>*1.15 area_light <3.0,0,0>, <0,0,3.0>, 6, 6 adaptive 1 jitter } // Warm fill light_source { <-7.5, 8.5, -6.0> color rgb <1.00, 0.88, 0.76>*0.65 area_light <2.6,0,0>, <0,0,2.6>, 6, 6 adaptive 1 jitter } // Very soft overhead bounce light_source { <0, 11, 2.5> color rgb <1.00, 0.95, 0.88>*0.25 area_light <4.0,0,0>, <0,0,4.0>, 5, 5 adaptive 1 jitter } #declare Fin_Wood = finish { diffuse 0.78 specular 0.10 roughness 0.06 }; #declare Fin_Joint = finish { diffuse 0.70 specular 0.08 roughness 0.08 }; #declare Fin_Metal = finish { diffuse 0.55 specular 0.28 roughness 0.03 }; #declare Fin_String = finish { diffuse 0.65 specular 0.04 roughness 0.12 }; #declare Col_Floor = color rgb <0.90, 0.88, 0.84>; #declare Col_Wall = color rgb <0.93, 0.94, 0.96>; #declare Col_Base = color rgb <0.86, 0.84, 0.80>; #declare Col_Wood = color rgb <0.77, 0.60, 0.42>; #declare Col_Joint = color rgb <0.34, 0.30, 0.26>; #declare Col_Metal = color rgb <0.74, 0.74, 0.77>; #declare Col_String = color rgb <0.18, 0.18, 0.20>; // Stage floor plane { y, 0 pigment { Col_Floor } finish { diffuse 0.88 specular 0.05 roughness 0.08 } } // Back wall plane { z, 4.5 pigment { Col_Wall } finish { diffuse 0.92 specular 0.02 roughness 0.10 } } // Baseboard to ground the wall/floor seam box { <-8, 0.0, 4.45>, <8, 0.30, 4.60> pigment { Col_Base } finish { diffuse 0.85 specular 0.03 roughness 0.10 } } #macro Capsule(P1, P2, R) union { cylinder { P1, P2, R } sphere { P1, R } sphere { P2, R } } #end #macro HookRing(C, R, T) torus { R, T rotate <90,0,0> translate C } #end // ------------------------- // Marionette proportions // ------------------------- #declare PuppetY = 2.05; // Core sizes #declare HeadR = 0.55; #declare NeckR = 0.13; #declare TorsoTop = <0, PuppetY+0.35, 0.05>; #declare TorsoBot = <0, PuppetY-0.80, 0.05>; #declare TorsoR1 = 0.52; #declare TorsoR2 = 0.66; #declare HeadCenter = <0.02, PuppetY+1.18, 0.05>; #declare NeckTop = <0.02, PuppetY+0.68, 0.05>; #declare NeckBot = <0.02, PuppetY+0.45, 0.05>; #declare HipCenter = <0, PuppetY-1.02, 0.06>; #declare HipR = 0.26; // Arms #declare ShoulderY = PuppetY+0.20; #declare ShoulderL = <-0.82, ShoulderY, 0.05>; #declare ShoulderR = < 0.82, ShoulderY, 0.05>; #declare ShJointR = 0.18; #declare ElbowL = <-1.35, ShoulderY-0.48, 0.20>; #declare ElbowR = < 1.30, ShoulderY-0.50, -0.05>; #declare WristL = <-1.48, ShoulderY-1.10, 0.28>; #declare WristR = < 1.42, ShoulderY-1.08, -0.10>; #declare ArmR = 0.13; #declare ElbR = 0.155; #declare HandR = 0.18; // Legs #declare HipL = <-0.38, PuppetY-1.16, 0.06>; #declare HipR2= < 0.42, PuppetY-1.14, 0.06>; #declare HipJointR = 0.18; #declare KneeL = <-0.42, PuppetY-1.92, 0.15>; #declare KneeR = < 0.48, PuppetY-1.85, 0.00>; #declare AnkleL = <-0.42, PuppetY-2.70, 0.14>; #declare AnkleR = < 0.48, PuppetY-2.62, 0.02>; #declare LegR = 0.155; #declare KneeJR = 0.18; // Feet: small ovals, sit precisely on floor (y=0) #declare FootLen = 0.42; #declare FootRad = 0.16; // Puppet union #declare Puppet = union { // Head sphere { HeadCenter, HeadR pigment { Col_Wood } finish { Fin_Wood } } // Neck object { Capsule(NeckBot, NeckTop, NeckR) pigment { Col_Joint } finish { Fin_Joint } } // Torso cone { TorsoTop, TorsoR1 TorsoBot, TorsoR2 pigment { Col_Wood } finish { Fin_Wood } } // Hip ball sphere { HipCenter, HipR pigment { Col_Joint } finish { Fin_Joint } } // Shoulder joints sphere { ShoulderL, ShJointR pigment { Col_Joint } finish { Fin_Joint } } sphere { ShoulderR, ShJointR pigment { Col_Joint } finish { Fin_Joint } } // Arms object { Capsule(ShoulderL, ElbowL, ArmR) pigment { Col_Wood } finish { Fin_Wood } } sphere { ElbowL, ElbR pigment { Col_Joint } finish { Fin_Joint } } object { Capsule(ElbowL, WristL, ArmR) pigment { Col_Wood } finish { Fin_Wood } } sphere { WristL, HandR pigment { Col_Wood } finish { Fin_Wood } } object { Capsule(ShoulderR, ElbowR, ArmR) pigment { Col_Wood } finish { Fin_Wood } } sphere { ElbowR, ElbR pigment { Col_Joint } finish { Fin_Joint } } object { Capsule(ElbowR, WristR, ArmR) pigment { Col_Wood } finish { Fin_Wood } } sphere { WristR, HandR pigment { Col_Wood } finish { Fin_Wood } } // Hip joints (L/R) sphere { HipL, HipJointR pigment { Col_Joint } finish { Fin_Joint } } sphere { HipR2, HipJointR pigment { Col_Joint } finish { Fin_Joint } } // Legs object { Capsule(HipL, KneeL, LegR) pigment { Col_Wood } finish { Fin_Wood } } sphere { KneeL, KneeJR pigment { Col_Joint } finish { Fin_Joint } } object { Capsule(KneeL, AnkleL, LegR) pigment { Col_Wood } finish { Fin_Wood } } object { Capsule(HipR2, KneeR, LegR) pigment { Col_Wood } finish { Fin_Wood } } sphere { KneeR, KneeJR pigment { Col_Joint } finish { Fin_Joint } } object { Capsule(KneeR, AnkleR, LegR) pigment { Col_Wood } finish { Fin_Wood } } // Ankle/foot joints sphere { AnkleL, 0.165 pigment { Col_Joint } finish { Fin_Joint } } sphere { AnkleR, 0.165 pigment { Col_Joint } finish { Fin_Joint } } // Feet (touch the floor precisely at y=0) // Place each foot so its lowest point is y=0: // foot center y = FootRad union { sphere { <-0.42, FootRad, 0.24>, FootRad scale <1.25,1.0,2.0> pigment { Col_Wood } finish { Fin_Wood } } cylinder { <-0.42, FootRad, 0.10>, <-0.42, FootRad, 0.10+FootLen>, FootRad*0.92 pigment { Col_Wood } finish { Fin_Wood } } } union { sphere { <0.48, FootRad, 0.12>, FootRad scale <1.25,1.0,2.0> pigment { Col_Wood } finish { Fin_Wood } } cylinder { <0.48, FootRad, 0.00>, <0.48, FootRad, 0.00+FootLen>, FootRad*0.92 pigment { Col_Wood } finish { Fin_Wood } } } } // Place puppet so feet sit on floor (y=0) #declare PuppetShiftY = -(min(0,0)); // placeholder (kept simple) object { Puppet translate <0,0,0> } // ------------------------- // Controller cross + strings // ------------------------- #declare CrossY = PuppetY + 3.25; #declare CrossCenter = <0.00, CrossY, -0.25>; #declare CrossHalf = 1.35; #declare BarR = 0.055; // Wooden crossbars #declare Cross = union { object { Capsule(CrossCenter + <-CrossHalf,0,0>, CrossCenter + , BarR) pigment { Col_Wood } finish { Fin_Wood } } object { Capsule(CrossCenter + <0,0,-CrossHalf>, CrossCenter + <0,0, CrossHalf>, BarR) pigment { Col_Wood } finish { Fin_Wood } } sphere { CrossCenter, 0.085 pigment { Col_Joint } finish { Fin_Joint } } // Simple metal rings where strings attach object { HookRing(CrossCenter + <-CrossHalf,0,0>, 0.11, 0.016) pigment { Col_Metal } finish { Fin_Metal } } object { HookRing(CrossCenter + < CrossHalf,0,0>, 0.11, 0.016) pigment { Col_Metal } finish { Fin_Metal } } object { HookRing(CrossCenter + <0,0,0>, 0.11, 0.016) pigment { Col_Metal } finish { Fin_Metal } } object { HookRing(CrossCenter + <0,0, CrossHalf>,0.11, 0.016) pigment { Col_Metal } finish { Fin_Metal } } object { HookRing(CrossCenter + <0,0,-CrossHalf>,0.11, 0.016) pigment { Col_Metal } finish { Fin_Metal } } } object { Cross } #declare StringR = 0.016; // String attachment targets (slightly above parts) #declare T_Head = HeadCenter + <0, 0.55, 0>; #declare T_WristL= WristL + <0, 0.16, 0>; #declare T_WristR= WristR + <0, 0.16, 0>; #declare T_KneeL = KneeL + <0, 0.14, 0>; #declare T_KneeR = KneeR + <0, 0.14, 0>; // Strings (to head, both hands, both knees) object { Capsule(CrossCenter + <0,0,0>, T_Head, StringR) pigment { Col_String } finish { Fin_String } } object { Capsule(CrossCenter + <-CrossHalf,0,0>, T_WristL, StringR) pigment { Col_String } finish { Fin_String } } object { Capsule(CrossCenter + < CrossHalf,0,0>, T_WristR, StringR) pigment { Col_String } finish { Fin_String } } object { Capsule(CrossCenter + <0,0, CrossHalf>, T_KneeL, StringR) pigment { Col_String } finish { Fin_String } } object { Capsule(CrossCenter + <0,0,-CrossHalf>, T_KneeR, StringR) pigment { Col_String } finish { Fin_String } }