// sphere diameter d = 30; cutoff = 3; c = 3; base = 10; screw_len = 0.8 * (d - 2*cutoff); screw_dia = 25.4/4; mount_screw_dia = 3; mount_screw_head_dia = 8; e = 0.01; $fn = 500; module screw() { cylinder(r=screw_dia/2, h=screw_len); } module ball() difference() { sphere(d/2); # translate([0, 0, d/2 - cutoff - screw_len + e]) screw(); for (i = [-1,1]) translate([0, 0, i * (d - cutoff)]) cube(d, center=true); } module shell() { difference() { // sphere with cylinder to bottom mirror([0, 0, 1]) assign(r2=d/2+c) union() { sphere(r=r2); cylinder(r=r2, h=r2 + base); } // hollow out the sphere sphere(d/2); // add intro region translate([0, 0, d]) cube([d-2*cutoff, d*2, 2*d], center=true); // mounting screw hole assign(rs=mount_screw_dia) assign(rh=mount_screw_head_dia) union() { cylinder(r=rs/2, h=3*(d+base), center=true); # translate([0, 0, -d/2-rh]) cylinder(r1=0, r2=rh/2, h=rh); translate([0, 0, -d/2 ]) cylinder(r=rh/2, h=d); } } } union() { shell(); translate([0,0,20]) rotate([90, 0, 90]) ball(); }