#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.3, -8.2> look_at <0, 1.6, 0> angle 40 up <0,9,0> right <16,0,0> // right,up -> 16:9 } // Warm soft lights light_source { <-4, 7, -6> color rgb <1.00, 0.85, 0.72>*1.15 area_light <1.2,0,0>, <0,0,1.2>, 5, 5 adaptive 1 jitter } light_source { <5, 5, -3> color rgb <1.00, 0.90, 0.80>*0.55 area_light <1.0,0,0>, <0,0,1.0>, 4, 4 adaptive 1 jitter } // --- Colors as vectors (not "rgb <...>") to avoid "rgb rgb" parse issues --- #declare C_Back_v = <0.93, 0.94, 0.97>; #declare C_Floor_v = <0.62, 0.52, 0.40>; #declare C_Wood_v = <0.72, 0.60, 0.44>; #declare C_Cloth_v = <0.20, 0.30, 0.75>; #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.90, 0.90, 0.90>; // --- Proper textures (texture { pigment { ... } finish { ... } }) --- #declare Tex_Back = texture { pigment { color rgb C_Back_v } finish { diffuse 0.85 specular 0.05 roughness 0.08 } } #declare Tex_Floor = texture { pigment { color rgb C_Floor_v } finish { diffuse 0.90 specular 0.12 roughness 0.06 } } #declare Tex_Wood = texture { pigment { color rgb C_Wood_v } finish { diffuse 0.90 specular 0.18 roughness 0.05 } } #declare Tex_Cloth = texture { pigment { color rgb C_Cloth_v } finish { diffuse 0.95 specular 0.06 roughness 0.10 } } #declare Tex_Skin = texture { pigment { color rgb C_Skin_v } finish { diffuse 0.90 specular 0.10 roughness 0.07 } } #declare Tex_Dark = texture { pigment { color rgb C_Dark_v } finish { diffuse 0.85 specular 0.08 roughness 0.10 } } #declare Tex_String= texture { pigment { color rgb C_String_v } finish { diffuse 0.80 specular 0.20 roughness 0.04 } } // // Stage // plane { y, 0 texture { Tex_Floor } } box { <-6, 0, 2>, < 6, 6, 2.2> texture { Tex_Back } 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 } }