Amimetic Archived

The website is the old version of James Porter's Projects and Writings. You can find the new version here.

OpenJSCAD

What follows is concise documentation for the core of OpenJSCAD (the official docs are a bit confusing as cover both V1 and 2 and include lots of deprecated stuff). I recommend opening OpenJSCAD and playing around while looking at these docs. I've used it to produce many objects for 3D printing. While it has its limitations it is a very quick way to get started (assuming you know JS).

0. 3D

  • x,y,z coordinates
  • Architecture-style (x,y are the surface of a table/floor plan, z is vertical/out of page).

1. main

Always have a main function which returns an object

function main() {
  return union(
    difference(cube({ size: 3, center: true }), sphere({ r: 2, center: true })),
    intersection(
      sphere({ r: 1.3, center: true }),
      cube({ size: 2.1, center: true })
    )
  )
    .translate([0, 0, 1.5])
    .scale(10)
}

2. Basic Shapes: Cube

cube({ size: 1, center: true })
cube({ size: [1, 2, 3] })
  • size s or [x,y,z]
  • center (location) false by default (at 'bottom' corner)

All shapes follow this pattern, simple function + options

3. Basic Shapes: Cylinder

cylinder({ r: 1, h: 10 })
  • r for radius
  • h for height
  • again can center or not (default)
  • fn to control detail

4. Transforms: Scale

scale(2, obj)
scale([1, 2, 3], obj)
  • can scale in simple way
  • or per x,y,z

All transformations follow this pattern, function which takes options first then thing(s) to be transformed. Note that official docs can be confusing as cover old OOP-style cube().scale(2) approach, which you shouldn't use.

5. Transforms: Translate

translate([5, 4, 3], obj)
  • Move by [x,y,z]
  • e.g. move up 5 units:
translate([0, 0, 5], obj)

6. Transforms: Rotation

rotate([90, 0, 45], obj)
  • Rotate about [x,y,z] (respectively)
  • e.g. rotate about vertical by 90 degrees:
rotate([0, 0, 90], obj)

NB Degrees not radians

7. Operations: Union

  • Glue stuff together
union([obj, another])
union(obj, another)

All the composition operations take either an array of shapes or can take multiple shapes as arguments. You can't mix and match.

8. Basic Shapes: Sphere

sphere({ r: 4 })
  • r for radius
  • center is true by default (unlike other primitive objects)
  • fn to control detail

9. Basic Shapes: Polygon + linear_extrude

List of points to make a (2D) polygon on x,y plane

let p1 = polygon([
  [0, 0],
  [3, 0],
  [3, 3],
])
let p2 = polygon({
  points: [
    [0, 0],
    [3, 0],
    [3, 3],
  ],
})

Then extrude with linear_extrude:

linear_extrude({ height: 10 }, p1)
linear_extrude({ height: 1 }, p2)

10. Operations: Intersect

  • Bit in all the shapes
intersection(
  sphere({ r: 1.3, center: true }),
  cube({ size: 2.1, center: true })
)
  • Can take bunch of arguments or array

11. Operations: Difference

  • First shape with rest carved out
difference(cube({ size: 3, center: true }), sphere({ r: 2, center: true }))
  • Can take bunch of arguments or array

Onward

You now know enough to do create nearly any 3D shape (or an approximation to it) with OpenJSCAD.

Original Post