/ examples / dragon / torus_knot_dragon_and_pearl.scad
torus_knot_dragon_and_pearl.scad
  1  use <torus_knot.scad>
  2  use <along_with.scad>
  3  use <util/reverse.scad>
  4  use <dragon_head.scad>
  5  use <dragon_scales.scad>
  6  use <dragon_foot.scad> 
  7  use <fibonacci_lattice.scad>
  8  use <polyhedron_hull.scad>
  9  use <path_extrude.scad>
 10  use <bezier_curve.scad>
 11  
 12  torus_knot_dragon_and_pearl();
 13  
 14  module torus_knot_dragon_and_pearl() {
 15      phi_step = 0.0525;
 16  
 17      body_r = 6;
 18      body_fn = 12;
 19      scale_fn = 8;
 20      scale_tilt_a = 3;
 21  
 22      knot = torus_knot(2, 3, phi_step);
 23      d_path = reverse([for(i = [6:len(knot) - 4]) knot[i]]);
 24      
 25      one_body_scale_data = one_body_scale(body_r, body_fn, scale_fn, scale_tilt_a);
 26      along_with(d_path, scale = [0.6, 0.6, 0.85], method = "EULER_ANGLE")    
 27      scale(0.06)
 28          one_segment(body_r, body_fn, one_body_scale_data);
 29  
 30      function __angy_angz(p1, p2) = 
 31          let(
 32              dx = p2[0] - p1[0],
 33              dy = p2[1] - p1[1],
 34              dz = p2[2] - p1[2],
 35              ya = atan2(dz, sqrt(dx * dx + dy * dy)),
 36              za = atan2(dy, dx)
 37          ) [ya, za];
 38          
 39      h_angy_angz = __angy_angz(d_path[len(d_path) - 2], d_path[len(d_path) - 1]);
 40      
 41  	translate([2.5, -1.2, .65])
 42      scale(0.06)    
 43      rotate([0, h_angy_angz[0] + 28, h_angy_angz[1] + 247])
 44          dragon_head();
 45          
 46      t_angy_angz = __angy_angz(d_path[1], d_path[0]);    
 47      
 48  	translate([2.09, 1.56, -.82])
 49  	rotate([0, t_angy_angz[0], t_angy_angz[1]])
 50  	rotate([0, -98, -70])
 51  	scale([0.038, 0.038, 0.065])
 52      rotate([0, 0, 200])
 53  	    tail();
 54  
 55      // pearl
 56      polyhedron_hull(fibonacci_lattice(66, .5));
 57      
 58      // feet
 59      translate([.10, -1, .225])
 60      rotate([7, -7.5, 26])
 61      scale(0.0475)
 62          foot();
 63  
 64      translate([.4, -1.75, .6])
 65      rotate([30, -60, -45])
 66      mirror([0, 1, 0])
 67      scale(0.0475)
 68          foot();
 69  
 70      translate([-1.6, .55, .49])
 71      rotate([0, 0, 150])
 72      mirror([0, 1, 0])
 73      scale(0.045)
 74          foot();
 75  
 76      translate([-1.9, .5, .745])
 77      rotate([-45, -30, -120])
 78      scale(0.045)
 79          foot();
 80  }
 81  
 82  module one_segment(body_r, body_fn, one_scale_data) {
 83      // scales
 84      rotate([-90, 0, 0])
 85          dragon_body_scales(body_r, body_fn, one_scale_data);
 86  
 87  
 88      points = [[0, 0, 0], [0, .1, 1], [0, 1, 1.5]] * 5.5;
 89      path = bezier_curve(0.1, points);
 90  
 91      // dorsal fin
 92      translate([0, 3.2, -3]) 
 93      rotate([-65, 0, 0]) 
 94      path_extrude([[0, -.25], [0.5, 0], [0, .75], [-0.5, 0]] * 5.5, path, scale = .05);        
 95              
 96      // belly    
 97      translate([0, -2.5, .8]) 
 98      rotate([-5, 0, 0]) 
 99      scale([1, 1, 1.4])  
100          sphere(5.8, $fn = 8); 
101      
102  }
103  
104  module tail() {
105      $fn = 8;
106      tail_scales(75, 2.5, 4.25, -4, 1.25);
107      tail_scales(100, 1.25, 4.5, -7, 1);
108      tail_scales(110, 1.25, 3, -9, 1);
109      tail_scales(120, 2.5, 2, -9, 1);   
110      translate([3, 0, -2.5])
111      rotate([0, 0, 0])
112      scale([.8, .8, 1])
113      hair();
114  
115      module hair() {
116          tail_hair = [
117              [3, -1],
118              [5, -1.5],
119              [8, -1],
120              [9.5, 0],
121              [8, -0.4],
122              [6.5, -0.3],
123              [8, 0],
124              [10, 1],
125              [14, 5],
126              [17, 10],
127              [14, 8],
128              [12, 7],
129              [9, 6],
130              [11.5, 10],
131              [13, 12],
132              [16, 14],
133              [12, 13],
134              [8, 11],
135              [10, 14],
136              [5, 11],
137              [3, 8.5],
138              [-1, 3]
139          ];
140  
141          rotate([-2.5, 0, 0])
142          translate([-1, .5, 5.5])
143          scale([1.1, 1, 1.3]) {
144              translate([2, 0, -3])
145              scale([2, 1, .8])
146              rotate([-90, 70, 15])
147              linear_extrude(.75, center = true)
148                  polygon(tail_hair);
149  
150              scale([.8, .9, .6])
151              translate([2, 0, -5])
152              scale([1.75, 1, .8])
153              rotate([-90, 70, 15]) {
154                  linear_extrude(1.5, scale = 0.5)
155                      polygon(tail_hair);
156                  mirror([0, 0, 1])
157                  linear_extrude(1.5, scale = 0.5)
158                      polygon(tail_hair);
159              }
160  
161              scale([.6, .7, .9])
162              translate([2, 0, -4])
163              scale([2, 1, .85])
164              rotate([-90, 70, 15]) {
165                  linear_extrude(3.5, scale = 0.5)
166                      polygon(tail_hair);
167                  mirror([0, 0, 1])
168                  linear_extrude(3.5, scale = 0.5)
169                      polygon(tail_hair);
170              }
171          }    
172      }
173  }