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 }