// Single-file POV-Ray scene: Simple marionette on a stage #version 3.7; global_settings { assumed_gamma 1.0 max_trace_level 8 } background { color rgb <0.92, 0.95, 1.0> } // ---------- Camera ---------- camera { location <0, 3.0, -10.5> look_at <0, 2.0, 0> angle 35 } // ---------- Lights ---------- light_source { < -6, 10, -8> color rgb <1, 1, 1> } light_source { < 8, 8, -4> color rgb <0.6, 0.65, 0.7> } // ---------- Simple stage ---------- plane { y, 0 texture { pigment { color rgb <0.78, 0.75, 0.70> } finish { diffuse 0.85 specular 0.15 roughness 0.06 } } } // ---------- Materials ---------- #declare T_WoodLight = texture { pigment { color rgb <0.82, 0.68, 0.50> } finish { diffuse 0.85 specular 0.25 roughness 0.05 } }; #declare T_WoodDark = texture { pigment { color rgb <0.55, 0.38, 0.22> } finish { diffuse 0.85 specular 0.25 roughness 0.06 } }; #declare T_String = texture { pigment { color rgb <0.12, 0.12, 0.12> } finish { diffuse 0.9 specular 0.05 } }; // ---------- Helper: string cylinder from A to B ---------- #macro String_AB(A, B, R) cylinder { A, B, R texture { T_String } } #end // ---------- Controller (crossbar) ---------- #declare CrossBarY = 6.0; #declare CrossBarLen = 4.6; #declare CrossBarRad = 0.10; #declare Controller = union { // main bar along X cylinder { <-CrossBarLen/2, CrossBarY, 0>, < CrossBarLen/2, CrossBarY, 0>, CrossBarRad texture { T_WoodDark } } // end knobs sphere { <-CrossBarLen/2, CrossBarY, 0>, CrossBarRad*1.35 texture { T_WoodDark } } sphere { < CrossBarLen/2, CrossBarY, 0>, CrossBarRad*1.35 texture { T_WoodDark } } // small central grip (downwards) cylinder { <0, CrossBarY, 0>, <0, CrossBarY-0.8, 0>, CrossBarRad*0.55 texture { T_WoodDark } } } object { Controller } // ---------- Puppet dimensions / key points ---------- #declare PuppetHeadY = 4.55; #declare PuppetNeckY = 4.15; #declare PuppetChestY = 3.55; #declare PuppetHipY = 2.80; #declare PuppetKneeY = 1.80; #declare PuppetFootY = 0.55; // Slight pose offsets #declare ArmOut = 1.25; #declare LegOut = 0.55; // Puppet anchor points for strings (world coords) #declare A_HandL = <-ArmOut, 3.05, 0>; #declare A_HandR = < ArmOut, 3.05, 0>; #declare A_Head = <0, PuppetHeadY+0.35, 0>; #declare A_Hip = <0, PuppetHipY+0.05, 0>; // Crossbar string attachment points (world coords) #declare B_HandL = <-1.7, CrossBarY, 0>; #declare B_HandR = < 1.7, CrossBarY, 0>; #declare B_Head = < 0.0, CrossBarY, 0>; #declare B_Hip = < 0.0, CrossBarY, 0.35>; // ---------- Strings ---------- String_AB(B_HandL, A_HandL, 0.02) String_AB(B_HandR, A_HandR, 0.02) String_AB(B_Head, A_Head, 0.02) String_AB(B_Hip, A_Hip, 0.02) // ---------- Puppet ---------- #declare Puppet = union { // Head sphere { <0, PuppetHeadY, 0>, 0.45 texture { T_WoodLight } } // Simple face hint (fast): two small dark "eyes" sphere { <-0.14, PuppetHeadY+0.08, -0.38>, 0.05 texture { T_WoodDark } } sphere { < 0.14, PuppetHeadY+0.08, -0.38>, 0.05 texture { T_WoodDark } } // Neck cylinder { <0, PuppetNeckY, 0>, <0, PuppetChestY+0.15, 0>, 0.12 texture { T_WoodLight } } // Torso (stacked cylinders for clean alignment) cylinder { <0, PuppetChestY+0.45, 0>, <0, PuppetHipY+0.25, 0>, 0.55 texture { T_WoodLight } } cylinder { <0, PuppetHipY+0.25, 0>, <0, PuppetHipY-0.15, 0>, 0.45 texture { T_WoodLight } } // Shoulder joint spheres sphere { <-0.62, PuppetChestY+0.30, 0>, 0.16 texture { T_WoodDark } } sphere { < 0.62, PuppetChestY+0.30, 0>, 0.16 texture { T_WoodDark } } // Arms: upper + lower + hands // Left arm cylinder { <-0.62, PuppetChestY+0.30, 0>, <-0.95, 3.20, 0>, 0.14 texture { T_WoodLight } } sphere { <-0.95, 3.20, 0>, 0.14 texture { T_WoodDark } } cylinder { <-0.95, 3.20, 0>, A_HandL, 0.12 texture { T_WoodLight } } sphere { A_HandL, 0.13 texture { T_WoodLight } } // Right arm cylinder { <0.62, PuppetChestY+0.30, 0>, <0.95, 3.20, 0>, 0.14 texture { T_WoodLight } } sphere { <0.95, 3.20, 0>, 0.14 texture { T_WoodDark } } cylinder { <0.95, 3.20, 0>, A_HandR, 0.12 texture { T_WoodLight } } sphere { A_HandR, 0.13 texture { T_WoodLight } } // Hip joint spheres sphere { <-0.30, PuppetHipY-0.10, 0>, 0.16 texture { T_WoodDark } } sphere { < 0.30, PuppetHipY-0.10, 0>, 0.16 texture { T_WoodDark } } // Legs: upper + lower + feet (slightly out) // Left leg cylinder { <-0.30, PuppetHipY-0.10, 0>, <-LegOut, PuppetKneeY, 0>, 0.16 texture { T_WoodLight } } sphere { <-LegOut, PuppetKneeY, 0>, 0.16 texture { T_WoodDark } } cylinder { <-LegOut, PuppetKneeY, 0>, <-LegOut, PuppetFootY+0.35, 0>, 0.14 texture { T_WoodLight } } box { <-LegOut-0.22, PuppetFootY, -0.18>, <-LegOut+0.22, PuppetFootY+0.16, 0.25> texture { T_WoodDark } } // Right leg cylinder { <0.30, PuppetHipY-0.10, 0>, , 0.16 texture { T_WoodLight } } sphere { , 0.16 texture { T_WoodDark } } cylinder { , , 0.14 texture { T_WoodLight } } box { , texture { T_WoodDark } } // Small chest button detail (fast) sphere { <0, PuppetChestY+0.15, -0.52>, 0.07 texture { T_WoodDark } } sphere { <0, PuppetChestY-0.10, -0.52>, 0.07 texture { T_WoodDark } } } object { Puppet }