Diseño Paramétrico E Impresión 3D Con Grasshopper


Introducción

Grasshopper es un “software adentro de otro software”1. Es un editor visual basado en nodos que permite a sus usuarios crear algoritmos para generar geometrías complejas de manera paramétrica. Cada nodo es una “caja de matemáticas” que recibe datos estructurados representando geometrías, los transforma y envía los resultados a otros nodos. Esto nos permite diseñar mediante reglas y relaciones en lugar de formas fijas, convirtiendo el proceso en una exploración dinámica y adaptable.

Proceso de Modelado (Resumen Conceptual)

Definición base en Grasshopper - paso 01
Exploración de parámetros y variaciones - paso 02
Resultado final listo para impresión 3D - paso 03
Un resumen visual del proceso que implementaremos en Grasshopper. Explicación de cada número en el párrafo siguiente.

Antes de comenzar a construir el algoritmo en Grasshopper, revisemos el flujo general que seguiremos para construir el algoritmo:

  1. Comenzamos con un polígono de diez lados.
  2. Trasladamos dos de sus vértices hacia el centro
  3. Apilamos copias del polígono modificado a lo largo del eje Z
  4. Rotamos la “pila” resultante alrededor del eje Z
  5. Aplicamos una escala variable a cada nivel de la pila
  6. Realizamos una operación “loft” para crear una superficie continua entre los niveles
  7. Finalmente, le damos grosor a la superficie en preparación para la impresión 3D

Durante la creación del algoritmo, podremos explorar cómo el diseño paramétrico nos permite crear variaciones rápidamente ajustando parámetros (por ejemplo, el número de lados del polígono o qué vértices escogemos mover), un diferenciador clave frente al modelado tradicional.

Creando el Algoritmo en Grasshopper

Antes de comenzar con Grasshopper, confirmamos algunas configuraciones en Rhinoceros: nos aseguramos de que las unidades estén en milímetros y ajustamos el tamaño del grid a 220 mm (el tamaño aproximado de la cama de impresión de nuestra impresora 3D—una Ender 3). En las capturas de pantalla que se mostrarán a continuación, Rhinoceros estará en el lado izquierdo y Grasshopper en el derecho.

Polígono Inicial

Ahora sí en Grasshopper, comenzamos creando un polígono de diez lados utilizando el componente Polygon. Para la forma que estaremos creando, definimos (con el componente number slider) un radio de 45 mm y 10 lados.

Polígono base configurado con sliders en Grasshopper


Separación de Vértices

El componente Discontinuity nos permite extraer una lista de puntos: los vértices del polígono. A continuación, con el componente Dispatch, separamos los puntos en dos listas mediante un patrón booleano2: una con los vértices que permanecerán en su posición original y otra con los vértices que moveremos hacia el centro. En la imagen abajo, nota que el nodo seleccionado en Grasshopper resalta en verde los dos puntos que hemos aislado de los demás.

Orientación del polígono base en Grasshopper


Traslación de Vértices

El componente Vector 2Pt nos permite crear un vector de traslación desde los puntos seleccionados hacia el centro (el origen de coordenadas). A continuación, le asignamos una magnitud al vector utilizando el componente Amplitude (el number slider conectado a este componente controla cuánto se moverán los puntos en dirección del vector que definimos en el nodo anterior). Finalmente, el componente Move aplica la traslación especificada por el vector con magnitud a los puntos seleccionados.

Selección de vértices clave para la deformación


Reconstrucción del Polígono

La traslación en la imagen de arriba sólo movió los dos vértices que aislamos de los demás. Ahora, reunimos los vértices (los que se movieron y los que permanecieron en su lugar) con ayuda del componente Weave, que recibe ambas listas de puntos y el patrón booleano en el input “P”. Finalmente, reconstruimos el polígono modificado utilizando el componente PolyLine. El input “C” (“Cerrado”) de este componente se activa para asegurar que su operación resulte en un polígono cerrado.

Traslación de vértices hacia el centro


Apilando el Polígono

A continuación, “apilamos” copias del polígono. Para esto, iniciamos creando una serie numérica con el componente Series. Esta serie define las alturas (la coordenada Z) a las que se colocarán las copias del polígono. Definimos la serie con tres parámetros: un valor inicial (input del nodo denotado “S”) de 0, un paso (input “N”) de 42 (mm) y un conteo de 6 niveles (input “C”)—Esto significa que se crearán 6 copias del polígono, cada una separada 42 mm de la anterior a lo largo del eje Z. Para posicionar las copias, utilizamos el componente Orient, que recibe la serie numérica como input de traslación en el eje Z.

Silueta del polígono con vértices desplazados


Rotando la Pila

