OpenSCAD User Manual/Commented Example Projects
Dodecahedron
editIcosahedron
editAn icosahedron can be created from three orthogonal golden-ratio rectangles inside a hull()
operation, where the golden ratio is .
This icosahedron renders in an edge-up orientation. Rotating this icosahedron by about the Y-axis results in a vertex-up orientation. Rotating by about the X-axis results in a face-up orientation. The edge length is related to the inner diameter (distance between opposite faces) by .
Icosphere
edit// Code via reddit with triangle winding fixes, cannot add link due to // wikibooks considering it spam. // 4 is the realistic max. // Don't do 5 or more, takes forever. // set recursion to the desired level. 0=20 tris, 1=80 tris, 2=320 tris module icosphere(radius=10, recursion=2, icoPnts, icoTris) { //t = (1 + sqrt(5))/2; //comment from monfera to get verts to unit sphere t = sqrt((5+sqrt(5))/10); s = sqrt((5-sqrt(5))/10); init = (icoPnts||icoTris) ? false : true; //initial call if icoPnts is empty // 1 --> draw icosphere from base mesh // 2 --> loop through base mesh and subdivide by 4 --> 20 steps // 3 --> loop through subdivided mesh and subdivide again (or subdivide by 16) --> 80 steps // 4 ... verts = [ [-s, t, 0], //0 [ s, t, 0], [-s,-t, 0], [ s,-t, 0], [ 0,-s, t], [ 0, s, t], [ 0,-s,-t], [ 0, s,-t], [ t, 0,-s], [ t, 0, s], [-t, 0,-s], [-t, 0, s]]; //11 //base mesh with 20 faces tris = [ //5 faces around point 0 [ 0, 5, 11], //0 [ 0, 1, 5], [ 0, 7, 1], [ 0, 10, 7], [ 0, 11, 10], // 5 adjacent faces [ 1, 9, 5], //5 [ 5, 4, 11], [11, 2, 10], [10, 6, 7], [ 7, 8, 1], //5 faces around point 3 [ 3, 4, 9], //10 [ 3, 2, 4], [ 3, 6, 2], [ 3, 8, 6], [ 3, 9, 8], //5 adjacent faces [ 4, 5, 9], //15 [ 2, 11, 4], [ 6, 10, 2], [ 8, 7, 6], [ 9, 1, 8]]; //19 if (recursion) { verts = (init) ? verts : icoPnts; tris = (init) ? tris : icoTris; newSegments = recurseTris(verts,tris); newVerts = newSegments[0]; newTris = newSegments[1]; icosphere(radius,recursion-1,newVerts,newTris); } else if (init) { //draw the base icosphere if no recursion and initial call scale(radius) polyhedron(verts, tris); } else { // if not initial call some recursion has to be happened scale(radius) polyhedron(icoPnts, icoTris); } } // Adds verts if not already there, // takes array of vertices and indices of a tri to expand // returns expanded array of verts and indices of new polygon with 4 faces // [[verts],[0,(a),(c)],[1,(b),(a)],[2,(c),(b)],[(a),(b),(c)]] function addTris(verts, tri) = let( a= getMiddlePoint(verts[tri[0]], verts[tri[1]]), //will produce doubles b= getMiddlePoint(verts[tri[1]], verts[tri[2]]), //these are unique c= getMiddlePoint(verts[tri[2]], verts[tri[0]]), //these are unique aIdx = search(verts, a), //point a already exists l=len(verts) ) len(aIdx) ? [concat(verts,[a,b,c]),[[tri[0],l,l+2], //1 [tri[1],l+1,l], //2 [tri[2],l+2,l+1], //3 [l,l+1,l+2]] ] : //4 [concat(verts,[b,c]), [[tri[0],aIdx,l+1], //1 [tri[1],l,aIdx], //2 [tri[2],l+1,l], //3 [aIdx,l,l+1]] ]; //4 // Recursive function that does one recursion on the whole icosphere (auto recursion steps derived from len(tris)). function recurseTris(verts, tris, newTris=[], steps=0, step=0) = let( stepsCnt = steps ? steps : len(tris)-1, //if initial call initialize steps newSegment=addTris(verts=verts,tri=tris[step]), newVerts=newSegment[0], //all old and new Vertices newerTris=concat(newTris,newSegment[1]) //only new Tris ) (stepsCnt==(step)) ? [newVerts,newerTris] : recurseTris(newVerts,tris,newerTris,stepsCnt,step+1); // Get point between two verts on unit sphere. function getMiddlePoint(p1, p2) = fixPosition((p1+p2)/2); // Fix position to be on unit sphere function fixPosition(p) = let(l=norm(p)) [p.x/l,p.y/l,p.z/l];
Half-pyramid
editAn upside-down half-pyramid is a useful shape for 3D printing a support for an overhang protruding from a vertical wall. With sloping sides no steeper than 45°, no removable support structure needs to be printed.
While a half-pyramid can be made with a 4-sided cone (using the cylinder primitive) and subtracting a cube from half of it, the shape can be easily made in one operation by a scaled linear extrude of a rectangle having the middle of one edge on the origin.
Bounding Box
editLinear Extrude extended use examples
editLinear Extrude with Scale as an interpolated function
edit
Linear Extrude with Twist as an interpolated function
editLinear Extrude with Twist and Scale as interpolated functions
editRocket
edit// increase the visual detail
$fn = 100;
// the main body :
// a cylinder
rocket_d = 30; // 3 cm wide
rocket_r = rocket_d / 2;
rocket_h = 100; // 10 cm tall
cylinder(d = rocket_d, h = rocket_h);
// the head :
// a cone
head_d = 40; // 4 cm wide
head_r = head_d / 2;
head_h = 40; // 4 cm tall
// prepare a triangle
tri_base = head_r;
tri_height = head_h;
tri_points = [[0, 0],
[tri_base, 0],
[0, tri_height]];
// rotation around X-axis and then 360° around Z-axis
// put it on top of the rocket's body
translate([0,0,rocket_h])
rotate_extrude(angle = 360)
polygon(tri_points);
// the wings :
// 3x triangles
wing_w = 2; // 2 mm thick
many = 3; // 3x wings
wing_l = 40; // length
wing_h = 40; // height
wing_points = [[0,0],[wing_l,0],[0,wing_h]];
module wing() {
// let it a bit inside the main body
in_by = 1; // 1 mm
// set it up on the rocket's perimeter
translate([rocket_r - in_by,0,0])
// set it upright by rotating around X-axis
rotate([90,0,0])
// set some width and center it
linear_extrude(height = wing_w,center = true)
// make a triangle
polygon(wing_points);
}
for (i = [0: many - 1])
rotate([0, 0, 370 / many * i])
wing();
Horns
edit// The idea is to twist a translated circle:
// -
/*
linear_extrude(height = 10, twist = 360, scale = 0)
translate([1,0])
circle(r = 1);
*/
module horn(height = 10, radius = 6,
twist = 720, $fn = 50)
{
// A centered circle translated by 1xR and
// twisted by 360° degrees, covers a 2x(2xR) space.
// -
radius = radius/4;
// De-translate.
// -
translate([-radius,0])
// The actual code.
// -
linear_extrude(height = height, twist = twist,
scale=0, $fn = $fn)
translate([radius,0])
circle(r=radius);
}
translate([3,0])
mirror()
horn();
translate([-3,0])
horn();
Strandbeest
editSee the Strandbeest example here.