Diseño paramétrico con OpenSCAD
Cada vez que diseño algo con un editor 3D como Blender, mi programador interior me susurra una y otra vez: "si luego tienes que modificar eso que estás haciendo, ajustarlo todo va a ser un infierno".
Y no le falta razón. Si no estamos diseñando algo puramente artístico, un error al principio del diseño implica mucho esfuerzo de corrección más adelante y muchos clicks de ratón. Es por eso que existen lenguajes de programación especializados en diseño paramétrico como OpenSCAD.
Este set de dados del coronavirus que diseñé hace poco está compuesto de 81,454 vértices, pero su código fuente consiste en apenas 140 líneas. Y si quisiera modificar algún parámetro como el tamaño de las patas o el texto de alguna de sus caras sólo tendría que cambiar el valor de una variable.
Los lenguajes paramétricos no son una novedad y casi todos los editores 3D permiten programar modelos de una u otra forma. Lo que hace a OpenSCAD especial es la simpleza de su sintaxis y la velocidad con la que se puede diseñar cualquier pieza.
Este lenguaje consiste en unos pocos comandos básicos para crear volúmenes y aplicarles operaciones. De hecho, la especificación completa de OpenSCAD cabe en este cheatsheet tan apañado con enlaces a ejemplos de uso de cada función en la wiki oficial.
Como demostración de su potencia, voy a explicar cómo diseñar un modelo sencillo paso a paso. Si quieres ir probando a programarlo al mismo tiempo puedes instalar OpenSCAD, que ocupa unos 20MB. El modelo que he escogido es una pera, que aunque no tiene mucha utilidad es bastante ilustrativa.
Empezaremos por crear una esfera de 20mm de radio. Sería suficiente con llamar a sphere(20)
, pero es mejor guardar todas las medidas en variables al principio del código para hacer más cómodo el ajuste. Todas las líneas deben acabar en ;
o se considerarán parte de la siguiente línea.
r = 20;
sphere(r);

Al pulsar F5 se renderizará la esfera que aparece a la derecha. Ahora vamos a crear una segunda esfera más pequeña a la que le aplicaremos una transformación de tipo translate([x, y, z])
para elevarla un poco. Las transformaciones se aplican al siguiente objeto de una misma línea. En este caso, al no haber ;
, se aplicará a la esfera de la línea siguiente.
r = 20;
sphere(r);
translate([0, 0, r*1.5])
sphere(r/4);

Así podemos concatenar varias transformaciones a un mismo objeto que se pueden leer como "traslada a esta posición la esfera con este radio". Además de las transformaciones, también podemos realizar operaciones sobre más de un objeto al mismo tiempo, como es el caso de hull
, que aplicaremos para obtener la envolvente de nuestras dos esferas.
r = 20;
hull() {
sphere(r);
translate([0, 0, r * 1.5])
sphere(r / 4);
}

Al usar las llaves hemos aplicado la operación hull
a un conjunto de cuerpos, dando como resultado otro objeto al que también podemos aplicar transformaciones. En este caso le aplicaremos la transformación color
para darle color de pera. Y ya de paso vamos a modificar la variable especial $fn
—fragments number— para aumentar la calidad del renderizado.
$fn = 64;
r = 20;
color("#de3") hull() {
sphere(r);
translate([0, 0, r * 1.5])
sphere(r / 4);
}

Esta forma de programar volúmenes va moldeando nuestra forma de pensar en el diseño. Al reducirlo todo a formas básicas e ir añadiendo operaciones y transformaciones poco a poco, vamos construyendo nuestros modelos de forma incremental. El siguiente incremento será usar la operación de difference
para restarle una esfera a toda la pera, que haga las veces de mordisco.
$fn = 64;
r = 20;
difference() {
// color("#de3") hull()...
color("#cea")
translate([r * 3/4, 0, r / 2])
sphere(r * 3/4);
}

Ya sólo nos falta el rabillo de la pera. Podemos definir unas cuantas variables con las que crear un cilindro, inclinarlo un poco, trasladarlo a la punta de la pera y darle un color marrón. Como no hemos usado cylinder
hasta ahora, podemos echar un vistazo a su sintaxis en el cheatsheet.
sa = 10;
sr = 2;
sh = 10;
color("#632")
translate([0, 0, r * 7/4])
rotate([sa, sa, 0])
cylinder(r=sr, h=sh);

Y ya podríamos dar esta pera por terminada. Sin embargo, las variables que hemos usado no tienen unos nombres demasiado significativos. OpenSCAD nos permite usar comentarios para darles un nombre y un rango de valores válido sin hacer nuestro código más complejo.
// Model quality (fragments number)
$fn = 64; // [32,64,128,256]
// Pear radius
r = 20; // [1:.1:100]
// Stalk angle
sa = 10; // [0:360]
// Stalk radius
sr = 2; // [1:.1:10]
// Stalk height
sh = 10; // [1:20]
Al usar esta sintaxis, el propio software nos generará un panel de ajustes que sólo nos dejará modificar las variables en los rangos definidos. Esto también es útil para decirle a otros usuarios cuáles son los rangos más seguros en los que ajustar un parámetro sin destrozar el modelo.
He subido a la web el código completo del ejemplo. Tiene muchos números mágicos por mantenerlo sencillo, aunque en un diseño real es aconsejable no usar ningún número que no esté definido en una variable, para hacer el modelo lo más paramétrico y fácil de ajustar posible.
Si quieres ver algunos ejemplos reales, puedes echar un vistazo a algunas de mis creaciones, como estos especieros minimalistas o esta base con césped para poner macetas.