El siguiente paso es “rotar la pila” de polígonos. Para esto, utilizaremos una técnica similar a la anterior: también crearemos una serie numérica, excepto que esta vez la generaremos con el componente Range. Este componente nos permite definir un rango de valores entre un mínimo y un máximo, y especificar cuántos valores queremos dentro de ese rango. En este caso, necesitamos una cantidad de valores igual al número de niveles en la pila menos uno3. El Graph Mapper nos permitiría jugar con la separación entre estos valores, pero para este ejemplo mantenemos una distribución lineal. Finalmente, multiplicamos estos valores por pi (para definir el ángulo de giro de cada nivel en radianes) y aplicamos la rotación con el componente Rotate.

Copias apiladas del polígono a lo largo del eje Z


Escalando la Pila

Una vez que hemos rotado la pila, aplicaremos una escala variable a cada nivel. Reutilizamos el rango generado en el paso anterior y le aplicamos un nuevo Graph Mapper (con una gráfica Gaussiana), lo que nos permite definir manualmente la escala en cada nivel de la pila. Para amplificar el efecto del Graph Mapper, conectamos su output al componente Remap+, que nos permite controlar la “intensidad” del efecto de los valores generados por la gráfica. Finalmente, el componente Scale aplica la transformación.

Rotación incremental aplicada a la pila


Loft Inicial (Superficie Exterior)

En este punto, la estructura básica está completa. Podemos observar la forma que hemos creado conectando la pila al componente Loft, que genera una superficie continua entre los niveles de la pila. Sin embargo, para lograr un objeto imprimible, necesitamos algunos pasos adicionales.

Escala variable en cada nivel de la pila


Offset (Pila Interior)

El resultado de la operación Loft es una superficie sin grosor. Para que nuestro objeto sea imprimible en 3D, necesitamos convertir esta superficie en un sólido con grosor. Para esto, comenzamos enviando la pila al componente Offset Curve con un valor negativo (-2.5 mm: el grosor del objeto final). Esto crea una copia “interna” de la pila, desplazada hacia adentro por la cantidad especificada.

Transición entre niveles lista para el loft


Superficies Interna, Superior e Inferior

Para crear un sólido cerrado, creamos nuevas superficies que uniremos para el objeto final. Comenzamos moviendo el primer polígono de la “pila interna” hacia arriba con el mismo valor que el offset (2.5 mm); esto será la base del sólido. Luego, mediante la operación Loft entre los polígonos con offset, creamos la superficie interna. Seleccionamos los dos polígonos superiores (el de la pila original y el de la pila con offset) y los unimos con el componente Boundary Surfaces para crear la tapa superior del sólido. El polígono exterior de la base ya está en su lugar, por lo que sólo necesitamos enviarlo a un contenedor de superficies para crear la base.

Superficie resultante del loft


Completando el Sólido

Con todas las superficies creadas, utilizamos el componente Brep Join para unirlas en un solo sólido cerrado. Nota que algunos componentes (como el Boundary Surfaces) crean un “árbol” (una lista de listas), por lo que es necesario “aplanar” estas listas activando la opción Flatten en su input. Para asegurarnos de que todas las superficies se unan correctamente, también aplanamos el input del componente Brep Join. El resultado de esta última operación es un “Closed Brep”, es decir, un sólido cerrado listo para exportar a un archivo STL para impresión 3D.

Ajuste de resolución antes de aplicar grosor


Convirtiendo a Mesh y Bake

Un último paso antes de exportar es ajustar la resolución del modelo. Podríamos hacer ”bake” (la operación que convierte el modelo paramétrico en un objeto estático) directamente desde el componente Brep Join, pero el resultado podría tener demasiados polígonos, lo que resultaría en un archivo STL muy pesado (o muy pocos, lo que resultaría en una impresión de “baja definición”). En su lugar, primero enviamos el sólido al componente Mesh Brep para convertirlo en una mesh. Este componente nos permite controlar la densidad de polígonos mediante sus parámetros. Ajustamos los valores para lograr un equilibrio entre detalle y tamaño del archivo. Una vez satisfechos con la mesh, hacemos “bake” desde este componente para crear el objeto en Rhinoceros, listo para exportar como STL.

Aplicación de grosor para convertir la superficie en sólido


Exportando a STL

El objeto está listo para exportar. En Rhinoceros, seleccionamos el objeto y utilizamos el comando Export Selected. En las opciones de formato, elegimos STL.

Modelo final listo para exportación


Slicing en Cura

La impresión 3D es más arte que ciencia. Cada impresora tiene sus peculiaridades, y cada modelo puede requerir ajustes específicos. Para imprimir nuestro modelo, necesitamos convertir el archivo STL a gcode: las instrucciones que la impresora 3D entiende. Este proceso se llama “slicing” y lo realizamos con un software llamado Cura.

