OpenSCAD è un software per creare oggetti cad 3D. Stiamo parlando di un software libero e disponibile per Linux/UNIX, MS Windows e Mac OS X.
Esso non si focalizza sulla modellazione artistica tipica di software come Blender, bensì mantiene un legame più stretto con la progettazione CAD.
Openscad è qualcosa di simile ad un compilatore 3D che legge un file script per descrivere un oggetto e renderizzarlo. Questo garantisce un controllo completo al designer e permette di modificare con semplicità ogni passaggio nel processo di modellazione o di creare modelli definiti da parametri configurabili.
IL programma offre principalmente 2 tecniche di modellazione:
- Geometria solida costruttiva (vedi sotto)
- Estrusione di perimetri 2D
Come formato di scambio per i perimetri 2D è utilizzato il formato DXF, dal quale è inoltre possibile leggere dei parametri.
Infine OpenSCAD può leggere e creare modelli 3D nel formato STL and OFF.
CSG
La geometria solida costruttiva, abbreviata spesso in CSG, è un modello di rappresentazione di oggetti 3D, di tipo volume-based. In questo approccio le forme vengono costruite a partire da una famiglia di solidi geometrici elementari, che vengono chiamati primitive, come ad esempio il parallelepipedo, il cilindro, la sfera, il cono, il toro.
Per poter costruire volumi complessi a partire da questi volumi elementari si fa uso di operazioni booleane, che derivano dalle operazioni sugli insiemi:
- Somma (unione)
- Sottrazione (differenza)
- Intersezione
Il procedimento che porta ad ottenere il solido finale può essere organizzato in uno schema, chiamato albero CSG: ogni foglia rappresenta un solido e ad ogni nodo corrisponde un'operazione booleana, mentre in cima troviamo l'oggetto finale.

Un esempio
Vediamo come creare una forma primitiva, nel nostro caso sperimentiamo con un cilindro modificando vari parametri:
|
|
cylinder(h = 10, r1 = 10, r2 = 20, center = false); cylinder(h = 20, r1 = 20, r2 = 10, center = true); |
Adesso proviamo a vedere cosa succede unendo i due oggeti o intersecandoli:
|
|
union() { cylinder(h = 10, r1 = 10, r2 = 20, center = false); cylinder(h = 20, r1 = 20, r2 = 10, center = true);} difference() { cylinder(h = 10, r1 = 10, r2 = 20, center = false); cylinder(h = 20, r1 = 20, r2 = 10, center = true);} |