use ; include ; //these values were mostly determined by manually finetuning them t = 5; a = 41.186; //arctan(7/8) mod = function (t) 12*t^2*(1-t)^2+1; ctrl_0 = angl_to_ctrl([-30.5,0]+t*[1,0], 180, [-30.5,0]+t*[-cos(a-25),-sin(a-25)], a-25, mod = 0.5); ctrl_1 = angl_to_ctrl([-23.6,7]+t*[1,0], 180, [-23.6,7]+t*[-cos(a+180), -sin(a+180)], a+180); ctrl_2 = angl_to_ctrl([-8,37]+t*[1,0], 180, [-8.5,37]+t*[0,-1], 75, mod = 0.5); ctrl_3 = angl_to_ctrl([-7.3,44]+t*[1,0], 180, [-7.3,44]+t*[0,1], 270, mod = 0.5); rectangle_r = [[1.5,0],[1.5,6],[0,6],[0,0]]; rectangle_l = [[0,0],[0,6],[-1.5,6],[-1.5,0]]; //a1, a2, a3, a4 are the four angles of the pairs of hinges on the ear from bottom to tip module dogearAllOptions(a1, a2, a3, a4){ translate([25,0,0]){ union(){ bezier_extrude(ctrl = ctrl_0, shape = rectangle_r, sections = 8); bezier_extrude(ctrl = ctrl_1, shape = rectangle_l, mod_x = mod, sections = 8); bezier_extrude(ctrl = ctrl_2, shape = rectangle_r, mod_x = mod, sections = 8); bezier_extrude(ctrl = ctrl_3, shape = rectangle_l, mod_x = mod, sections = 8); //translate([-8,37,0]) cube([10,10,20]); linear_extrude(height = 6, center = false, convexity = 10){ polygon(points = [[-33,0],[-25,0],[-25,7]]); } hinge(a1, len_before = 25, len_after = 5.5); translate([12.5,0,0]) hinge(a2, len_after = 5.5); translate([25,0,0]) hinge(a3, len_after = 5.5); translate([0,37,0]) hinge(a1, len_before = 8, len_after = 5.5); translate([12.5,37,0]) hinge(a2, len_after = 5.5); translate([25,37,0]) hinge(a3, len_after = 8); translate([34,0,0]){ cube([7,18.5,6]); translate([3.5,18.5,0]) cylinder(h = 6, r = 3.5, center = false, $fn=32); } translate([40,40.5,0]) cylinder(h = 6, r = 3.5, center = false, $fn=32); translate([53,0,0]) cube([24,7,6], center = false); translate([40,11,0]){ rotate(-45,[0,0,1]){ hinge(a4, len_before = 7, len_after = 7); translate([14.1,3.5,0]){ cylinder(h = 6, r = 3.5, center = false, $fn=32); } translate([0,17.3,0]) hinge(a4, len_before = 21, len_after = 24.6); translate([31.4,20.8,0]) cylinder(h = 6, r = 3.5, center = false, $fn=32); } } } } } module dogear(flopness){ a1 = 30; a2 = 30; a3 = 30; a4 = 45; if(flopness == "vvvflop"){ a1 = 45; a2 = 45; a3 = 45; dogearAllOptions(a1, a2, a3, a4); } else{ if(flopness == "vvflop"){ a1 = 40; a2 = 40; a3 = 40; dogearAllOptions(a1, a2, a3, a4); } else{ if(flopness == "vflop"){ a1 = 35; a2 = 35; a3 = 35; dogearAllOptions(a1, a2, a3, a4); } else{ if(flopness == "lflop"){ a1 = 15; a2 = 15; a3 = 15; a4 = 30; dogearAllOptions(a1, a2, a3, a4); } else{ dogearAllOptions(a1, a2, a3, a4); } } } } }