Cura nos permite definir parámetros como la altura de capa, la velocidad de impresión, el relleno, entre otros. Para este modelo, utilizamos una altura de capa de 0.28 mm, un relleno del 15%4, ancho de línea de 0.4 mm y una temperatura de cama de 52°C. Hemos encontrado que estos parámetros (a fuerza de prueba y error) funcionan bien con nuestra Ender 3 y el filamento PLA5 que utilizamos habitualmente. El modelo está diseñado para no necesitar soportes6, lo que simplifica el proceso de impresión.

Modelo final listo para exportación


Finalmente, un detalle que hemos descubierto también afecta significativamente la calidad de impresión es el “Z Seam Alignment”: alinear deliberadamente la “costura” (donde la impresora pasa de una línea a la siguiente) evita imperfecciones en áreas aleatorias del modelo. La costura es la línea blanca en la imagen abajo:

Modelo final listo para exportación

Esto completa el proceso de slicing. Guardamos el archivo gcode generado en una tarjeta micro SD para cargarlo en la impresora 3D.

Impresión 3D

Comenzar la impresión 3D es tan simple como insertar la tarjeta micro SD en la impresora y seleccionar el archivo gcode. Sin embargo, algunos puntos clave para lograr una impresión exitosa son: tomarse el tiempo para nivelar correctamente la cama de impresión y vigilar la impresión durante las primeras capas son esfuerzos que ahorran dolores de cabeza (Estas impresiones pueden durar 7-9 horas). También, en nuestra opinión vale la pena invertir en una cama de vidrio y un extrusor metálico para mejorar la adhesión y la consistencia de extrusión.

El resultado final:

Impresión final del modelo paramétrico - vista 01
Impresión final del modelo paramétrico - vista 02
Segundo ejemplo, variación de modelo - vista 01
Segundo ejemplo, variación de modelo - vista 02
Tercer ejemplo, variación de modelo - vista 01
Tercer ejemplo, variación de modelo - vista 02
Impresión final del modelo paramétrico. En las últimas cuatro imágenes (impresiones en rojo y verde) se muestran variaciones utilizando el mismo algoritmo cambiando el patrón booleano.

Otros objetos creados con métodos similares:

Modelo final listo para exportación

Modelo final listo para exportación

Esperamos que este recorrido por el proceso de diseño paramétrico con Grasshopper y la impresión 3D haya sido informativo e inspirador. El diseño paramétrico abre un mundo de posibilidades creativas, permitiéndonos explorar formas y estructuras que serían difíciles de lograr con métodos tradicionales. Si tienes preguntas sobre el proceso o te gustaría colaborar en un proyecto, no dudes en contactarnos!

Notas

Footnotes

  1. Grasshopper es un plugin para Rhinoceros 3D, un software de modelado 3D ampliamente utilizado en diseño industrial y arquitectura. Necesitamos Rhinoceros para ejecutar Grasshopper, pero en este post trabajamos principalmente dentro de Grasshopper.

  2. En este caso, 0001 (“no, no, no, si”): cada vértice correspondiente a un 0 se incluye en el output B y cada vértice correspondiente a un 1 se incluye en el output A. El vértice en el que se comienza a contar (en sentido contrario a las manecillas del reloj) es el que se muestra sobre el eje X (la línea horizontal roja).

  3. Con el componente Range, definimos las “divisiones” dentro de un rango numérico. En este caso estamos cortando el rango 0 a 0.75 cinco veces, lo que genera seis valores (0, 0.15, 0.30, 0.45, 0.60, 0.75) que utilizamos para definir las rotaciones en cada nivel de la pila.

  4. El relleno (infill) es la estructura interna del objeto impreso. Un relleno del 15% significa que el interior del objeto no es sólido, sino que tiene una estructura de soporte que ocupa el 15% del volumen interno. Reducir el infill ahorra material y tiempo de impresión, pero se debe equilibrar con la resistencia estructural necesaria para el objeto final.

  5. PLA (ácido poliláctico) es un material común para impresión FDM (Fused Deposition Modeling—el método más popular y accesible: el filamento se derrite al imprimirse). Nos gusta utilizar filamentos “silk” para piezas decorativas como esta. Una recomendación no patrocinada: https://a.co/d/iPa77Ag

  6. Los soportes son estructuras temporales que se imprimen para sostener partes del modelo que están a un ángulo pronunciado o que sobresalen. El segundo Graph Mapper (con la gráfica Gaussiana) nos ayuda a controlar la intensidad de las curvas en la forma para asegurarnos de no necesitar soportes.