Skip to content

Instantly share code, notes, and snippets.

@ssttevee
Created December 19, 2022 00:51
Show Gist options
  • Select an option

  • Save ssttevee/82968f84dd42249191679f1a3282282f to your computer and use it in GitHub Desktop.

Select an option

Save ssttevee/82968f84dd42249191679f1a3282282f to your computer and use it in GitHub Desktop.
scad model for infinity cube #scad
cube_size = 20;
edge_bevel = 4;
corner_bevel = 4;
spacing = 0.4;
hinge_thickness = 8;
hinge_width = 10;
pillar_diameter = 4;
// END OF CONFIGURATION
cube_offset = cube_size + spacing;
hinge_offset = cube_size - hinge_thickness;
hinge_length = hinge_thickness * 2 + spacing;
hinge_positions = [
// [rotation, translation, multiplier for extra spacing along pillar axis]
[[90, 0, 90], [cube_offset/2, -hinge_offset/2, 0], 0],
[[90, 0, 90], [cube_offset/2, -hinge_offset/2, cube_offset], 0],
[[90, 0, 90], [cube_offset*5/2, -hinge_offset/2, 0], 0],
[[90, 0, 90], [cube_offset*5/2, -hinge_offset/2, cube_offset], 0],
[[90, 0, 0], [cube_offset/2, hinge_offset/2, 0], 0],
[[90, 0, 0], [cube_offset/2, hinge_offset/2, -cube_offset*3], 0],
[[0, 0, 90], [cube_offset*3/2, hinge_offset/2, 0], 1],
[[0, 0, 90], [cube_offset*3/2, -hinge_offset/2 - cube_offset, 0], 1],
];
difference() {
for (x = [0:1]) for (y = [0:3]) translate([cube_offset * x, cube_offset * y, 0]) beveled_cube(cube_size, edge_bevel, corner_bevel);
// uncomment this to chop off the top for debugging the hinge
// translate([-cube_size/2-1, -cube_size/2-1, hinge_width/2]) cube(100);
for (pos = hinge_positions) rotate(pos[0]) translate(pos[1]) hinge(space = true, outer_spacing = spacing * pos[2]);
}
for (pos = hinge_positions) rotate(pos[0]) translate(pos[1]) hinge(outer_spacing = pos[2]);
module hinge(space = false, outer_spacing = 0) {
padding = (space ? 1 : -1) * spacing;
radius = hinge_thickness/2;
translate([-(hinge_length + spacing)/2, 0, 0]) linear_extrude(hinge_width + padding + (space ? 1 : -1) * outer_spacing, center = true) difference() {
if (space) {
translate([-spacing, -(radius + spacing), 0]) square([hinge_length + spacing * 2, hinge_thickness + spacing * 2]);
} else {
union() {
translate([radius, 0, 0]) circle(r = radius, $fn = 50);
translate([hinge_length - radius, 0, 0]) circle(r = radius, $fn = 50);
translate([radius, -radius, 0]) square([hinge_length - hinge_thickness, hinge_thickness]);
}
}
translate([hinge_thickness/2, 0, 0]) circle(d=pillar_diameter - padding, $fn = 50);
translate([hinge_length - hinge_thickness/2, 0, 0]) circle(d=pillar_diameter - padding, $fn = 50);
}
}
module beveled_cube(cube_size, edge_bevel, corner_bevel) {
half = cube_size/2;
beveled_face_size = half - sqrt((corner_bevel ^ 2) / 2);
difference() {
cube(cube_size, center = true);
for (j = [0:2]) for (i = [0:3]) rotate([45 + i * 90, j == 1 ? 90 : 0, j == 2 ? 90 : 0]) translate([0, sqrt((half ^ 2) * 2), 0]) cube([cube_size + 1, edge_bevel, edge_bevel], center = true);
for (z = [0:1]) for (x = [0:90:270]) rotate([x, 0, 180*z]) {
right = [half, beveled_face_size, beveled_face_size];
top = [beveled_face_size, beveled_face_size, half];
left = [beveled_face_size, half, beveled_face_size];
polyhedron(
[
// corner of the cube
[half, half, half],
// other corners need to be extended to cover the edges of the cube
right + (right - ((top - left)/2 + left)) * 2,
top + (top - ((left - right)/2 + right)) * 2,
left + (left - ((right - top)/2 + top)) * 2,
],
[
[0, 1, 2],
[1, 3, 2],
[2, 3, 0],
[3, 1, 0],
]
);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment