tetrapod_doll.scad
1 use <rounded_cylinder.scad> 2 use <polyhedra/geom_tetrahedron.scad> 3 use <util/rand.scad> 4 use <pp/pp_poisson2.scad> 5 6 radius = 20; 7 $fn = 6; // multiples of 6 8 model = "DOLL"; // [DOLL, EYES] 9 10 if($preview) { 11 points = pp_poisson2([150, 150], radius * 2.25); 12 for(p = points) { 13 translate(p) 14 rotate(rand(-25, 25)) 15 tetrapod_doll(); 16 } 17 } 18 else { 19 tetrapod_doll(); 20 } 21 22 module tetrapod_doll() { 23 function __angy_angz(p1, p2) = 24 let(v = p2 - p1) 25 [ 26 atan2(v.z, norm([v.x, v.y])), 27 atan2(v.y, v.x) 28 ]; 29 30 module doll() { 31 vertices = geom_tetrahedron(radius = radius)[0]; 32 33 ayz = __angy_angz(vertices[0], [0, 0, 0]); 34 35 color(rands(0, 1, 3)) 36 difference() { 37 rotate([0, 90 - ayz[0], 0]) 38 rotate(ayz[1]) 39 for(p = vertices) { 40 ayz = __angy_angz(p, [0, 0, 0]); 41 42 rotate([0, 90 + ayz[0], ayz[1]]) 43 translate([0, 0, 2 / 4.158]) 44 rounded_cylinder( 45 radius = [radius * .4, radius * .275], 46 h = radius, 47 round_r = 2 48 ); 49 } 50 51 rotate(40) 52 translate([radius * .2, 0, radius * .6]) 53 scale(1.05) 54 eye(); 55 56 rotate(-40) 57 translate([radius * .2, 0, radius * .6]) 58 scale(1.05) 59 eye(); 60 } 61 } 62 63 module eye() { 64 color("white") 65 difference() { 66 translate([radius / 5.75 / 2, 0, 0]) 67 sphere(radius / 5.75, $fn = 48); 68 translate([-radius / 2, 0, 0]) 69 cube(radius, center = true); 70 } 71 } 72 73 if($preview) { 74 doll(); 75 76 rotate(40) 77 translate([radius * .2, 0, radius * .6]) 78 eye(); 79 80 rotate(-40) 81 translate([radius * .2, 0, radius * .6]) 82 eye(); 83 84 color("black") 85 rotate([rand(-3, 3), rand(-3, 3), 30 + rand(-3, 3)]) 86 translate([radius * .2, 0, radius * .6]) 87 translate([radius / 5, 0, 0]) 88 sphere(radius / 5.75 / 2, $fn = 48); 89 90 color("black") 91 rotate([rand(-3, 3), rand(-3, 3), -30 + rand(-3, 3)]) 92 translate([radius * .2, 0, radius * .6]) 93 translate([radius / 5, 0, 0]) 94 sphere(radius / 5.75 / 2, $fn = 48); 95 } 96 else { 97 if(model == "DOLL") { 98 doll(); 99 } 100 else { 101 translate([radius, 0, 0]) 102 rotate([0, -90, 0]) 103 eye(); 104 105 translate([radius * 1.5, 0, 0]) 106 rotate([0, -90, 0]) 107 eye(); 108 } 109 } 110 }