#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.95, 0.98> } camera { location <0, 2.8, -12.6> look_at <0, 2.1, 0> angle 40 up <0,9,0> right <16,0,0> // right,up -> 16:9 } // Warm soft lights (slightly stronger key, softer fill) light_source { <-4, 7, -6> color rgb <1.00, 0.86, 0.72>*1.25 area_light <1.6,0,0>, <0,0,1.6>, 6, 6 adaptive 1 jitter } light_source { <5, 5.5, -3> color rgb <1.00, 0.90, 0.80>*0.60 area_light <1.2,0,0>, <0,0,1.2>, 5, 5 adaptive 1 jitter } // Very soft rim/bounce to lift strings/edges light_source { <0, 6.5, 4> color rgb <1.00, 0.92, 0.82>*0.25 area_light <2.0,0,0>, <0,0,2.0>, 4, 4 adaptive 1 jitter } // ----------------- // Palette (vectors) // ----------------- #declare C_WallA_v = <0.96, 0.96, 0.985>; #declare C_WallB_v = <0.92, 0.93, 0.965>; #declare C_FloorA_v = <0.72, 0.62, 0.48>; #declare C_FloorB_v = <0.66, 0.56, 0.43>; #declare C_WoodA_v = <0.74, 0.60, 0.42>; #declare C_WoodB_v = <0.58, 0.44, 0.30>; #declare C_Cloth_v = <0.22, 0.33, 0.78>; #declare C_Skin_v = <0.96, 0.86, 0.74>; #declare C_Dark_v = <0.12, 0.12, 0.14>; #declare C_String_v = <0.93, 0.93, 0.93>; #declare C_Base_v = <0.80, 0.76, 0.72>; // ----------------- // Textures (procedural, fast) // ----------------- // Painted wall with subtle vertical gradient + tiny grain #declare Tex_Back = texture { pigment { gradient y color_map { [0.00 color rgb C_WallB_v] [1.00 color rgb C_WallA_v] } scale 6 } normal { bumps 0.15 scale 0.12 } finish { diffuse 0.90 specular 0.03 roughness 0.10 } } // Stage floor: warm wood-ish with gentle variation (no heavy plank mapping) #declare Tex_Floor = texture { pigment { wood color_map { [0.00 color rgb C_FloorB_v] [0.45 color rgb C_FloorA_v] [0.85 color rgb C_FloorB_v] [1.00 color rgb C_FloorA_v] } scale <0.9, 1.0, 0.9> rotate <0,90,0> } normal { bumps 0.30 scale 0.10 } finish { diffuse 0.90 specular 0.10 roughness 0.06 } } // Puppet wood: clearer grain and slightly shinier #declare Tex_Wood = texture { pigment { wood color_map { [0.00 color rgb C_WoodB_v] [0.45 color rgb C_WoodA_v] [0.85 color rgb C_WoodB_v] [1.00 color rgb C_WoodA_v] } scale 0.35 rotate <0,90,0> } normal { bumps 0.35 scale 0.06 } finish { diffuse 0.85 specular 0.22 roughness 0.04 } } // Cloth: subtle weave via bumps + slight sheen #declare Tex_Cloth = texture { pigment { color rgb C_Cloth_v } normal { ripples 0.18 frequency 22 scale 0.08 } finish { diffuse 0.95 specular 0.08 roughness 0.12 } } // Painted/skin: smoother with soft highlight #declare Tex_Skin = texture { pigment { color rgb C_Skin_v } normal { bumps 0.10 scale 0.08 } finish { diffuse 0.88 specular 0.14 roughness 0.07 } } // Dark accents: matte #declare Tex_Dark = texture { pigment { color rgb C_Dark_v } finish { diffuse 0.88 specular 0.05 roughness 0.12 } } // String: slightly twisted look via bumps, modest spec #declare Tex_String = texture { pigment { color rgb C_String_v } normal { wrinkles 0.35 scale 0.03 } finish { diffuse 0.75 specular 0.25 roughness 0.03 } } // Baseboard #declare Tex_Base = texture { pigment { color rgb C_Base_v } normal { bumps 0.15 scale 0.10 } finish { diffuse 0.90 specular 0.06 roughness 0.09 } } // // Stage // plane { y, 0 texture { Tex_Floor } } // Back wall box { <-6, 0, 2>, < 6, 6, 2.2> texture { Tex_Back } no_shadow } // Simple baseboard at wall/floor seam box { <-6, 0.00, 2.00>, <6, 0.35, 2.15> texture { Tex_Base } no_shadow } // // Marionette dimensions (units are POV units) // #declare Head_R = 0.35; #declare Neck_R = 0.10; #declare Torso_R = 0.45; #declare Torso_H = 1.05; #declare Hip_R = 0.23; #declare UpperArm_R = 0.14; #declare UpperArm_L = 0.70; #declare ForeArm_R = 0.12; #declare ForeArm_L = 0.65; #declare Thigh_R = 0.16; #declare Thigh_L = 0.80; #declare Shin_R = 0.14; #declare Shin_L = 0.80; #declare Hand_R = 0.13; #declare Foot_R = 0.15; #declare Y_Foot = 0.15; // foot center height #declare Y_Knee = Y_Foot + Shin_L; // precise stack #declare Y_Hip = Y_Knee + Thigh_L; // precise stack #declare Y_TorsoBase = Y_Hip + Hip_R; // torso sits on hip sphere #declare Y_TorsoTop = Y_TorsoBase + Torso_H; #declare Y_Neck = Y_TorsoTop + 0.12; #declare Y_Head = Y_Neck + Head_R + 0.10; #declare Shoulder_Y = Y_TorsoTop - 0.10; #declare Shoulder_Offset = 0.55; #declare Puppet = union { // Body core sphere { <0, Y_Hip, 0>, Hip_R texture { Tex_Wood } } cylinder { <0, Y_TorsoBase, 0>, <0, Y_TorsoTop, 0>, Torso_R texture { Tex_Cloth } } sphere { <0, Y_TorsoTop, 0>, Torso_R texture { Tex_Cloth } } // Neck + head cylinder { <0, Y_TorsoTop+0.02, 0>, <0, Y_Neck, 0>, Neck_R texture { Tex_Wood } } sphere { <0, Y_Head, 0>, Head_R texture { Tex_Skin } } // simple face dots sphere { <-0.10, Y_Head+0.05, -Head_R+0.04>, 0.035 texture { Tex_Dark } } sphere { < 0.10, Y_Head+0.05, -Head_R+0.04>, 0.035 texture { Tex_Dark } } cylinder { <0, Y_Head-0.08, -Head_R+0.03>, <0, Y_Head-0.11, -Head_R+0.03>, 0.03 texture { Tex_Dark } } // Shoulders (joint spheres) sphere { <-Shoulder_Offset, Shoulder_Y, 0>, UpperArm_R texture { Tex_Wood } } sphere { < Shoulder_Offset, Shoulder_Y, 0>, UpperArm_R texture { Tex_Wood } } // Left arm (viewer-left is negative x) cylinder { <-Shoulder_Offset, Shoulder_Y, 0>, <-Shoulder_Offset, Shoulder_Y-UpperArm_L, 0.15>, UpperArm_R texture { Tex_Wood } } sphere { <-Shoulder_Offset, Shoulder_Y-UpperArm_L, 0.15>, ForeArm_R texture { Tex_Wood } } cylinder { <-Shoulder_Offset, Shoulder_Y-UpperArm_L, 0.15>, <-Shoulder_Offset, Shoulder_Y-UpperArm_L-ForeArm_L, 0.05>, ForeArm_R texture { Tex_Wood } } sphere { <-Shoulder_Offset, Shoulder_Y-UpperArm_L-ForeArm_L, 0.05>, Hand_R texture { Tex_Skin } } // Right arm cylinder { , , UpperArm_R texture { Tex_Wood } } sphere { , ForeArm_R texture { Tex_Wood } } cylinder { , , ForeArm_R texture { Tex_Wood } } sphere { , Hand_R texture { Tex_Skin } } // Leg joint spheres #declare Hip_Offset = 0.22; sphere { <-Hip_Offset, Y_Hip, 0>, Thigh_R texture { Tex_Wood } } sphere { < Hip_Offset, Y_Hip, 0>, Thigh_R texture { Tex_Wood } } // Left leg (stack precisely to floor) cylinder { <-Hip_Offset, Y_Hip, 0>, <-Hip_Offset, Y_Knee, 0.08>, Thigh_R texture { Tex_Wood } } sphere { <-Hip_Offset, Y_Knee, 0.08>, Shin_R texture { Tex_Wood } } cylinder { <-Hip_Offset, Y_Knee, 0.08>, <-Hip_Offset, Y_Foot, 0.03>, Shin_R texture { Tex_Wood } } sphere { <-Hip_Offset, Y_Foot, 0.03>, Foot_R texture { Tex_Dark } } // Right leg cylinder { , , Thigh_R texture { Tex_Wood } } sphere { , Shin_R texture { Tex_Wood } } cylinder { , , Shin_R texture { Tex_Wood } } sphere { , Foot_R texture { Tex_Dark } } // Simple belt line hint torus { 0.36, 0.05 rotate <90,0,0> translate <0, Y_TorsoBase+0.08, 0> texture { Tex_Dark } } } object { Puppet } // // Controller + strings // #declare Ctrl_Y = 4.2; #declare Ctrl_Z = -0.2; #declare Controller = union { // cross bar box { <-1.4, Ctrl_Y-0.05, Ctrl_Z-0.10>, <1.4, Ctrl_Y+0.05, Ctrl_Z+0.10> texture { Tex_Wood } } // handle box { <-0.12, Ctrl_Y-0.75, Ctrl_Z-0.08>, <0.12, Ctrl_Y-0.05, Ctrl_Z+0.08> texture { Tex_Wood } } } object { Controller } // String endpoints #declare LHand = <-Shoulder_Offset, Shoulder_Y-UpperArm_L-ForeArm_L, 0.05>; #declare RHand = < Shoulder_Offset, Shoulder_Y-UpperArm_L-ForeArm_L, -0.05>; #declare HeadTop = <0, Y_Head+Head_R, 0>; #declare LCtrl = <-1.1, Ctrl_Y-0.05, Ctrl_Z>; #declare RCtrl = < 1.1, Ctrl_Y-0.05, Ctrl_Z>; #declare HCtrl = < 0.0, Ctrl_Y-0.05, Ctrl_Z>; cylinder { LCtrl, LHand, 0.015 texture { Tex_String } } cylinder { RCtrl, RHand, 0.015 texture { Tex_String } } cylinder { HCtrl, HeadTop, 0.012 texture { Tex_String } }