// Last edited on 2010-06-01 00:16:19 by stolfilocal // CAMERA RIG ///////////////////////////////////////////////// #include "pst_bars.inc" #include "pst_screws.inc" #include "pst_camera_arm.inc" // DIMENSIONS // Foot dimensions: #declare camera_rig_foot_szX = 10; #declare camera_rig_foot_szY = 60; #declare camera_rig_foot_szZ = 400; // Length and width of horizontal bars between feet: #declare camera_rig_pelvis_len = 300; #declare camera_rig_pelvis_wdt = bar_extruded_5x5_wdt ; // Leg dimensions: #declare camera_rig_leg_szX = 25; #declare camera_rig_leg_szY = 25; #declare camera_rig_leg_szZ = 300; // Leg hole dimensions, start and spacing (ctr to ctr): #declare camera_rig_leg_hrad = 7.5; #declare camera_rig_leg_hspc = 40; #declare camera_rig_leg_hfst = 40; // Dist from ankle to firsr hole ctr . #declare camera_rig_leg_nholes = 6; // Num holes. // Leg hole start and spacing (ctr to ctr): #declare camera_rig_leg_fhZ = camera_rig_foot_szX + camera_rig_leg_hfst; // Z of first hole. // Foot spacing (leg axis to leg axis): #declare camera_rig_foot_spc = camera_rig_pelvis_len + 2*(camera_rig_leg_szY/2); // Base dimensions: #declare camera_rig_base_szX = camera_rig_foot_szZ; #declare camera_rig_base_szY = camera_rig_foot_spc + 2*(camera_rig_foot_szY/2); #declare camera_rig_base_szZ = camera_rig_foot_szX + camera_rig_leg_szZ; // Pelvis bars positions: #declare camera_rig_pelvis1_dpZ = camera_rig_leg_fhZ + 0*camera_rig_leg_hspc; #declare camera_rig_pelvis2_dpZ = camera_rig_leg_fhZ + 5*camera_rig_leg_hspc; // Length and floor clearance of main column: #declare camera_rig_column_wdt = bar_extruded_3x3_wdt; #declare camera_rig_column_len = 2200; #declare camera_rig_column_botZ = 10; // Bolts that fit in the column's slots #declare camera_rig_col_bolt_rad = extruded_bar_hole_radius(camera_rig_column_wdt); #declare camera_rig_col_bolt_hrad = camera_rig_col_bolt_rad + 0.5; // RIG PARTS #macro camera_rig_foot_and_leg() // Foot with leg. // Foot extends in X direction. // Leg axis is Z axis. // Foot base is at Z=0. // Dimensions of foot proper: #local foot_szX = camera_rig_foot_szZ; #local foot_szY = camera_rig_foot_szY; #local foot_szZ = camera_rig_foot_szX; #local foot_dpX = camera_rig_foot_szZ/2; // X offset from tip to center. // Dimensions of leg: #local leg_szX = camera_rig_leg_szX; #local leg_szY = camera_rig_leg_szY; #local leg_szZ = camera_rig_leg_szZ; #local leg_hrad = camera_rig_leg_hrad; #local leg_hspc = camera_rig_leg_hspc; #local leg_hfst = camera_rig_leg_hfst; #local leg_nholes = camera_rig_leg_nholes; union{ object{ rectangular_tube(foot_szZ,foot_szY,foot_szX) rotate 90*y translate < -foot_dpX, 0, +foot_szZ/2 > texture{ tx_steel } } object{ holed_bar( leg_szX,leg_szY,leg_szZ, leg_hrad,leg_hspc,leg_hfst,leg_nholes ) translate < 0, 0, +foot_szZ > texture{ tx_steel } } } #end #macro camera_pelvis_bar() #local bar_wdt = camera_rig_pelvis_wdt; #local bar_len = camera_rig_pelvis_len; #local hole_rad = camera_rig_col_bolt_hrad; difference{ object{ extruded_bar(bar_wdt, bar_len) rotate -90*x translate -bar_len/2*y } cylinder{ (-bar_wdt/2-eps)*x, (+bar_wdt/2+eps)*x, hole_rad } texture{ tx_aluminum } } #end #macro camera_rig_base(explode) // The rig's base (two feet and two pelvis bars) // Foot spacing (leg axis to leg axis). #local foot_spc = camera_rig_foot_spc; // Leg dimensions: #local leg_szY = camera_rig_leg_szX; // Pelvis dimensions and positions: #local pelvis_wdt = camera_rig_pelvis_wdt; #local pelvis1_dpZ = camera_rig_pelvis1_dpZ; #local pelvis2_dpZ = camera_rig_pelvis2_dpZ; // Bolts and washers that fix the pelvis bars to the legs: #local bolt_rad = extruded_bar_hole_radius(pelvis_wdt); #local washer_orad = 0.55*camera_rig_leg_szX; #local washer_irad = bolt_rad + 0.5; #local washer_thk = 1.5; #local bolt_len = leg_szY + washer_thk + 15; #local pelvis_bolt = object{ hex_bolt(bolt_len,bolt_rad) rotate 90*x translate -(foot_spc/2 + leg_szY/2 + washer_thk + explode*20)*y } #local pelvis_washer = object{ washer(washer_irad,washer_orad,washer_thk) rotate 90*x translate -(foot_spc/2 + leg_szY/2 + explode*10)*y } #local pelvis_bar_bolted = union{ object{ camera_pelvis_bar() } object{ pelvis_washer } object{ pelvis_bolt } object{ pelvis_washer rotate 180*x } object{ pelvis_bolt rotate 180*x } } union{ object{ camera_rig_foot_and_leg() translate -(foot_spc/2 + explode*20)*y } object{ camera_rig_foot_and_leg() translate +(foot_spc/2 + explode*20)*y } object{ pelvis_bar_bolted translate pelvis1_dpZ*z } object{ pelvis_bar_bolted translate pelvis2_dpZ*z } } #end #macro camera_rig_column() object{ extruded_bar(camera_rig_column_wdt, camera_rig_column_len) texture{ tx_aluminum } } #end #macro camera_rig(cam_hgt,cam_rch,explode) // The base is centered on the Z axis with feet at Z=0. // Places the arm and camera so that the camera's virtual pinhole // is at {cam_hgt} from the floor and at {cam_rch} // from the Z axis. // Camera body dimensions: #local cam_fcY = camera_arm_fcY; // Dist from arm axis to pinhole. #local cam_fcZ = camera_arm_fcZ; // Dist from arm axis to pinhole. // Size of pelvis bars: #local pelvis_szX = camera_rig_pelvis_wdt; #local pelvis1_dpZ = camera_rig_pelvis1_dpZ; #local pelvis2_dpZ = camera_rig_pelvis2_dpZ; // Size and position of column relative to base origin: #local col_szX = camera_rig_column_wdt; #local col_szY = camera_rig_column_wdt; #local col_dpX = - pelvis_szX/2 - col_szX/2; #local col_dpY = 0; #local col_dpZ = camera_rig_column_botZ; // Corner and tee plates: #local plate_thk = camera_arm_plate_thk; // Dimensions of horizontal arm: #local arm_szY = camera_arm_wdt; #local arm_szZ = camera_arm_wdt; // Arm positioning relative to base origin: #local arm_dpX = col_dpX; #local arm_dpY = col_dpY - (col_szY/2 + plate_thk + arm_szY/2); #local arm_dpZ = cam_hgt - cam_fcZ; // Camera positioning in arm: #local cam_dpX = cam_rch - col_dpX; // Bolts that hold the column : #local col_bolt_rad = camera_rig_col_bolt_rad; #local col_pelvis_bolt_len = pelvis_szX + 10; #local col_pelvis_bolt_washer_and_nut = object{ slot_bolt_washer_and_nut(col_pelvis_bolt_len,col_bolt_rad,col_szX,pelvis_szX,true,true,explode) } // Bolts that hold the arm-col tee-plate to the column (rel to medial axis corner): #local col_arm_bolt_len = plate_thk + 10; #local col_arm_bolt_1_dpZ = arm_dpZ - camera_arm_T_hole1_dst; #local col_arm_bolt_2_dpZ = arm_dpZ - camera_arm_T_szZ + camera_arm_T_hole2_dst; #local col_arm_bolt_washer_and_nut = object{ slot_bolt_washer_and_nut(col_arm_bolt_len,col_bolt_rad,col_szX,plate_thk,false,true,explode) } union{ object{ camera_rig_base(explode) } union{ object{ camera_rig_column() translate col_dpZ*z } object{ col_pelvis_bolt_washer_and_nut translate pelvis1_dpZ*z } object{ col_pelvis_bolt_washer_and_nut translate pelvis2_dpZ*z } union{ object{ col_arm_bolt_washer_and_nut rotate -90*z translate col_arm_bolt_1_dpZ*z } object{ col_arm_bolt_washer_and_nut rotate -90*z translate col_arm_bolt_2_dpZ*z } } translate < col_dpX - 20*explode, col_dpY, 0 > } object{ camera_arm(cam_dpX,explode) translate < arm_dpX, arm_dpY - 20*explode, arm_dpZ > } } #end #macro camera_pyramid_solid(szx,szy,szz) // Extends from origin downwards along Z axis. prism{ linear_spline conic_sweep 0.01, 1, 5, < -szx/2, -szy/2 >, < -szx/2, +szy/2 >, < +szx/2, +szy/2 >, < +szx/2, -szy/2 >, < -szx/2, -szy/2 > rotate 90*x scale < 1,1,-szz> } #end #macro camera_pyramid_hollow(szx,szy,szz,thk) // Walls have thickness {thk} inwards. #local opyr = object{ camera_pyramid_solid(szx-eps,szy-eps,szz-2*eps) translate +eps*z }; #local ipyr = object{ camera_pyramid_solid(szx+eps,szy+eps,szz+2*eps) translate -eps*z }; #local uxp = vnormalize(< -szz, 0, -szx/2 >); #local uxm = vnormalize(< +szz, 0, -szx/2 >); #local uyp = vnormalize(< 0, -szz, -szy/2 >); #local uym = vnormalize(< 0, +szz, -szy/2 >); #local hole = intersection{ object{ ipyr translate thk*uxp } object{ ipyr translate thk*uxm } object{ ipyr translate thk*uyp } object{ ipyr translate thk*uym } } #local lo = min_extent(opyr); #local hi = max_extent(opyr); #debug concat("outer pyramid x range [ ", str(lo.x,7,3), " _ ", str(hi.x,7,3), " ]\n") #debug concat("outer pyramid y range [ ", str(lo.y,7,3), " _ ", str(hi.y,7,3), " ]\n") #debug concat("outer pyramid z range [ ", str(lo.z,7,3), " _ ", str(hi.z,7,3), " ]\n") difference{ object{ opyr } object{ hole } } #end #macro camera_view_pyramid(cam_hgt,cam_rch,cam_r_szX,cam_r_szY) #local szx = cam_r_szX * cam_hgt; #local szy = cam_r_szY * cam_hgt; #local szz = cam_hgt; #local thk = 0.1; // Thickness of view pyramid walls. #local vpyr = object{ camera_pyramid_hollow(szx,szy,szz,thk) // camera_pyramid_solid(szx,szy,szz) texture{ pigment{ color rgb 0.95*< 0.6, 1.0, 1.0 > filter 0.75 } finish{ ambient 1.0 diffuse 0.0 } } } object{ vpyr translate < cam_rch, 0, cam_hgt > } #end #debug "loaded pst_camera_rig.inc\n"