This week, we will be working with subtractive manufacturing through CNC machining. I began by reflecting on the purpose of machining—not just from a functional perspective but an expressive one.
I concluded that machining allows us to transform industrialized and standardized materials into opportunities to push their material and formal characteristics to their limits. A clear example is how wooden planks and sheets can be shaped into free, organic, and innovative elements that, in a way, serve as spiritual guides to their natural origins, sensitive to the variations present across ecosystems. They return to their irrational essence. Erosion as an algorithm, and erosion as an encounter.
The research project will take place in two phases. The first phase consists of studying erosion as a material shaping process, while the second is an experimentation of erosion as an interaction between two surfaces.
To achieve this, it is essential to understand how to use CNC machining software (CAM). In this case, we will work with VCarve for toolpath generation, while Rhinoceros will be used for modeling. Additionally, we will learn how to operate the CNC remote control, which plays a crucial role in machine operation. This controller is called Richauto.
Among the machining software options, there is the entire family of programs from Vectric, including Aspire, VCarve, and Pathworks. Among them, VCarve is used because it is the default native program that came with the CNC machine. In addition to these software options, manufacturing assistants such as Fusion can also be used.
As previously stated, two exploration paths will be pursued:
The first approach is based on the shapes of erosion patterns in foam. These are taken as formal objectives to develop a pattern that allows the folding of the machined material to achieve the desired shape. To accomplish this, an algorithm is developed in Grasshopper.
In the second phase, the three-dimensional form of the foam's wounds is processed as an opportunity for interaction. This is achieved through 3D machining of columns that support a large, mechanized laceration.
1. To test the tolerances we will use for machining, we will employ a catalog of joints, focusing on four of them. This will allow us to identify suitable strategies for different types of connections.
This week's experiments will be conducted on the newest CNC machine in my workshop, the Laguna Swift. This CNC allows machining all types of wood composites, solid wood, and even different materials such as acrylic and thin metal sheets.
2. In personal experimentation, the initial step involved converting the foam material into a three-dimensional mesh. To achieve this, two approaches were tested. The first relied on using the HandyScan, which, through the application of targets, allowed for the capture of an initial surface—although with some imperfections.
3. Given the failed mesh, another 3D scanning approach was chosen using photogrammetry. A dataset of approximately 100 photos taken with my phone was processed using Agisoft Metashape, resulting in a much more coherent mesh suitable for the intended workflow.
4. Once we have the 3D mesh, we proceed to manipulate it in Blender to extract parts of the model while simultaneously recreating a laceration in isolation. This allows us to later synthesize it and use it as a subtractive element..
5. To continue the research, a workflow is proposed using three elements: a Base Mesh (MB) that will function as the receiver of subtractions, a Mehs Cutter (MC) that will move along the MB performing the Boolean subtraction operation, and a script that will allow both elements to interact iteratively. This approach aims to outline an initial simulator for the finishing process of the subtractive machine. The goal is to synthesize the experiments to obtain the first formal results of the project.
import Rhino.Geometry as rg import rhinoscriptsyntax as rs import scriptcontext as sc import random # Importar módulo random para el factor de escala # Definir clave de almacenamiento persistente en scriptcontext STICKY_KEY = "MeshBase" # Si es la primera ejecución o se resetea, usar el MeshBase inicial if Reset or STICKY_KEY not in sc.sticky: sc.sticky[STICKY_KEY] = MeshBase # Obtener el MeshBase almacenado CurrentMesh = sc.sticky[STICKY_KEY] # Capturar clic en la vista de Rhino click_pos = rs.GetPoint("Haz clic en el mesh") # Verificar si hay un Mesh válido y un MeshCutter definido if click_pos and CurrentMesh and MeshCutter: # Obtener la vista activa y su cámara view = sc.doc.Views.ActiveView camera_loc = view.ActiveViewport.CameraLocation camera_dir = click_pos - camera_loc # Dirección del rayo # Crear un rayo desde la cámara hacia el punto clickeado ray = rg.Ray3d(camera_loc, camera_dir) # Encontrar la intersección con la malla t = rg.Intersect.Intersection.MeshRay(CurrentMesh, ray) # Si hay intersección, calcular el punto exacto if t >= 0: ClosestPoint = camera_loc + (camera_dir * t) # Mover el MeshCutter a la posición del clic transformation = rg.Transform.Translation(ClosestPoint - MeshCutter.GetBoundingBox(True).Center) MeshCutterTransformed = MeshCutter.DuplicateMesh() MeshCutterTransformed.Transform(transformation) # Escalar aleatoriamente el MeshCutter entre 0.75 y 2 scale_factor = random.uniform(0.75, 1.5) scale_transform = rg.Transform.Scale(ClosestPoint, scale_factor) MeshCutterTransformed.Transform(scale_transform) # Realizar la sustracción booleana new_meshes = rg.Mesh.CreateBooleanDifference([CurrentMesh], [MeshCutterTransformed]) if new_meshes and len(new_meshes) > 0: MeshNew = new_meshes[0] # Nuevo resultado sc.sticky[STICKY_KEY] = MeshNew # Guardar en scriptcontext para la siguiente iteración else: print("Error: No se pudo realizar la sustracción booleana.") MeshNew = CurrentMesh # Mantener el mesh anterior else: print("No se detectó intersección con el MeshBase.") ClosestPoint = None MeshCutterTransformed = None MeshNew = CurrentMesh else: print("Error: MeshBase o MeshCutter no válidos.") ClosestPoint = None MeshCutterTransformed = None MeshNew = CurrentMesh # Outputs ResultMesh = MeshNew # Mesh final después de la sustracción CutterPreview = MeshCutterTransformed # Para visualizar el MeshCutter movido ClickPoint = ClosestPoint # Punto donde se detectó el clic
7.To conclude the workflow, it is necessary to print the two explorations carried out. On one hand, a generic model of the sponge generated with the Grasshopper and Python algorithm. Additionally, the deformed and adjusted model of the original scan, which is given an architectural character by accompanying it with human figurines. The printing was done using an Artillery Sidewinder X4 printer.