ball_radius = 2.875; ball_center_height = 1.65; top_face_difference = 0.7; ball_z_scale_factor = 1; //ball_z_scale_factor = 0.94; vertices = [ [0, 0, 0], [5, 0, 0], [0, 5, 0], [5, 5, 0], [top_face_difference, top_face_difference, 4], [top_face_difference, 5-top_face_difference, 4], [5-top_face_difference, top_face_difference, 4], [5-top_face_difference, 5-top_face_difference, 4], ]; pyramid_faces = [ ([0, 1, 3, 2]), ([4, 5, 7, 6]), ([0, 4, 6, 1]), r([0, 4, 5, 2]), r([1, 3, 7, 6]), ([2, 3, 7, 5]), ]; function r(v) = [for (i = [len(v)-1 : -1 : 0]) v[i]]; function transpose(m) = [ for(j=[0:len(m[0])-1]) [ for(i=[0:len(m)-1]) m[i][j] ] ]; function transformation_matrix(A, B, C, D) = let (v1 = B - A, v2 = (C+D)/2 - (A+B)/2, v3 = cross(v1, v2)) transpose([v1 / norm(v1), v2 / norm(v2), v3 / norm(v3)]); function center4(A, B, C, D) = (A + B + C + D) / 4; module pyramid() { polyhedron(vertices, pyramid_faces); } module transform_on_quadrangle(A, B, C, D) { translate(center4(A, B, C, D)) multmatrix(transformation_matrix(A, B, C, D)) children(); } module ball() { translate([2.5, 2.5, ball_center_height]) { scale([1, 1, ball_z_scale_factor]) sphere(ball_radius, $fn=100); } } module holes_by_points(points, scale_factor=0.9) { for (point = points) { translate([scale_factor * point[0], scale_factor * point[1], 0]) sphere(0.375, $fn=50); } } module holes() { one_point = [ [0, 0], ]; two_points = [ [-1, -1], [1, 1], ]; three_points = [ [-1, -1], [0, 0], [1, 1], ]; four_points = [ [-1, -1], [-1, 1], [1, -1], [1, 1], ]; five_points = [ [-1, -1], [-1, 1], [0, 0], [1, -1], [1, 1], ]; six_points = [ [-1, -1], [-1, 0], [-1, 1], [1, -1], [1, 0], [1, 1], ]; transform_on_quadrangle(vertices[0], vertices[1], vertices[2], vertices[3]) holes_by_points(six_points); transform_on_quadrangle(vertices[4], vertices[5], vertices[7], vertices[6]) holes_by_points(one_point); transform_on_quadrangle(vertices[0], vertices[1], vertices[4], vertices[6]) holes_by_points(two_points); transform_on_quadrangle(vertices[2], vertices[3], vertices[5], vertices[7]) holes_by_points(five_points); transform_on_quadrangle(vertices[0], vertices[2], vertices[4], vertices[5]) holes_by_points(three_points); transform_on_quadrangle(vertices[1], vertices[3], vertices[6], vertices[7]) holes_by_points(four_points); } intersection() { difference() { pyramid(); holes(); } ball(); }