eps = 0.01; infty = 300; base_d = 70; base_y_scale = 0.7; base_wall = 1.25; base_l = 80; base_w = 30; rear_angle = 75; wheel_base = 70; wheel_h = 50; wheel_axle_cube = 5; axle_hole = 2; beam_w = 1.5; beam_h = 5; top_beam_h = 12; spring_clip_l = 3.5; spring_clip_w = base_w - 5; spring_dist = 10; module rear_cyl() { translate([0, 0, -beam_w*sin(rear_angle)/2]) rotate([rear_angle-90, 0, 0]) cylinder(r = beam_w/2, h = beam_h/sin(rear_angle), $fn = 32); } module front_cyl() { rotate([rear_angle-90, 0, 0]) cylinder(r = beam_w/2, h = beam_h, $fn = 32); } module top_cyl() { rotate([rear_angle-90, 0, 0]) cylinder(r = beam_w/2, h = top_beam_h, $fn = 32); } module body() { rotate([rear_angle-90, 0, 0]) translate([0, -sqrt(pow(base_d*base_y_scale/2,2) - pow(base_w*base_y_scale/2,2)), 0]) difference() { // outer cylinder scale([1, base_y_scale, 1]) cylinder(r = base_d/2, h = base_l); // cut the sides for (i = [-1, 1]) scale ([i, 1, 1]) translate([base_w/2, -infty/2, -infty/2]) cube(infty); // cut the rear translate([-infty/2, -infty, -infty/2]) cube(infty); } // wheel axle cubes for (i = [-1, 1]) scale([i, 1, 1]) translate([wheel_base/2 - wheel_axle_cube, wheel_h - wheel_axle_cube/2, 0]) cube(wheel_axle_cube); // rear beams for (i = [-1, 1]) scale([i,1,1]) hull() { translate([-(base_w/2-beam_w/2), spring_dist, 0]) rear_cyl(); translate([wheel_base/2-beam_w/2, wheel_h, 0]) rear_cyl(); } // spring top hull() { for (j = [-1, 1]) translate([j*(base_w/2-beam_w/2), spring_dist, 0]) rear_cyl(); } // spring sides for (i = [-1, 1]) scale([i,1,1]) hull() { translate([(base_w/2+beam_w), 0, 0]) rear_cyl(); translate([(base_w/2-beam_w/2), spring_dist, 0]) rear_cyl(); } // front beams for (i = [-1, 1]) scale([i,1,1]) for (j = [-1, 1]) hull() { translate([j*(base_w/2-beam_w/2), (base_l-top_beam_h)*cos(rear_angle), (base_l-top_beam_h)*sin(rear_angle)]) top_cyl(); translate([wheel_base/2-beam_w/2, wheel_h, 0]) front_cyl(); } // spring rear clip translate([-spring_clip_w/2, 0, 0]) cube([spring_clip_w, spring_clip_l, base_wall]); // spring clip sides for (i = [-1, 1]) scale([i,1,1]) hull() { translate([(base_w/2-beam_w/2), 0, 0]) rear_cyl(); translate([(base_w/2-beam_w/2), spring_clip_l - 1.5*beam_w, 0]) rear_cyl(); } } difference() { body(); // inner cylinder hole rotate([+rear_angle-90, 0, 0]) translate([0, -sqrt(pow(base_d*base_y_scale/2,2) - pow(base_w*base_y_scale/2,2)), -infty/2]) scale([1, 1*base_y_scale, 1]) cylinder(r = base_d/2 - base_wall, h = infty); // cut the bottom translate([-infty/2, -infty/2, -infty]) cube(infty); // wheel axle hole translate([-infty/2, wheel_h, wheel_axle_cube/2]) rotate([0, 90, 0]) cylinder(r = axle_hole/2, h = infty); }