/ examples / tetrapod_doll.scad
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  }