From a5998429331c54d19efcd890a91cba76e7e5a00a Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 8 Aug 2021 20:26:36 +0800 Subject: [PATCH] add caterpillar --- examples/caterpillar.scad | 220 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 220 insertions(+) create mode 100644 examples/caterpillar.scad diff --git a/examples/caterpillar.scad b/examples/caterpillar.scad new file mode 100644 index 00000000..25c2dc2d --- /dev/null +++ b/examples/caterpillar.scad @@ -0,0 +1,220 @@ +use ; +use ; +use ; + +$fn = 96; + +module track(radius) { + module wheels(radius) { + module wheel() { + rotate_extrude() + translate([radius, 0, 0]) + circle(radius / 2); + } + + for(i = [0:4:8]) { + translate([radius * i, 0, 0]) + wheel(); + } + } + + module track_profile() { + hull() { + circle(1.7 * radius ); + translate([radius * 8, 0, 0]) + circle(1.7 * radius); + } + } + + translate([-radius * 4, 0, -radius]) + scale([1, 1, 1.5]) { + color("black") + linear_extrude(radius * 1.5) + hollow_out(shell_thickness = 0.45 * radius) + track_profile(); + + color("white") + translate([0, 0, radius * 0.75]) + scale([1, 1, 1.5]) + wheels(radius); + } +} + +module body(radius) { + module eye() { + translate([-radius / 15, 0, 0]) + rotate([0, 0, 90]) + arc(radius / 2, [0, 180], radius / 5, width_mode = "LINE_OUTWARD"); + + translate([0, radius / 3, 0]) + circle(radius / 3); + } + + module eyebrow() { + rotate([0, 0, 90]) + arc(radius / 1.25, [25, 155], radius / 10, width_mode = "LINE_OUTWARD"); + } + + scale([1, 1, 0.9]) { + color("yellow") + sphere(radius * 4); + + color("Aqua") + rotate([85, 0, 90]) + intersection() { + linear_extrude(radius * 4.5) + pie(radius * 3.5, [0, 180]); + difference() { + sphere(radius * 4 + radius / 5); + sphere(radius * 4); + } + } + + // eyes + color("black") { + rotate([0, 65, 16]) + linear_extrude(radius * 4.25) + eye(); + + rotate([0, 65, -16]) + linear_extrude(radius * 4.25) + eye(); + } + + // eyebrows + color("black") { + rotate([0, 55, 20]) + linear_extrude(radius * 4.25) + eyebrow(); + + rotate([0, 55, -20]) + linear_extrude(radius * 4.25) + eyebrow(); + } + } +} + +module arm(radius) { + translate([0, 0, -radius]) { + translate([0, 0, radius / 2]) + linear_extrude(radius) { + translate([0, -radius * 0.75, 0]) + square([radius * 9, radius * 1.5]); + rotate(80) + translate([0, -radius * 0.5, 0]) + square([radius * 9, radius]); + } + + translate([0, 0, radius * 0.25]) + linear_extrude(radius * 1.5) + circle(radius); + + linear_extrude(radius * 2) + translate([radius * 9, 0, 0]) + circle(radius); + } +} + +module glove(radius) { + scale([0.8, 0.8, 1.2]) { + color("white") { + hull() { + scale([1.1, 1, 0.5]) + sphere(radius * 2.5); + + translate([-radius * 1.75, 0, radius / 1.5]) + scale([1, 1.75, 0.8]) + sphere(radius); + } + + translate([-radius * 2.5, 0, radius / 1.5]) + scale([1.2, 2, 1]) + sphere(radius); + + rotate(-10) + translate([0, -radius * 2.5, 0]) + scale([1.75, 1, 0.8]) + sphere(radius / 1.5); + } + + color("black") + intersection() { + scale([1.1, 1, 0.55]) + sphere(radius * 2.5); + + union() { + translate([0, radius * 0.75, -radius * 2]) + linear_extrude(radius) + square([radius * 2, radius / 4], center = true); + + translate([0, -radius * 0.75, -radius * 2]) + linear_extrude(radius) + square([radius * 2, radius / 4], center = true); + } + } + } +} + +module big_caterpillar(radius) { + translate([0, -radius * 4, 0]) + rotate([90, 0, 0]) + track(radius); + + translate([0, 0, radius * 3]) + body(radius); + + translate([0, radius * 4, 0]) + rotate([90, 0, 0]) + track(radius); + + color("yellow") + translate([radius * 6, -radius * 4.5, radius * 9.5]) + rotate([90, 135, 0]) + arm(radius); + + translate([radius * 10.75, -radius * 4.5, radius / 2.325]) + rotate([0, 70, 180]) + glove(radius); +} + +module small_caterpillar(radius) { + body_pts = [ + [0, 0, -radius / 3], + [radius * 1.5, 0, 0], + [radius * 3, 0, radius], + [radius * 4.25, 0, radius * 2] + ]; + + color("LimeGreen") + for(p = body_pts) { + translate(p) + sphere(radius); + } + + module eye() { + color("white") + translate([0, 0, 0]) + sphere(radius / 1.5); + color("black") + translate([.5 * radius, radius / 4, 0]) + sphere(radius / 3); + color("white") + translate([.655 * radius, radius / 2.75, 0]) + sphere(radius / 6); + } + + half_r = radius / 2; + translate([radius * 4.75, 0, radius * 3]) { + translate([0, half_r, 0]) eye(); + translate([0, -half_r, 0]) eye(); + } +} + +module caterpillars(radius) { + big_caterpillar(radius); + translate([radius * 3.5, -radius * 4.5, radius * 9.75]) + rotate([0, -15, 0]) + scale([0.8, 0.8, 0.8]) small_caterpillar(radius); +} + +caterpillars(5); \ No newline at end of file