$fn = 64; // --- Parameters --- cable_diameter = 6; // Size of the cable to hold head_width = 36; // Overall width parameter for cutouts module dragon_head() { difference() { union() { // Main Head / Cheeks hull() { translate([-10, 0, 15]) sphere(r=18); translate([10, 0, 12]) sphere(r=14); } // Top of Head hull() { translate([-10, 0, 15]) sphere(r=18); translate([0, 0, 28]) sphere(r=15); } // Upper Jaw / Snout hull() { translate([0, 0, 28]) sphere(r=15); translate([25, 0, 28]) sphere(r=10); translate([38, 0, 26]) sphere(r=5); } // Lower Jaw (rests on the desk) hull() { translate([-5, 0, 5]) sphere(r=14); translate([25, 0, 6]) sphere(r=8); translate([35, 0, 8]) sphere(r=4); } // Horns for(side = [-1, 1]) { // Primary horns hull() { translate([-5, side*10, 25]) sphere(r=4); translate([-25, side*18, 45]) sphere(r=1); } // Secondary small horns hull() { translate([-10, side*14, 15]) sphere(r=3); translate([-22, side*22, 25]) sphere(r=1); } } // Brow Ridges for(side = [-1, 1]) { hull() { translate([8, side*8, 32]) sphere(r=4); translate([20, side*8, 32]) sphere(r=3); } } // Central Scales / Spikes for(i = [0:2]) { hull() { translate([-5 + i*10, 0, 28]) sphere(r=3); translate([-12 + i*10, 0, 42 - i*2]) sphere(r=1); } } } // --- Subtractions --- // Cable Resting Channel (Throat) // Positioned deep in the mouth to hold the cable securely translate([8, 0, 16]) rotate([90, 0, 0]) cylinder(h=head_width + 20, r=cable_diameter/2, center=true); // Mouth Opening / Cable Insertion Slot // Creates a V-shape opening from the throat to the front hull() { // Slightly narrower than cable for a "snap" fit translate([8, 0, 16]) rotate([90, 0, 0]) cylinder(h=head_width + 20, r=(cable_diameter * 0.85)/2, center=true); // Open wide at the front lips translate([45, 0, 26]) cube([1, head_width + 20, 1], center=true); // Upper lip limit translate([45, 0, 10]) cube([1, head_width + 20, 1], center=true); // Lower lip limit } // Eye Sockets for(side = [-1, 1]) { translate([14, side*11, 26]) sphere(r=3.5); } // Nostrils for(side = [-1, 1]) { translate([35, side*4, 25]) rotate([0, 50, 0]) cylinder(h=10, r=1.5); } // Flatten the bottom for 3D printing // Cuts off everything below Z=0 to ensure perfect bed adhesion translate([0, 0, -50]) cube([150, 150, 100], center=true); } } // Render the model dragon_head();