#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 } } #default { finish { ambient 0 diffuse 1 } } background { color rgb <0.78, 0.78, 0.82> } 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 lights (soft shadows) // ----------------- #declare Target = <0, 2.1, 0>; light_source { <-4.2, 7.4, -6.4> color rgb <1.00, 0.86, 0.72>*0.60 spotlight point_at Target radius 18 falloff 30 tightness 8 fade_distance 18 fade_power 2 area_light <0.9,0,0>, <0,0,0.9>, 5, 5 adaptive 1 jitter } light_source { <5.4, 6.2, -3.2> color rgb <1.00, 0.90, 0.80>*0.30 spotlight point_at <0.2, 2.0, 0.2> radius 22 falloff 38 tightness 6 fade_distance 18 fade_power 2 area_light <0.8,0,0>, <0,0,0.8>, 4, 4 adaptive 1 jitter } light_source { <0.0, 7.0, 5.8> color rgb <1.00, 0.92, 0.82>*0.12 spotlight point_at <0, 2.4, 0> radius 25 falloff 45 tightness 4 fade_distance 22 fade_power 2 area_light <1.0,0,0>, <0,0,1.0>, 4, 4 adaptive 1 jitter } // ----------------- // Palette (vectors) // ----------------- #declare C_WallA_v = <0.86, 0.86, 0.90>; #declare C_FloorA_v = <0.68, 0.58, 0.44>; #declare C_WoodA_v = <0.72, 0.58, 0.40>; #declare C_Dark_v = <0.10, 0.09, 0.08>; #declare C_String_v = <0.92, 0.92, 0.92>; #declare C_Base_v = <0.72, 0.70, 0.68>; // Gear palette #declare C_Steel_v = <0.78, 0.80, 0.83>; #declare C_Iron_v = <0.55, 0.57, 0.60>; #declare C_Leather_v= <0.24, 0.16, 0.10>; #declare C_Red_v = <0.40, 0.10, 0.10>; #declare C_Gold_v = <0.80, 0.66, 0.30>; // ----------------- // Simple shading (no image textures) // ----------------- #declare Tex_Back = texture { pigment { color rgb C_WallA_v } finish { diffuse 0.92 specular 0.02 roughness 0.14 } } #declare Tex_Floor = texture { pigment { color rgb C_FloorA_v } finish { diffuse 0.90 specular 0.06 roughness 0.08 } } #declare Tex_Base = texture { pigment { color rgb C_Base_v } finish { diffuse 0.90 specular 0.04 roughness 0.12 } } #declare Tex_PuppetWood = texture { pigment { color rgb C_WoodA_v } finish { diffuse 0.85 specular 0.28 roughness 0.045 } } #declare Tex_String= texture { pigment { color rgb C_String_v } finish { diffuse 0.65 specular 0.18 roughness 0.06 } } #declare Tex_Steel = texture { pigment { color rgb C_Steel_v } finish { diffuse 0.55 specular 0.55 roughness 0.02 } } #declare Tex_Iron = texture { pigment { color rgb C_Iron_v } finish { diffuse 0.60 specular 0.45 roughness 0.03 } } #declare Tex_Leather = texture { pigment { color rgb C_Leather_v } finish { diffuse 0.85 specular 0.10 roughness 0.10 } } #declare Tex_ShieldPaint = texture { pigment { color rgb C_Red_v } finish { diffuse 0.85 specular 0.12 roughness 0.08 } } #declare Tex_Brass = texture { pigment { color rgb C_Gold_v } finish { diffuse 0.60 specular 0.45 roughness 0.03 } } // ----------------- // Stage // ----------------- plane { y, 0 texture { Tex_Floor } } // Back wall box { <-6, 0, 2>, < 6, 6, 2.2> texture { Tex_Back } no_shadow } // Baseboard box { <-6, 0.00, 2.00>, <6, 0.35, 2.15> texture { Tex_Base } no_shadow } // ----------------- // Mirrors (left/right 1/5 of camera view) // ----------------- #declare MirrorFinish = finish { diffuse 0.02 specular 0.90 roughness 0.002 reflection { 0.55, 0.70 fresnel on } conserve_energy }; #declare MirrorTex = texture { pigment { color rgb <0.98,0.98,1.00> } finish { MirrorFinish } }; #declare Mirror_Z = -10.0; #declare Mirror_Y0 = 0.0; #declare Mirror_Y1 = 6.0; #declare Mirror_W = 1.55; #declare Mirror_T = 0.03; box { <-3.64, Mirror_Y0, Mirror_Z>, <-3.64+Mirror_W, Mirror_Y1, Mirror_Z+Mirror_T> texture { MirrorTex } } box { < 3.64-Mirror_W, Mirror_Y0, Mirror_Z>, < 3.64, Mirror_Y1, Mirror_Z+Mirror_T> texture { MirrorTex } } // ----------------- // Marionette dimensions // ----------------- #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; #declare Y_Knee = Y_Foot + Shin_L; #declare Y_Hip = Y_Knee + Thigh_L; #declare Y_TorsoBase = Y_Hip + Hip_R; #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 { // Hip + torso sphere { <0, Y_Hip, 0>, Hip_R texture { Tex_PuppetWood } } cylinder { <0, Y_TorsoBase, 0>, <0, Y_TorsoTop, 0>, Torso_R texture { Tex_PuppetWood } } sphere { <0, Y_TorsoTop, 0>, Torso_R texture { Tex_PuppetWood } } // Neck + head cylinder { <0, Y_TorsoTop+0.02, 0>, <0, Y_Neck, 0>, Neck_R texture { Tex_PuppetWood } } sphere { <0, Y_Head, 0>, Head_R texture { Tex_PuppetWood } } // Simple carved face details (also wood) sphere { <-0.10, Y_Head+0.05, -Head_R+0.04>, 0.035 texture { Tex_PuppetWood } } sphere { < 0.10, Y_Head+0.05, -Head_R+0.04>, 0.035 texture { Tex_PuppetWood } } cylinder { <0, Y_Head-0.08, -Head_R+0.03>, <0, Y_Head-0.11, -Head_R+0.03>, 0.03 texture { Tex_PuppetWood } } // Shoulder joints sphere { <-Shoulder_Offset, Shoulder_Y, 0>, UpperArm_R texture { Tex_PuppetWood } } sphere { < Shoulder_Offset, Shoulder_Y, 0>, UpperArm_R texture { Tex_PuppetWood } } // Left arm cylinder { <-Shoulder_Offset, Shoulder_Y, 0>, <-Shoulder_Offset, Shoulder_Y-UpperArm_L, 0.15>, UpperArm_R texture { Tex_PuppetWood } } sphere { <-Shoulder_Offset, Shoulder_Y-UpperArm_L, 0.15>, ForeArm_R texture { Tex_PuppetWood } } cylinder { <-Shoulder_Offset, Shoulder_Y-UpperArm_L, 0.15>, <-Shoulder_Offset, Shoulder_Y-UpperArm_L-ForeArm_L, 0.05>, ForeArm_R texture { Tex_PuppetWood } } sphere { <-Shoulder_Offset, Shoulder_Y-UpperArm_L-ForeArm_L, 0.05>, Hand_R texture { Tex_PuppetWood } } // Right arm cylinder { , , UpperArm_R texture { Tex_PuppetWood } } sphere { , ForeArm_R texture { Tex_PuppetWood } } cylinder { , , ForeArm_R texture { Tex_PuppetWood } } sphere { , Hand_R texture { Tex_PuppetWood } } // Legs #declare Hip_Offset = 0.22; sphere { <-Hip_Offset, Y_Hip, 0>, Thigh_R texture { Tex_PuppetWood } } sphere { < Hip_Offset, Y_Hip, 0>, Thigh_R texture { Tex_PuppetWood } } cylinder { <-Hip_Offset, Y_Hip, 0>, <-Hip_Offset, Y_Knee, 0.08>, Thigh_R texture { Tex_PuppetWood } } sphere { <-Hip_Offset, Y_Knee, 0.08>, Shin_R texture { Tex_PuppetWood } } cylinder { <-Hip_Offset, Y_Knee, 0.08>, <-Hip_Offset, Y_Foot, 0.03>, Shin_R texture { Tex_PuppetWood } } sphere { <-Hip_Offset, Y_Foot, 0.03>, Foot_R texture { Tex_PuppetWood } } cylinder { , , Thigh_R texture { Tex_PuppetWood } } sphere { , Shin_R texture { Tex_PuppetWood } } cylinder { , , Shin_R texture { Tex_PuppetWood } } sphere { , Foot_R texture { Tex_PuppetWood } } // Waist ring (wood) torus { 0.36, 0.05 rotate <90,0,0> translate <0, Y_TorsoBase+0.08, 0> texture { Tex_PuppetWood } } } object { Puppet } // ----------------- // Armor + sword + shield // ----------------- // Helmet (simple rounded helm with rim) #declare Helmet = union { difference { sphere { <0, Y_Head+0.02, 0>, Head_R*1.03 } sphere { <0, Y_Head+0.07, 0>, Head_R*0.93 } plane { y, Y_Head-0.10 inverse } // keep upper cap texture { Tex_Steel } } torus { Head_R*0.93, 0.04 rotate <90,0,0> translate <0, Y_Head-0.03, 0> texture { Tex_Iron } } // small nose guard cylinder { <0, Y_Head+0.02, -Head_R+0.01>, <0, Y_Head-0.14, -Head_R+0.01>, 0.03 texture { Tex_Iron } } } object { Helmet } // Breastplate / backplate (two slightly offset cylinders clipped) #declare ChestArmor = union { // breastplate difference { cylinder { <0, Y_TorsoBase+0.14, -0.06>, <0, Y_TorsoTop-0.10, -0.06>, Torso_R*1.05 } cylinder { <0, Y_TorsoBase+0.14, -0.06>, <0, Y_TorsoTop-0.10, -0.06>, Torso_R*0.92 } plane { z, 0.05 } // clip most of back (keep front) plane { z, -0.85 inverse } texture { Tex_Steel } } // backplate difference { cylinder { <0, Y_TorsoBase+0.14, 0.08>, <0, Y_TorsoTop-0.10, 0.08>, Torso_R*1.02 } cylinder { <0, Y_TorsoBase+0.14, 0.08>, <0, Y_TorsoTop-0.10, 0.08>, Torso_R*0.90 } plane { z, -0.05 } // clip most of front (keep back) plane { z, 0.85 inverse } texture { Tex_Iron } } // simple belt/strap torus { Torso_R*1.02, 0.035 rotate <90,0,0> translate <0, Y_TorsoBase+0.26, 0> texture { Tex_Leather } } // pauldrons (small shoulder caps) sphere { <-Shoulder_Offset, Shoulder_Y+0.03, 0.02>, UpperArm_R*1.35 texture { Tex_Iron } } sphere { < Shoulder_Offset, Shoulder_Y+0.03, 0.02>, UpperArm_R*1.35 texture { Tex_Iron } } } object { ChestArmor } // Sword in right hand #declare RHandPos = < Shoulder_Offset, Shoulder_Y-UpperArm_L-ForeArm_L, -0.05>; #declare Sword = union { // blade cylinder { <0,0,0>, <0,0,1.65>, 0.045 texture { Tex_Steel } } cone { <0,0,1.65>, 0.045, <0,0,1.85>, 0.0 texture { Tex_Steel } } // fuller hint (thin inset rod) cylinder { <0,0,0.20>, <0,0,1.55>, 0.015 texture { Tex_Iron } } // guard box { <-0.22,-0.04,-0.06>, <0.22,0.04,0.06> texture { Tex_Iron } } // grip cylinder { <0,0,-0.35>, <0,0,-0.08>, 0.055 texture { Tex_Leather } } // pommel sphere { <0,0,-0.40>, 0.075 texture { Tex_Brass } } // Place/orient: hold with blade downward slightly forward rotate <80, 10, 0> translate (RHandPos + <0.08, 0.00, -0.06>) } object { Sword } // Shield on left forearm #declare LForeMid = <-Shoulder_Offset, Shoulder_Y-UpperArm_L-(ForeArm_L*0.55), 0.10>; #declare Shield = union { // main body (rounded rectangle) superellipsoid { <0.25, 0.35> scale <0.62, 0.82, 0.10> texture { Tex_ShieldPaint } } // metal rim (slightly larger shell) difference { superellipsoid { <0.25, 0.35> scale <0.66, 0.86, 0.11> } superellipsoid { <0.25, 0.35> scale <0.60, 0.80, 0.20> } texture { Tex_Iron } } // boss sphere { <0, 0, -0.02>, 0.16 texture { Tex_Steel } } // straps (wrap around forearm) box { <-0.45, -0.08, 0.06>, <0.45, 0.08, 0.12> texture { Tex_Leather } } box { <-0.45, 0.18, 0.06>, <0.45, 0.34, 0.12> texture { Tex_Leather } } // Orient + place: left arm carries shield, tilted to face camera rotate <0, -18, 0> rotate <0, 0, 10> translate (LForeMid + <-0.55, 0.05, -0.05>) } object { Shield } // ----------------- // Controller + strings (controller hidden; strings visible) // ----------------- #declare Ctrl_Y = 4.2; #declare Ctrl_Z = -0.2; #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 } }