Two more trefoil conformations - as a petal knot (all crossings line up along one center stem) and a tight knot (with the smallest amount of rope length possible given its diameter):
STL file for petal: http://www.geekhaus.com/makerhome/day152_trefoil_petal_40_25_3.stl
STL file for tight: http://www.geekhaus.com/makerhome/day152_trefoil_minimumrope_25.stl
Thingiverse link: http://www.thingiverse.com/thing:234107
Settings: MakerWare .3mm/low in 20-25 minutes for the petal knot and even less for the tight knot, with the minimum-support custom slicing profile for knots described on Day 110.
Technical notes, math flavor: The beautiful petal knot conformation is from the paper Bounds on Übercrossing and Petal Numbers for Knots by Colin Adams at Williams College and his amazing team of student researchers. In this work Adams, et al made the startling decision to study "petal" projections of knots where the crossings occur all on top of each other in one place! This is a wild and crazy idea compared to the usual notion that we should look at knot projections where crossings happen nicely and one at a time. But this crazy idea bore some amazing fruit: they proved that every knot admits a petal projection, and went on to discover deep connections between the übercrossing number of knots and other traditional invariants such as crossing and unknotting numbers. I know I'm not supposed to have favorites, but of the eight trefoil knots I am printing in this collection, this is by far my favorite. It's beautiful and surprising each time you turn the knot over and the perspective shifts from one-crossing-at-a-time to all-crossings-lined-up-at-once. Wonderful! See the OpenSCAD code below if you want a (piecewise) parametrization of this knot.
Minimum-length rope knot conformations of the tiny trefoil aren't the most impressive, but for higher-crossing knots they are fascinating, and what started my journey with 3D printing last year. Jason Cantarella at the University of Georgia and Eric Rawdon at the University of St. Thomas, together with some students, have been investigating "tight" knots since their paper Knot Tightening by Constrained Gradient Descent in which they used their ridgerunner algorithm to find minimal conformations of a large number of knots. The data they made available with this paper was what helped me model my first 3D-printable knot models (for example, see Day 9, Day 11, Day 66, and Day 67).
Technical notes, OpenSCAD flavor: By the time of this posting, kitwallace and the GitHub OpenSCAD community had improved this code significantly; see kitwallace's excellent post at his blog The Wallace Line. However the new code requires the new 2014.01.04 snapshot of OpenSCAD, which does not want to work on my machine at the moment. Therefore I will post the old, slow code. It works but it ain't fast. In fact, it ain't pretty either, since getting Adams' petal knot parametrization to work in OpenSCAD required creating a very clunky piecewise function, as you will see in the code below. And it just gets worse for the tight knot; I have a very inefficient piece of code that takes 50 coordinates from Cantarella's data and connects the dots with hulled pairs of spheres. I am sure a nice loop would have made quicker work of the problem, but at the time my clunky mess of code was easier to write. I've put that code under the fold so you have to click through to see my code of shame.
// mathgrrl parametric knots
// tubify module based on tube module from kitwallace
// choose the knot you want and comment out the rest
// trefoil as petal knot
// http://arxiv.org/pdf/1311.0526v1.pdf
// based on mma algorithm from Adams, need to do z-coord in cases
// scaled to 40mm before tubifying
tempstep = .005; //.005/1 is 2/360
function g(t,a,b,u,v) =
[ 3.5*5*cos(180*t)*sin(5*180*t),
3.5*5*sin(180*t)*sin(5*180*t),
8*u*(cos(180*(((5*t-a+1)%5)-1)/2))*(cos(180*(((5*t-a+1)%5)-1)/2))
+ 8*v*(cos(180*(((5*t-b+1)%5)-1)/2))*(cos(180*(((5*t-b+1)%5)-1)/2))
];
translate([0,0,-24])
union(){
color("red")
for (t=[1: tempstep: 1.2-tempstep]) { //replacement for 0 to .2
hull() {
translate(g(t,5,1,4,1)) sphere(2.5);
translate(g(t+tempstep,5,1,4,1)) sphere(2.5);
}
}
color("orange")
for (t=[.2: tempstep: .4]) { //also why here?
hull() {
translate(g(t,1,2,1,3)) sphere(2.5);
translate(g(t+tempstep,1,2,1,3)) sphere(2.5);
}
}
color("yellow")
for (t=[.4: tempstep: .6]) {
hull() {
translate(g(t,2,3,3,5)) sphere(2.5);
translate(g(t+tempstep,2,3,3,5)) sphere(2.5);
}
}
color("green")
for (t=[.6: tempstep: .8]) {
hull() {
translate(g(t,3,4,5,2)) sphere(2.5);
translate(g(t+tempstep,3,4,5,2)) sphere(2.5);
}
}
color("blue")
for (t=[.8: tempstep: 1]) {
hull() {
translate(g(t,4,5,2,4)) sphere(2.5);
translate(g(t+tempstep,4,5,2,4)) sphere(2.5);
}
}
}
Welcome to MakerHome
We've completed our yearlong print-a-day project!
All new material is now at Hacktastic: www.mathgrrl.com
Saturday, January 25, 2014
Friday, January 24, 2014
Day 151 - Fourier and tritangentless trefoil knots
Continuing our collection of trefoil knots, today we printed a trefoil in a Fourier-(1,1,2) knot conformation and a trefoil knot in a tritangentless conformation. In other words, the first trefoil knot in the picture below is a curve traced out by a collection of cosine functions (1 in the x-coordinate, 1 in the y-coordinate, and 2 in the z-coordinate), and the second has the property that no plane is tangent to three places on the curve at the same time (making this a rocking/rolling knot as seen on Day 110).
STL file for Fourier-(1,1,2): http://www.geekhaus.com/makerhome/day151_trefoil_fourier112_40_25_3.stl
STL file for tritangentless: http://www.geekhaus.com/makerhome/day151_trefoil_tritangentless_40_25_3.stl
Thingiverse link: http://www.thingiverse.com/thing:234107
Settings: MakerWare .3mm/low in 20-25 minutes per knot, with the minimum-support custom slicing profile for knots described on Day 110.
Technical notes, math flavor: A Fourier-(1,1,2) knot is one that can be parametrized as
The tritangentless conformation is a variant of the parametrization of the trefoil that appears in the paper Trefoil knots without tritangent planes by H.R. Morton at the University of Liverpool. For more information see Day 110, and for the explicit equations see the OpenSCAD code below.
Technical notes, OpenSCAD flavor: The code below was based on kitwallace's code from his Rolling Knot on Thingiverse. It's slow to render with F6, taking nearly a half an hour to get a model with step size 3 (which is 120 steps). The code is written so that you can size your knot before setting the strand thickness, which allows us to scale up models without affecting the thickness of the strand.
// mathgrrl parametric knots - fourier and tritangentless trefoils
// tubify module based on tube module from kitwallace
// remove comments for the one you want to compile
/*
// 3_1 tritangentless conformation
// http://blms.oxfordjournals.org/content/23/1/78.full.pdf
a = 0.8;
b = sqrt (1 - a * a);
function f(t) =
[ 8.7 * a * cos (3 * t) / (1 - b* sin (2 *t)),
8.7 * a * sin( 3 * t) / (1 - b* sin (2 *t)),
8.7 * 1.8 * b * cos (2 * t) /(1 - b* sin (2 *t))
];
// create the knot with given radius and step
tubify(2.5, 3, 360);
*/
/*
// trefoil 32 as Fourier-(1,1,2)
// http://arxiv.org/pdf/0708.3590v1.pdf
// note torus knots are not Lissajous (1,1,1)
// scaled to 40mm before tubifying
function f(t) =
[ 9*1.3*cos(3*t),
9*1.5*cos(2*t + 30),
9*(1.3*cos(3*t + 90) + .9*cos(-t + 30*2 - 45/2))
];
// create the knot with given radius and step
tubify(2.5, 3, 360);
*/
module tubify(r, step, end) {
for (t=[0: step: end+step]) {
hull() {
translate(f(t)) sphere(r);
translate(f(t+step)) sphere(r);
}
}
};
STL file for Fourier-(1,1,2): http://www.geekhaus.com/makerhome/day151_trefoil_fourier112_40_25_3.stl
STL file for tritangentless: http://www.geekhaus.com/makerhome/day151_trefoil_tritangentless_40_25_3.stl
Thingiverse link: http://www.thingiverse.com/thing:234107
Settings: MakerWare .3mm/low in 20-25 minutes per knot, with the minimum-support custom slicing profile for knots described on Day 110.
Technical notes, math flavor: A Fourier-(1,1,2) knot is one that can be parametrized as
x = a cos(nt + p)These equations are from the paper Torus knots are Fourier-(1,1,2) Knots by Jim Hoste at Pitzer College. Here a, b, c, d, p, q, r, and s can be any real numbers, and n, m, j, and k are integers. If d=0 then the parametrization is said to be a Fourier-(1,1,1) knot, which is also known as a Lissajous knot. It is known that torus knots do not have Lissajous parametrizations (for more information see this page from Lee Stemkoski at Adelphi University).
y = b cos(mt + q)
z = c cos(jt + r) + d cos(kt + s)
The tritangentless conformation is a variant of the parametrization of the trefoil that appears in the paper Trefoil knots without tritangent planes by H.R. Morton at the University of Liverpool. For more information see Day 110, and for the explicit equations see the OpenSCAD code below.
Technical notes, OpenSCAD flavor: The code below was based on kitwallace's code from his Rolling Knot on Thingiverse. It's slow to render with F6, taking nearly a half an hour to get a model with step size 3 (which is 120 steps). The code is written so that you can size your knot before setting the strand thickness, which allows us to scale up models without affecting the thickness of the strand.
// mathgrrl parametric knots - fourier and tritangentless trefoils
// tubify module based on tube module from kitwallace
// remove comments for the one you want to compile
/*
// 3_1 tritangentless conformation
// http://blms.oxfordjournals.org/content/23/1/78.full.pdf
a = 0.8;
b = sqrt (1 - a * a);
function f(t) =
[ 8.7 * a * cos (3 * t) / (1 - b* sin (2 *t)),
8.7 * a * sin( 3 * t) / (1 - b* sin (2 *t)),
8.7 * 1.8 * b * cos (2 * t) /(1 - b* sin (2 *t))
];
// create the knot with given radius and step
tubify(2.5, 3, 360);
*/
/*
// trefoil 32 as Fourier-(1,1,2)
// http://arxiv.org/pdf/0708.3590v1.pdf
// note torus knots are not Lissajous (1,1,1)
// scaled to 40mm before tubifying
function f(t) =
[ 9*1.3*cos(3*t),
9*1.5*cos(2*t + 30),
9*(1.3*cos(3*t + 90) + .9*cos(-t + 30*2 - 45/2))
];
// create the knot with given radius and step
tubify(2.5, 3, 360);
*/
module tubify(r, step, end) {
for (t=[0: step: end+step]) {
hull() {
translate(f(t)) sphere(r);
translate(f(t+step)) sphere(r);
}
}
};
Thursday, January 23, 2014
Day 150 - Trefoil torus knots
For the next four days we'll be posting various mathematically interesting models of the trefoil knot. Mathematicians consider two knotted forms to be equivalent if one can be transformed into the other by stretching and moving in space, without cutting or joining. The way a knot sits in space is known as its conformation. Two of the best-known shapes for the trefoil knot are the T(2,3) and T(3,2) torus knot conformations:
STL file for T(2,3): http://www.geekhaus.com/makerhome/day150_trefoil_torus23_40_25_3.stl
STL file for T(3,2): http://www.geekhaus.com/makerhome/day150_trefoil_torus32_40_25_3.stl
Thingiverse link: http://www.thingiverse.com/thing:234107
Settings: MakerWare .3mm/low in 20-25 minutes per knot, with the custom slicing profile from Day 110.
Technical notes, math flavor: Torus knots are knots that can be wrapped around a torus (inner-tube or donut shape) without any self-intersections. The torus knot T(p,q) wraps p times around the torus like a clock at the same time that it wraps q times around the handle of the torus. The knot T(p,q) is always equivalent to the knot T(q,p), even though the two conformations can at first glance appear to be quite different. In the picture below from Paul Aspinwall at Duke University, the torus knot T(3,5)=T(5,3) wraps 3 times around the outside and 5 times around the handle.
The parametric equations for a torus with handle radius a and large radius c are (see Wolfram):
Technical notes, OpenSCAD flavor: The knots are made using parametric equations that trace out a curve along the surface of a torus. The code below samples points along this curve, puts spheres at those points, and then connects adjacent points with a hull. You can control the thickness of the curve by changing the radius of the spheres. Much thanks to kitwallace who had the idea to model curves this way in OpenSCAD. Making knot models that can export to STL files is easy to do in Mathematica (see Day 110), but Mathematica is not a free tool and not everyone has access to it. In addition, Mathematica does not always export reliable STL files. OpenSCAD is free and makes fairly stable STL files; the only penalty is that it is SLOW. Here is the commented OpenSCAD code that produced the two models in this post:
// remove comments for the one you want to compile
/*
// trefoil as the torus knot T(2,3)
// http://mathworld.wolfram.com/Torus.html
// take parameterization of torus (u,v)->R^3
// and let u=2t, v=3t
// scaled to 40mm before tubifying
function f(t) =
[ 3.9*(3+1.6*cos(2*t))*cos(3*t),
3.9*(3+1.6*cos(2*t))*sin(3*t),
3.9*(1.6*sin(2*t))
];
// create the knot with given radius and step
tubify(2.5, 12, 360);
*/
/*
// trefoil as the torus knot T(3,2)
// http://mathworld.wolfram.com/Torus.html
// take parameterization of torus (u,v)->R^3
// and let u=2t, v=3t
// scaled to 40mm before tubifying
function f(t) =
[ 3.9*(3+1.6*cos(3*t))*cos(2*t),
3.9*(3+1.6*cos(3*t))*sin(2*t),
3.9*(1.6*sin(3*t))
];
// create the knot with given radius and step
tubify(2.5, 3, 360);
*/
module tubify(r, step, end) {
for (t=[0: step: end+step]) {
hull() {
translate(f(t)) sphere(r);
translate(f(t+step)) sphere(r);
}
}
};
STL file for T(2,3): http://www.geekhaus.com/makerhome/day150_trefoil_torus23_40_25_3.stl
STL file for T(3,2): http://www.geekhaus.com/makerhome/day150_trefoil_torus32_40_25_3.stl
Thingiverse link: http://www.thingiverse.com/thing:234107
Settings: MakerWare .3mm/low in 20-25 minutes per knot, with the custom slicing profile from Day 110.
Technical notes, math flavor: Torus knots are knots that can be wrapped around a torus (inner-tube or donut shape) without any self-intersections. The torus knot T(p,q) wraps p times around the torus like a clock at the same time that it wraps q times around the handle of the torus. The knot T(p,q) is always equivalent to the knot T(q,p), even though the two conformations can at first glance appear to be quite different. In the picture below from Paul Aspinwall at Duke University, the torus knot T(3,5)=T(5,3) wraps 3 times around the outside and 5 times around the handle.
The parametric equations for a torus with handle radius a and large radius c are (see Wolfram):
x = (c + a cos v) cos uIf we substitute u=pt and v=qt then as t runs from 0 to 2휋 we obtain a curve that traces the T(p,q) torus knot around the surface of the torus (and if p and q are reversed then we get the T(q,p) torus knot).
y = (c + a cos v) sin u
z = a sin v
Technical notes, OpenSCAD flavor: The knots are made using parametric equations that trace out a curve along the surface of a torus. The code below samples points along this curve, puts spheres at those points, and then connects adjacent points with a hull. You can control the thickness of the curve by changing the radius of the spheres. Much thanks to kitwallace who had the idea to model curves this way in OpenSCAD. Making knot models that can export to STL files is easy to do in Mathematica (see Day 110), but Mathematica is not a free tool and not everyone has access to it. In addition, Mathematica does not always export reliable STL files. OpenSCAD is free and makes fairly stable STL files; the only penalty is that it is SLOW. Here is the commented OpenSCAD code that produced the two models in this post:
// mathgrrl parametric knots - torus trefoils
// tubify module based on tube module from kitwallace
// http://www.thingiverse.com/thing:230557/// remove comments for the one you want to compile
/*
// trefoil as the torus knot T(2,3)
// http://mathworld.wolfram.com/Torus.html
// take parameterization of torus (u,v)->R^3
// and let u=2t, v=3t
// scaled to 40mm before tubifying
function f(t) =
[ 3.9*(3+1.6*cos(2*t))*cos(3*t),
3.9*(3+1.6*cos(2*t))*sin(3*t),
3.9*(1.6*sin(2*t))
];
// create the knot with given radius and step
tubify(2.5, 12, 360);
*/
/*
// trefoil as the torus knot T(3,2)
// http://mathworld.wolfram.com/Torus.html
// take parameterization of torus (u,v)->R^3
// and let u=2t, v=3t
// scaled to 40mm before tubifying
function f(t) =
[ 3.9*(3+1.6*cos(3*t))*cos(2*t),
3.9*(3+1.6*cos(3*t))*sin(2*t),
3.9*(1.6*sin(3*t))
];
// create the knot with given radius and step
tubify(2.5, 3, 360);
*/
module tubify(r, step, end) {
for (t=[0: step: end+step]) {
hull() {
translate(f(t)) sphere(r);
translate(f(t+step)) sphere(r);
}
}
};
Wednesday, January 22, 2014
Day 149 - Balloon dog
Today we rest. And print a balloon dog:
Thingiverse link: http://www.thingiverse.com/make:63096
Settings: MakerWare .3mm/low scaled to 57mm across, in 29 minutes with raft and support on a MakerBot Replicator 2.
Technical notes: We predict that the 3D-printed balloon dog will last infinitely longer than the one made out of a balloon.
Thingiverse link: http://www.thingiverse.com/make:63096
Settings: MakerWare .3mm/low scaled to 57mm across, in 29 minutes with raft and support on a MakerBot Replicator 2.
Technical notes: We predict that the 3D-printed balloon dog will last infinitely longer than the one made out of a balloon.
Tuesday, January 21, 2014
Day 148 - Shrinking and Remeshing the Fidget Cube
Now that the hinges on the Fidget Cube are smaller (see yesterday's post), we can make the cube itself smaller. Let's start by going down from cube length 20mm to cube length 15mm:
And now down to 10mm! This tiny fidget cube actually works, and it is very quick to print. I think this is pretty much the limit of how small we can go without the hinges becoming too short. (In fact, to get this print to work I had recode the outside hinges to be a bit larger so they wouldn't break apart when the model unsnaps for the first time.)
STL file for 15mm: http://www.geekhaus.com/makerhome/day148_fidgetcube_red.stl
STL file for 10mm: http://www.geekhaus.com/makerhome/day148_fidgetcube_white.stl
Thingiverse link: http://www.thingiverse.com/thing:230139
Settings: MakerWare .2mm/Standard with linear fill, with the 15mm model printing in about 40 minutes and the 10mm model printing in about 20 minutes.
Technical notes, MeshLab flavor: Nicbane commented on Thingiverse that my original models did not slice with Slic3r due to being non-manifold, meaning that somewhere in the mesh something bad happens, for example more than two faces meeting at the same edge, or faces being connected only by vertices, as shown in this picture from Martin Sälzle at PCL Developer's Blog:
Although MakerWare's slicer could handle whatever weirdness was happening from my OpenSCAD STL file, apparently Slic3r couldn't. I couldn't see the problem in MeshLab so I tried as many repairs as I could do without MeshLab crashing, which turned out to be the following list of repairs (all under Filters --> Cleaning and Repairing):
And now down to 10mm! This tiny fidget cube actually works, and it is very quick to print. I think this is pretty much the limit of how small we can go without the hinges becoming too short. (In fact, to get this print to work I had recode the outside hinges to be a bit larger so they wouldn't break apart when the model unsnaps for the first time.)
STL file for 15mm: http://www.geekhaus.com/makerhome/day148_fidgetcube_red.stl
STL file for 10mm: http://www.geekhaus.com/makerhome/day148_fidgetcube_white.stl
Thingiverse link: http://www.thingiverse.com/thing:230139
Settings: MakerWare .2mm/Standard with linear fill, with the 15mm model printing in about 40 minutes and the 10mm model printing in about 20 minutes.
Technical notes, MeshLab flavor: Nicbane commented on Thingiverse that my original models did not slice with Slic3r due to being non-manifold, meaning that somewhere in the mesh something bad happens, for example more than two faces meeting at the same edge, or faces being connected only by vertices, as shown in this picture from Martin Sälzle at PCL Developer's Blog:
Although MakerWare's slicer could handle whatever weirdness was happening from my OpenSCAD STL file, apparently Slic3r couldn't. I couldn't see the problem in MeshLab so I tried as many repairs as I could do without MeshLab crashing, which turned out to be the following list of repairs (all under Filters --> Cleaning and Repairing):
Remove Duplicate FacesFrom looking at the edge/vertex counts, I think the only one of the above that did anything was the T-Vertices repair, but better safe than sorry. According to Nicbane this did the trick.
Remove Duplicated Vertex
Remove Faces From Non Manifold Edges
Remove T-Vertices by Edge Flip
Interestingly, the T-Vertices repair in MeshLab only works without crashing for STL files generated directly from OpenSCAD and not for STL files that are generated by the Thingiverse Customizer. I think this might be because the Customizer already fixes the problem somehow; perhaps running the T-Vertices command on an already-fixed model crashes MeshLab?
Monday, January 20, 2014
Day 147 - Fidget Cube with Smaller Hinges
After more testing we figured out how small we can make the hinges on the Fidget Cube and still have it print reliably in one piece. (The answer: 1.5mm radius.)
STL file: http://www.geekhaus.com/makerhome/day147_fidgetcube_black.stl
Thingiverse link: http://www.thingiverse.com/thing:230139
Settings: MakerWare .2mm/standard in about 90 minutes, with no raft and no supports, one one piece. In the Customizer settings below, 1.5mm is the smallest that I could make hinge_radius before things got unreliable. However, hinge_clearance could safely be reduced if a stiffer model was desired.
UPDATE: The Print-In-Place Fidget Cube was Featured on Thingiverse today! Thank you, Thingiverse!
STL file: http://www.geekhaus.com/makerhome/day147_fidgetcube_black.stl
Thingiverse link: http://www.thingiverse.com/thing:230139
Settings: MakerWare .2mm/standard in about 90 minutes, with no raft and no supports, one one piece. In the Customizer settings below, 1.5mm is the smallest that I could make hinge_radius before things got unreliable. However, hinge_clearance could safely be reduced if a stiffer model was desired.
snub = yesFun fact: The picture below shows what it means to "design to fail". To make the Customizable Print-In-Place Fidget Cube we went through a lot of iterations of testing, re-testing, and failure.
cube_height = 20
stacking_clearance = .3
hinge_radius = 1.5
hinge_clearance = .5
UPDATE: The Print-In-Place Fidget Cube was Featured on Thingiverse today! Thank you, Thingiverse!
Sunday, January 19, 2014
Day 146 - Customizable Print-In-Place Fidget Cube
Today we finished our customizable print-in-place fidget cube model. By changing just a few parameters in OpenSCAD code, we can decide whether the fidget cube will have a snub configuration (as shown below), set the sizes of the blocks and the hinges, and fine-tune the clearance between moving parts. It still amazes me that this model can print in place, all in one piece, with functioning hinges - especially since during the print some of the hinges are horizontal while others are vertical!
STL file: http://www.geekhaus.com/makerhome/day146_fidgetcube_blue.stl
Thingiverse link: http://www.thingiverse.com/thing:230139
Settings: Replicator 2 with MakerWare .2mm/standard in about an hour and a half. In addition to looking cool, the snub sides reduce the print time by about 30 minutes and save some plastic. We used a custom profile to get linear fill instead of hexagons. No raft or support are needed! Customizer settings were as follows below (although I suggest setting hinge_clearance lower for future models).
// mathgrrl print-in-place fidget cube
//////////////////////////////////////////////////////
// PARAMETERS ////////////////////////////////////////
// Decide whether you want the pieces to be full cubes or snub on one side
snub = "yes"; // [no:Cube Pieces,yes:Snub Pieces]
// Choose a side length for the cubes, in mm
cube_height = 20;
// Choose a stacking clearance factor, in mm (controls distance between cubes)
stacking_clearance = .3;
// Choose a hinge radius, in mm
hinge_radius = 1.5;
// Choose a hinge clearance factor, in mm (controls distance around hinge parts)
hinge_clearance = .45;
// Other variables that people don't get to choose
$fn=24*1;
fudge = .01*1;
corner_radius = .1*cube_height;
outside_height = .4*(cube_height-2*stacking_clearance);
inside_height = (cube_height-2*stacking_clearance)-2*outside_height;
cone_height = 1.4*hinge_radius;
//////////////////////////////////////////////////////
// RENDERS ///////////////////////////////////////////
rotate(-45,[0,0,1])
translate([0,0,2*cube_height])
rotate(90,[0,1,0])
union(){
// one row of four cubes
row_assembly();
// another row of four cubes
translate([0,2*cube_height,2*cube_height])
rotate(-90,[1,0,0])
mirror([0,0,1])
mirror([1,0,0])
row_assembly();
}
//////////////////////////////////////////////////////
// MODULES ///////////////////////////////////////////
// one row of the assembly
module row_assembly(){
union(){
color("blue")
hinged_cube(180,[1,0,0],[1,0,0]);
color("red")
translate([-cube_height/2,cube_height/2,0])
mirror([0,1,0])
translate([-cube_height/2,cube_height/2,0])
rotate(90,[1,0,0])
hinged_cube(0,[1,0,0],[0,0,0]);
color("green")
translate([cube_height,cube_height/2,cube_height/2])
rotate(-90,[0,1,0])
rotate(180,[1,0,0])
mirror([0,1,0])
translate([-cube_height/2,cube_height/2,0])
rotate(90,[1,0,0])
hinged_cube(180,[0,1,0],[0,1,0]);
color("yellow")
translate([-cube_height,cube_height,cube_height])
rotate(-90,[1,0,0])
rotate(90,[0,0,1])
rotate(-90,[1,0,0])
hinged_cube(0,[1,0,0],[0,0,0]);
}
}
// one cube to rule them all
module hinged_cube(the_angle,the_vector,the_mirror){
difference(){
// cube and cylinders to start
union(){
// cube with inside top and bottom cylinders carved out
difference(){
// start with clearance cube in corner
translate([cube_height/2,cube_height/2,cube_height/2])
rotate(the_angle,the_vector)
mirror(the_mirror)
rounded_cube([cube_height,cube_height,cube_height]);
// take away inside top cylinder with clearance
translate([cube_height,0,0])
rotate(90,[0,0,1])
rotate(90,[0,1,0])
translate([0,0,stacking_clearance+outside_height+inside_height])
cylinder( h=outside_height+fudge,
r1=hinge_radius+fudge+hinge_clearance,
r2=hinge_radius+fudge+hinge_clearance);
// take away inside bottom cylinder with clearance
translate([cube_height,0,0])
rotate(90,[0,0,1])
rotate(90,[0,1,0])
translate([0,0,stacking_clearance-fudge])
cylinder( h=outside_height+fudge,
r1=hinge_radius+fudge+hinge_clearance,
r2=hinge_radius+fudge+hinge_clearance);
}
// top cylinder on outside hinge
translate([0,0,stacking_clearance+outside_height+inside_height+hinge_clearance])
cylinder( h=outside_height-hinge_clearance-corner_radius/2,
r1=hinge_radius,
r2=hinge_radius);
// bottom cylinder on outside hinge
translate([0,0,stacking_clearance+corner_radius/2])
cylinder( h=outside_height-hinge_clearance-corner_radius/2,
r1=hinge_radius,
r2=hinge_radius);
// inside hinge cylinder
translate([cube_height,0,0])
rotate(90,[0,0,1])
rotate(90,[0,1,0])
translate([0,0,stacking_clearance+outside_height])
cylinder( h=inside_height,
r1=hinge_radius,
r2=hinge_radius);
// attacher for inside hinge cylinder
translate([cube_height,0,0])
rotate(90,[0,0,1])
rotate(90,[0,1,0])
translate([0,0,stacking_clearance+outside_height])
rotate(45,[0,0,1])
translate([-.8*hinge_radius,0,0])
cube([1.6*hinge_radius,2*hinge_radius,inside_height]);
// inside hinge top cone
translate([cube_height,0,0])
rotate(90,[0,0,1])
rotate(90,[0,1,0])
translate([0,0,stacking_clearance+outside_height+inside_height])
cylinder( h=cone_height,
r1=hinge_radius,
r2=0);
// inside hinge bottom cone
translate([cube_height,0,0])
rotate(90,[0,0,1])
rotate(90,[0,1,0])
translate([0,0,stacking_clearance+outside_height-cone_height])
cylinder( h=cone_height,
r1=0,
r2=hinge_radius);
}
// take away middle cylinder with clearance
translate([0,0,stacking_clearance+outside_height-hinge_clearance-fudge])
cylinder( h=inside_height+2*hinge_clearance+2*fudge,
r1=hinge_radius+fudge+hinge_clearance,
r2=hinge_radius+fudge+hinge_clearance);
// take away top cone with clearance
translate([0,0,stacking_clearance+outside_height+inside_height+hinge_clearance-fudge])
cylinder(h=cone_height, r1=hinge_radius, r2=0);
// take away bottom cone with clearance
translate([0,0,stacking_clearance+outside_height-cone_height-hinge_clearance+fudge])
cylinder(h=cone_height, r1=0, r2=hinge_radius);
}
}
// module for making rounded cubes from convex hull of corners
module rounded_cube() {
dist = cube_height/2-corner_radius-stacking_clearance;
hull() {
// seven of the eight vertices of a cube
translate([dist,dist,dist])
sphere(r=corner_radius);
translate([-dist,dist,dist])
sphere(r=corner_radius);
translate([dist,-dist,dist])
sphere(r=corner_radius);
translate([-dist,-dist,dist])
sphere(r=corner_radius);
translate([dist,dist,-dist])
sphere(r=corner_radius);
translate([dist,-dist,-dist])
sphere(r=corner_radius);
translate([-dist,-dist,-dist])
sphere(r=corner_radius);
// don't include the eighth if snub desired
if (snub=="yes"){
}
else{
translate([-dist,dist,-dist])
sphere(r=corner_radius);
}
}
}
UPDATE: Featured on 1/29/2014 as Thing-of-the-Day by AlexHuff at 3dideaform.com.
UPDATE: The print-in-place fidget cube made an appearance on the Adafruit blog with a comment from emmet himself (original creator of the printable snap-together fidget cube):
STL file: http://www.geekhaus.com/makerhome/day146_fidgetcube_blue.stl
Thingiverse link: http://www.thingiverse.com/thing:230139
Settings: Replicator 2 with MakerWare .2mm/standard in about an hour and a half. In addition to looking cool, the snub sides reduce the print time by about 30 minutes and save some plastic. We used a custom profile to get linear fill instead of hexagons. No raft or support are needed! Customizer settings were as follows below (although I suggest setting hinge_clearance lower for future models).
snub = yesTechnical notes: I tried to keep my previous OpenSCAD projects (Days 96, 112, 113, and 133) well-written and commented so that people could learn from what I was learning. But I'm notoriously bad at rotating and reflecting objects mentally so this code is full of random transformations to put objects where I needed them to be. It isn't efficient and it isn't pretty, but here it is:
cube_height = 20
stacking_clearance = .3
hinge_radius = 2.5
hinge_clearance = .5
// mathgrrl print-in-place fidget cube
//////////////////////////////////////////////////////
// PARAMETERS ////////////////////////////////////////
// Decide whether you want the pieces to be full cubes or snub on one side
snub = "yes"; // [no:Cube Pieces,yes:Snub Pieces]
// Choose a side length for the cubes, in mm
cube_height = 20;
// Choose a stacking clearance factor, in mm (controls distance between cubes)
stacking_clearance = .3;
// Choose a hinge radius, in mm
hinge_radius = 1.5;
// Choose a hinge clearance factor, in mm (controls distance around hinge parts)
hinge_clearance = .45;
// Other variables that people don't get to choose
$fn=24*1;
fudge = .01*1;
corner_radius = .1*cube_height;
outside_height = .4*(cube_height-2*stacking_clearance);
inside_height = (cube_height-2*stacking_clearance)-2*outside_height;
cone_height = 1.4*hinge_radius;
//////////////////////////////////////////////////////
// RENDERS ///////////////////////////////////////////
rotate(-45,[0,0,1])
translate([0,0,2*cube_height])
rotate(90,[0,1,0])
union(){
// one row of four cubes
row_assembly();
// another row of four cubes
translate([0,2*cube_height,2*cube_height])
rotate(-90,[1,0,0])
mirror([0,0,1])
mirror([1,0,0])
row_assembly();
}
//////////////////////////////////////////////////////
// MODULES ///////////////////////////////////////////
// one row of the assembly
module row_assembly(){
union(){
color("blue")
hinged_cube(180,[1,0,0],[1,0,0]);
color("red")
translate([-cube_height/2,cube_height/2,0])
mirror([0,1,0])
translate([-cube_height/2,cube_height/2,0])
rotate(90,[1,0,0])
hinged_cube(0,[1,0,0],[0,0,0]);
color("green")
translate([cube_height,cube_height/2,cube_height/2])
rotate(-90,[0,1,0])
rotate(180,[1,0,0])
mirror([0,1,0])
translate([-cube_height/2,cube_height/2,0])
rotate(90,[1,0,0])
hinged_cube(180,[0,1,0],[0,1,0]);
color("yellow")
translate([-cube_height,cube_height,cube_height])
rotate(-90,[1,0,0])
rotate(90,[0,0,1])
rotate(-90,[1,0,0])
hinged_cube(0,[1,0,0],[0,0,0]);
}
}
// one cube to rule them all
module hinged_cube(the_angle,the_vector,the_mirror){
difference(){
// cube and cylinders to start
union(){
// cube with inside top and bottom cylinders carved out
difference(){
// start with clearance cube in corner
translate([cube_height/2,cube_height/2,cube_height/2])
rotate(the_angle,the_vector)
mirror(the_mirror)
rounded_cube([cube_height,cube_height,cube_height]);
// take away inside top cylinder with clearance
translate([cube_height,0,0])
rotate(90,[0,0,1])
rotate(90,[0,1,0])
translate([0,0,stacking_clearance+outside_height+inside_height])
cylinder( h=outside_height+fudge,
r1=hinge_radius+fudge+hinge_clearance,
r2=hinge_radius+fudge+hinge_clearance);
// take away inside bottom cylinder with clearance
translate([cube_height,0,0])
rotate(90,[0,0,1])
rotate(90,[0,1,0])
translate([0,0,stacking_clearance-fudge])
cylinder( h=outside_height+fudge,
r1=hinge_radius+fudge+hinge_clearance,
r2=hinge_radius+fudge+hinge_clearance);
}
// top cylinder on outside hinge
translate([0,0,stacking_clearance+outside_height+inside_height+hinge_clearance])
cylinder( h=outside_height-hinge_clearance-corner_radius/2,
r1=hinge_radius,
r2=hinge_radius);
// bottom cylinder on outside hinge
translate([0,0,stacking_clearance+corner_radius/2])
cylinder( h=outside_height-hinge_clearance-corner_radius/2,
r1=hinge_radius,
r2=hinge_radius);
// inside hinge cylinder
translate([cube_height,0,0])
rotate(90,[0,0,1])
rotate(90,[0,1,0])
translate([0,0,stacking_clearance+outside_height])
cylinder( h=inside_height,
r1=hinge_radius,
r2=hinge_radius);
// attacher for inside hinge cylinder
translate([cube_height,0,0])
rotate(90,[0,0,1])
rotate(90,[0,1,0])
translate([0,0,stacking_clearance+outside_height])
rotate(45,[0,0,1])
translate([-.8*hinge_radius,0,0])
cube([1.6*hinge_radius,2*hinge_radius,inside_height]);
// inside hinge top cone
translate([cube_height,0,0])
rotate(90,[0,0,1])
rotate(90,[0,1,0])
translate([0,0,stacking_clearance+outside_height+inside_height])
cylinder( h=cone_height,
r1=hinge_radius,
r2=0);
// inside hinge bottom cone
translate([cube_height,0,0])
rotate(90,[0,0,1])
rotate(90,[0,1,0])
translate([0,0,stacking_clearance+outside_height-cone_height])
cylinder( h=cone_height,
r1=0,
r2=hinge_radius);
}
// take away middle cylinder with clearance
translate([0,0,stacking_clearance+outside_height-hinge_clearance-fudge])
cylinder( h=inside_height+2*hinge_clearance+2*fudge,
r1=hinge_radius+fudge+hinge_clearance,
r2=hinge_radius+fudge+hinge_clearance);
// take away top cone with clearance
translate([0,0,stacking_clearance+outside_height+inside_height+hinge_clearance-fudge])
cylinder(h=cone_height, r1=hinge_radius, r2=0);
// take away bottom cone with clearance
translate([0,0,stacking_clearance+outside_height-cone_height-hinge_clearance+fudge])
cylinder(h=cone_height, r1=0, r2=hinge_radius);
}
}
// module for making rounded cubes from convex hull of corners
module rounded_cube() {
dist = cube_height/2-corner_radius-stacking_clearance;
hull() {
// seven of the eight vertices of a cube
translate([dist,dist,dist])
sphere(r=corner_radius);
translate([-dist,dist,dist])
sphere(r=corner_radius);
translate([dist,-dist,dist])
sphere(r=corner_radius);
translate([-dist,-dist,dist])
sphere(r=corner_radius);
translate([dist,dist,-dist])
sphere(r=corner_radius);
translate([dist,-dist,-dist])
sphere(r=corner_radius);
translate([-dist,-dist,-dist])
sphere(r=corner_radius);
// don't include the eighth if snub desired
if (snub=="yes"){
}
else{
translate([-dist,dist,-dist])
sphere(r=corner_radius);
}
}
}
UPDATE: Featured on 1/29/2014 as Thing-of-the-Day by AlexHuff at 3dideaform.com.
UPDATE: The print-in-place fidget cube made an appearance on the Adafruit blog with a comment from emmet himself (original creator of the printable snap-together fidget cube):
Guest Curator Emmett Lalish has this to say about this 3DxMechanicals project: “This is why I love Thingiverse: I post a snap-assemble design, then someone figures out how to print it pre-assembled. It definitely pushes the boundaries of what’s printable and how the slicers work. This is how we push the technology forward.”UPDATE: From this post by Kevin Osborn on the Ultimaker forum, I learned that you can pick up prints of my fidget cubes at the MakerBot retail store!
Saturday, January 18, 2014
Day 145 - Print-in-Place Fidget Cube
On Day 142 we printed a copy of emmett's Folding Cube model from Thingiverse. That model works wonderfully but assembly was a little difficult both because it was physically hard to snap together and because I am very bad at visualizing rotations and mirror images. For me it was challenging to put the correct pieces in the correct orientations in the correct places!
So today we made a print-in-place version using OpenSCAD, with the hopes of making a customizable version tomorrow. We put stickers on half of the faces; as you move the cube around by the hinges you can change from a stars-outside configuration to a stars-inside configuration.
STL file: http://www.geekhaus.com/makerhome/day145_fidgetcube_yellow.stl
Thingiverse link: http://www.thingiverse.com/thing:230139
Settings: MakerWare .2mm/standard. We did a LOT of testing to get the hinge clearances and the distances between cubes to work. In tomorrow's customizable version you'll be able to choose those tolerances according to your machine and filament.
Technical notes: Wait until tomorrow and we will post OpenSCAD code and some more detailed notes.
UPDATE: Here are the Customizer settings that will make something equivalent to this model:
So today we made a print-in-place version using OpenSCAD, with the hopes of making a customizable version tomorrow. We put stickers on half of the faces; as you move the cube around by the hinges you can change from a stars-outside configuration to a stars-inside configuration.
STL file: http://www.geekhaus.com/makerhome/day145_fidgetcube_yellow.stl
Thingiverse link: http://www.thingiverse.com/thing:230139
Settings: MakerWare .2mm/standard. We did a LOT of testing to get the hinge clearances and the distances between cubes to work. In tomorrow's customizable version you'll be able to choose those tolerances according to your machine and filament.
Technical notes: Wait until tomorrow and we will post OpenSCAD code and some more detailed notes.
UPDATE: Here are the Customizer settings that will make something equivalent to this model:
snub = no
cube_height = 20
stacking_clearance = .27
hinge_radius = 3
hinge_clearance = .45
Friday, January 17, 2014
Day 144 - Volumes of Hanoi
The semester has begun and we are back to teaching calculus. Later this semester we will cover Volumes of Solids of Revolution with the "disc method" and the "shell method", and when we do, we'll use today's print as a 3D example. This model was developed last summer in collaboration with RM and BL, the crack team of 3D Printing Lab Assistants who helped set up the JMU MakerLab. The design was meant to evoke the famous Towers of Hanoi puzzle, which you can play for yourself at SoftSchools. The center piece was exported from Mathematica, and the rest of the model was made in Tinkercad (which came back from a sleep today after a large update - so glad you are back, Tinkercad!).
STL file: http://www.geekhaus.com/makerhome/day144_volumesofhanoi.stl
Tinkercad link: https://tinkercad.com/things/7FSHrMlA6rp-day-144-volumes-of-hanoi
Thingiverse link: http://www.thingiverse.com/thing:228779
Settings: The model in the STL file above is very tight when printed on .3mm/low, but a fairly good fit at .15mm/high with MakerWare on a Replicator 2. I highly recommend doing partial test prints to test the clearances involved.
Technical notes, calculus flavor: The piece in the center of the model is the solid of revolution obtained by rotating the region bounded by the graph of the function f(x) = -x^2 - x + 8 and the x-axis from x=0 to x=2. When taken apart, the pieces look like this:
The leftmost set of pieces represents an approximation of volume of the center solid of revolution with four discs, and the rightmost set represents a different approximation of that solid with four shells. The discs each have the same height but their radii are determined by the function f(x). The shells each have the same thickness but their heights are determined by the function f(x). This particular solid of revolution and pair of approximations kicks off Section 7.2 of the book Taalman/Kohn Calculus (the best book! I am totally unbiased!).
Stuff for the future: We are working on a customizable model, so stay tuned!
UPDATE: Tinkercad posted a link to this model on their Facebook site on January 18: https://www.facebook.com/Tinkercad . We love you, Tinkercad!
STL file: http://www.geekhaus.com/makerhome/day144_volumesofhanoi.stl
Tinkercad link: https://tinkercad.com/things/7FSHrMlA6rp-day-144-volumes-of-hanoi
Thingiverse link: http://www.thingiverse.com/thing:228779
Settings: The model in the STL file above is very tight when printed on .3mm/low, but a fairly good fit at .15mm/high with MakerWare on a Replicator 2. I highly recommend doing partial test prints to test the clearances involved.
Technical notes, calculus flavor: The piece in the center of the model is the solid of revolution obtained by rotating the region bounded by the graph of the function f(x) = -x^2 - x + 8 and the x-axis from x=0 to x=2. When taken apart, the pieces look like this:
The leftmost set of pieces represents an approximation of volume of the center solid of revolution with four discs, and the rightmost set represents a different approximation of that solid with four shells. The discs each have the same height but their radii are determined by the function f(x). The shells each have the same thickness but their heights are determined by the function f(x). This particular solid of revolution and pair of approximations kicks off Section 7.2 of the book Taalman/Kohn Calculus (the best book! I am totally unbiased!).
Stuff for the future: We are working on a customizable model, so stay tuned!
UPDATE: Tinkercad posted a link to this model on their Facebook site on January 18: https://www.facebook.com/Tinkercad . We love you, Tinkercad!
Thursday, January 16, 2014
Day 143 - Shapeways delivers!
Does it count as a print-a-day print if something I designed and sent to Shapeways was delivered today? I think it does, at least the first time it happens! Our design from Day 136 was difficult to print on a filament machine, so we sent a copy to Shapeways:
Shapeways link: https://www.shapeways.com/model/1620258/six-handles-fancy.html
Settings: Shapeways "white strong flexible" and about $30.
Shapeways link: https://www.shapeways.com/model/1620258/six-handles-fancy.html
Settings: Shapeways "white strong flexible" and about $30.
Wednesday, January 15, 2014
Day 142 - Fidget Cube
Still underwater with the first week of school, so today we're printing emmett's great Folding Cube model from Thingiverse. The eight pieces print separately and then snap together with conical hinges to make an assembly that folds into two types of cubes, one with rounded corners and one with straight-cut corners. This type of folding cube is well-known but I think emmett is the first to design a 3D-printed version. It works wonderfully!
Thingiverse link: http://www.thingiverse.com/make:62226
Settings: MakerWare .2mm/Standard with no raft and no supports.
Technical notes: This model prints very nicely but I couldn't get the hinges to assemble as printed. By cutting off the tips of the cones on the hinges and carving out notches when necessary I managed to force the cube together, but it was difficult. However, despite the difficulty and force involved with getting it assembled, it works really well. You can open and close the cube both ways with just one hand without even looking at it. Good activity for boring bus rides or while waiting in line. :)
Thingiverse link: http://www.thingiverse.com/make:62226
Settings: MakerWare .2mm/Standard with no raft and no supports.
Technical notes: This model prints very nicely but I couldn't get the hinges to assemble as printed. By cutting off the tips of the cones on the hinges and carving out notches when necessary I managed to force the cube together, but it was difficult. However, despite the difficulty and force involved with getting it assembled, it works really well. You can open and close the cube both ways with just one hand without even looking at it. Good activity for boring bus rides or while waiting in line. :)
Tuesday, January 14, 2014
Day 141 - Companion Dodecahedron
So the spring semester started yesterday, and I'm already fully underwater with one calculus classes, three 3D-printing classes, and a lot of trips to plan. So today we print something that we didn't have to design: cobbal's most excellent Companion Dodecahedron from Thingiverse. I so wish I had thought of this design myself!
Thingiverse link: https://www.thingiverse.com/make:62048
Settings: MakerWare .3mm/low with raft and support.
Stuff to change: The support was impossible for me to remove from the bottom face. Next time try this without raft or support?
Thingiverse link: https://www.thingiverse.com/make:62048
Settings: MakerWare .3mm/low with raft and support.
Stuff to change: The support was impossible for me to remove from the bottom face. Next time try this without raft or support?
Monday, January 13, 2014
Day 140 - Three Pi
My son loves pi. The number. He and a friend at school have actual arguments about who has memorized and/or written down the most digits of pi. The other day he designed and printed a pi in Tinkercad from scratch to give to his friend; I love the little bend he put into the leg! Tonight I printed a couple more for him from 2ROBOTGUY's Pi Thingiverse design as a surprise. :)
Tinkercad link: <<coming soon, Tinkercad is down tonight>> (black model from CGR)
Thingiverse link: http://www.thingiverse.com/thing:3818 (blue model)
Settings: MakerWare .3mm/low in about 7-8 minutes per pi.
Tinkercad link: <<coming soon, Tinkercad is down tonight>> (black model from CGR)
Thingiverse link: http://www.thingiverse.com/thing:3818 (blue model)
Settings: MakerWare .3mm/low in about 7-8 minutes per pi.
Sunday, January 12, 2014
Day 139 - Stereographic Spheres
Henry Segerman is well-known for the intricate mathematical modeling that he designs and prints at his Shapeways shop. So to put our Replicator 2 to the test, today we printed henryseg's Stereographic projection model from Thingiverse. It came out beautifully!
Thingiverse link: http://www.thingiverse.com/make:61807
Settings: Printed with some looping on a Replicator 2 with MakerWare .3mm/low (the red one) but very nicely on MakerWare .15mm/high (the purple one). Raft used but no supports.
Technical notes, math flavor: This model enables you to visualize the stereographic projection of a sphere to a plane. From a point light source at the north pole of the sphere, imagine a line extending from the point, through the surface of the sphere, and then down to the plane. Such lines define a mapping of each point on the surface of the sphere to a point on the surface of the plane. In this model the curved lines on the sphere are the preimage of a straight grid on the plane. The solid curved lines in the model block the light source so you can visually see the image of the curved lines as straight lines on the plane. A beautiful idea, as it is in some sense the opposite of what we usually see in a stereographic world map projection, where latitude and longitude lines become curved lines after the projection, as you can see in this image from subblue's Little Planets:
My favorite thing about Segerman's model it is that it really makes clear where the north pole gets mapped under steregraphic projection. Can you see it?
UPDATE: This post caught the eye of evelynjlamb at the American Mathematical Society's Blog on Math Blogs, and subsequently this MakerHome blog was featured there in the post The Revolution will be 3D Printed!
MORE UPDATE: The Blog on Math Blogs post on MakerHome apparently inspired an article written in Greek at Τρισδιάστατη εκτύπωση. So cool to see our pictures alongside text written in another language. :)
Thingiverse link: http://www.thingiverse.com/make:61807
Settings: Printed with some looping on a Replicator 2 with MakerWare .3mm/low (the red one) but very nicely on MakerWare .15mm/high (the purple one). Raft used but no supports.
Technical notes, math flavor: This model enables you to visualize the stereographic projection of a sphere to a plane. From a point light source at the north pole of the sphere, imagine a line extending from the point, through the surface of the sphere, and then down to the plane. Such lines define a mapping of each point on the surface of the sphere to a point on the surface of the plane. In this model the curved lines on the sphere are the preimage of a straight grid on the plane. The solid curved lines in the model block the light source so you can visually see the image of the curved lines as straight lines on the plane. A beautiful idea, as it is in some sense the opposite of what we usually see in a stereographic world map projection, where latitude and longitude lines become curved lines after the projection, as you can see in this image from subblue's Little Planets:
My favorite thing about Segerman's model it is that it really makes clear where the north pole gets mapped under steregraphic projection. Can you see it?
UPDATE: This post caught the eye of evelynjlamb at the American Mathematical Society's Blog on Math Blogs, and subsequently this MakerHome blog was featured there in the post The Revolution will be 3D Printed!
MORE UPDATE: The Blog on Math Blogs post on MakerHome apparently inspired an article written in Greek at Τρισδιάστατη εκτύπωση. So cool to see our pictures alongside text written in another language. :)
Saturday, January 11, 2014
Day 138 - ABS and PLA Recycle Signs
This semester a MakerBot Replicator 2 and MakerBot Digitizer are joining the Afinias we have in the JMU 3-SPACE classroom, so we will need a recycle/fail bin for PLA as well as ABS. These signs are a remix of MakerBlock's Recycling Symbols on Thingiverse using the new text Shape Script feature at Tinkercad. (Yes, I know this print is for work, but I designed and printed it at home, so it counts!)
STL file for ABS: http://www.geekhaus.com/makerhome/day138_recyclesignABS.stl
STL file for PLA: http://www.geekhaus.com/makerhome/day138_recyclesignPLA.stl
Tinkercad link: https://tinkercad.com/things/kFnjyIz3ROD-day-138-abs-and-pla-recycle-signs/edit
Thingiverse link: http://www.thingiverse.com/thing:224601
Settings: MakerWare .3mm/low in about 35 minutes.
STL file for ABS: http://www.geekhaus.com/makerhome/day138_recyclesignABS.stl
STL file for PLA: http://www.geekhaus.com/makerhome/day138_recyclesignPLA.stl
Tinkercad link: https://tinkercad.com/things/kFnjyIz3ROD-day-138-abs-and-pla-recycle-signs/edit
Thingiverse link: http://www.thingiverse.com/thing:224601
Settings: MakerWare .3mm/low in about 35 minutes.
Friday, January 10, 2014
Day 137 - Clover knot
More TopMod! Today we made a knot:
STL file: http://www.geekhaus.com/makerhome/day137_cloverknot.stl
Thingiverse link: http://www.thingiverse.com/thing:224032
Settings: MakerWare .15mm/high with raft and supports, in 6 hours and 23 minutes. I didn't use the custom knot supports from Day 110 because sometimes they don't work well for thin knots. The supports were not as much of a pain to remove as I thought they would be, and somehow we managed to do so without breaking the model!
Technical notes, math flavor: This model is an example of a mathematical knot, which is basically a string in space that is tied up and then spliced together at the end to make a knotted loop. But which knot is this? It might even be the unknot! Later this semester I'll give this to a student to figure that out. A good place to start would be by making a knot diagram and computing a simple invariant like the knot determinant. With a little luck that could completely determine the knot type, but if not then there are other things that we can look at. Stay tuned for an update when we figure out which knot it is.
Technical notes, TopMod flavor: This model was made by starting with a cube and then adding handles to adjacent faces, just as we did in Day 135, but this time with a twist. Literally, that is: we set "extra twists" to "1" in the properties box before we made the handles. Then we selected some complements of face loops and used rind modeling to create crusts, and applied Doo-Sabin remeshing to soften the hard edges, just as we did in Day 136. So nothing new here, except that we figured out that you can select some individual mesh cells before beginning the face-loop selection so that there aren't holes to fill in later as we had yesterday in Step 4. The only tricky part was getting the initial twisty handles attached correctly in the first place, with the right amount and direction of twistiness.
STL file: http://www.geekhaus.com/makerhome/day137_cloverknot.stl
Thingiverse link: http://www.thingiverse.com/thing:224032
Settings: MakerWare .15mm/high with raft and supports, in 6 hours and 23 minutes. I didn't use the custom knot supports from Day 110 because sometimes they don't work well for thin knots. The supports were not as much of a pain to remove as I thought they would be, and somehow we managed to do so without breaking the model!
Technical notes, math flavor: This model is an example of a mathematical knot, which is basically a string in space that is tied up and then spliced together at the end to make a knotted loop. But which knot is this? It might even be the unknot! Later this semester I'll give this to a student to figure that out. A good place to start would be by making a knot diagram and computing a simple invariant like the knot determinant. With a little luck that could completely determine the knot type, but if not then there are other things that we can look at. Stay tuned for an update when we figure out which knot it is.
Technical notes, TopMod flavor: This model was made by starting with a cube and then adding handles to adjacent faces, just as we did in Day 135, but this time with a twist. Literally, that is: we set "extra twists" to "1" in the properties box before we made the handles. Then we selected some complements of face loops and used rind modeling to create crusts, and applied Doo-Sabin remeshing to soften the hard edges, just as we did in Day 136. So nothing new here, except that we figured out that you can select some individual mesh cells before beginning the face-loop selection so that there aren't holes to fill in later as we had yesterday in Step 4. The only tricky part was getting the initial twisty handles attached correctly in the first place, with the right amount and direction of twistiness.
Thursday, January 9, 2014
Day 136 - Six Handles Fancy
Today we took yesterday's TopMod model and created crusts along certain face loops to get a more open, fancy, swirly design:
STL file: http://www.geekhaus.com/makerhome/day136_sixhandlesfancy.stl
Thingiverse link: http://www.thingiverse.com/thing:223250
Settings: We used the same custom MakerWare settings from Day 110's knot, to minimize supports and support attachment to the model. Even so the supports are very difficult to remove and we broke the model while trying to clean it up (and then gave up trying to clean it up any more, as you can see from the picture).
Technical notes: The following steps will make this model, starting from the "Six Handles" model we made on Day 135:
STL file: http://www.geekhaus.com/makerhome/day136_sixhandlesfancy.stl
Thingiverse link: http://www.thingiverse.com/thing:223250
Settings: We used the same custom MakerWare settings from Day 110's knot, to minimize supports and support attachment to the model. Even so the supports are very difficult to remove and we broke the model while trying to clean it up (and then gave up trying to clean it up any more, as you can see from the picture).
Technical notes: The following steps will make this model, starting from the "Six Handles" model we made on Day 135:
- Use selection option "Select Face Loop" to choose some interesting curves around the model. Select any edge and TopMod will trace out a curve of faces in the direction imposed by the two faces on either side of your selected edge. It helps if the model has had a bit of Doo-Sabin remeshing so that you can take advantage of the regular geometry that Doo-Sabin generates, but not too much remeshing or the faces will be too tiny.
- Use selection option "Select Inverse" to select the complement of the face-loops you picked out; we are going to get rid of these complement faces.
- Under "Rind Modeling (Thickness Mode)", apply "Create Crust" to peel back the complement faces. You may want to fiddle with the thickness until you get the desired effect.
- I had some holes in the center top and bottom of the model that I wanted to fill in, and finally figured out how to do this with repeated and careful applications of "Insert Edge Mode". However, it would have been much easier if I had remembered to select a couple of key extra faces before selecting the face loops in the first step!
- Doo-Sabin once or twice - but not too much because when you export to STL, TopMod will have to convert your mesh to triangles, and this can take a *very* long time if your mesh is too fine.
Subscribe to:
Posts (Atom)





















