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.