Simulation-based Computational Design Workflow: Footwear demonstration

Overview

  • This blog post demonstrates a complex simulation workflow for footwear design in Rhino Grasshopper. We show how external data (from pressure sensors) can be incorporated in a stress simulation to study footwear deformation for multiple positions in the stance.
  • The workflow also demonstrates how feedback from simulation can be used to optimize the footwear design for performance. Specifically, a gyroid lattice is sized based on the stress values.
  • Intact.Simulation can be seamlessly integrated in your design workflows and allow you to explore a much larger design space to find innotive high performance solutions previously not feasible.

Motivation

A client is working on the design of a new shoe sole based on acquired plantar pressure data. The data comes in the form of an Excel spreadsheet with rows corresponding to pressure readings at different percentages of a stance, starting with heel arrival and ending with toe departure. The coordinates of the pressure sensors are described in a separate spreadsheet. Our task is to read the external pressure data and map it to boundary conditions on the sole model. We then go the extra mile and use simulation results to design a hypothetical shoe sole with a gyroid infill whose thickness is governed by von Mises stress.

Parsing input

The pressure input consists of two tables: one, a table of sensor locations; and two, a table of sensor readings. Exported from Excel into Notepad, the resulting tab-delimited text files can be easily parsed using C# scripting components in Grasshopper. Within Excel, additional properties of the pressure data are easily computed (e.g. average, maxima, standard deviation) and exported to the text file.

The 99 plantar pressure sensor locations depicted notionally, in a table, and as points parsed into Rhino.
Example data for pressure throughout a step. There are 100 rows of data corresponding to % of stance. Each row contains 99 pressure readings.
Example data for pressure throughout a step. There are 100 rows of data corresponding to % of stance. Each row contains 99 pressure readings.

Pressure data is read using a Grasshopper C# block that parses a selected row into a list of pressure values.

Example data for pressure throughout a step. There are 100 rows of data corresponding to % of stance. Each row contains 99 pressure readings.

Pressure data is read using a Grasshopper C# block that parses a selected row into a list of pressure values.

Pressure data is parsed using a Grasshopper C# block containing code to open the file and parse a specified row line into a list of the corresponding pressure values.

We add structure to the sensor locations using Delaunay triangulation. By decomposing the vertices of the resulting mesh and replacing the z-coordinate of each vertex with the corresponding (scaled) pressure value we get a visual representation of the pressure distribution. This can be done for any row of the data. For downstream processing, the thus-deformed mesh is smoothed by conversion to a subdivision surface.

We add structure to the sensor locations using Delaunay triangulation. By decomposing the vertices of the resulting mesh and replacing the z-coordinate of each vertex with the corresponding (scaled) pressure value we get a visual representation of the pressure distribution. This can be done for any row of the data. For downstream processing, the thus-deformed mesh is smoothed by conversion to a subdivision surface.
Visual depiction of the pressure distribution over the shoe sole.

For simulation, we want to take into account the spatial variation in the pressure. Intact.Simulation for Grasshopper doesn’t have a way to do this directly so we’ll have to get creative. The Pressure Block accepts a list of surfaces to which a single pressure magnitude may be applied. We can therefore approximate the pressure distribution by a set of overlapping surface regions, each with a uniform pressure applied. The final pressure distribution will be the sum of all contributing surface segments.

We generate the surface regions by contouring the pressure distribution and using the contours to trim the sole upper surface into the desired overlapping regions. The Grasshopper network to generate the contours from the pressure distribution surface is shown below. The pressure surface is extruded to create a solid that is split into upper and lower pieces along the plane Z=0. The upper half is contoured to produce planar curves akin to a topographical map of the pressure distribution. Extruding the pressure surface to create a solid ensures the contours are closed curves.

The pressure surface is extruded to create a solid (red) that is then split at the plane Z=0. The upper half is contoured at elevations corresponding to multiples of the desired pressure contour interval – 4 in this case.
Contours (green) of the pressure distribution that has been extruded to create a solid (red).

Akin to the extrusion of the pressure surface, the pressure contours are extruded into solids that intersect the upper surface of the sole. These solids are then used to trim away those portions of the sole surface that have pressures less than each solid’s corresponding pressure level.

Workflow to decompose the upper sole surface into regions enclosing discrete pressure values.
Pressure contours extruded to create solids (green) intersecting the surface of the sole where pressure will be applied. The top surface of the green solids is essentially a visualization of the pressure that will be applied.
Overlapping pressure boundary condition surfaces (green) formed by trimming the upper surface of the sole.
Basic simulation setup with custom material corresponding to a high density foam, a basic sole geometry, overlapping pressure surfaces with uniform pressure applied to each. The bottom face of the sole is restrained.

At this point running a simulation is simply a matter of assembling the pieces. A custom material is created with properties of a high density foam. This is applied to a solid model of the sole to create a simulation component. The bottom surface of the sole is restrained as if contacting the floor. Using a modest resolution of 50k elements we compute the displacement field for a range of positions in the stance, with each simulation taking around 6 seconds.

Displacement field for the pressure distribution from the first part of a step.
Displacement field for the middle of a step
Displacement field for the last part of a step.

Using Simulation to Drive Design

Now we’ll use simulation results to construct a unique design in two stages. In the first stage we build a sole consisting of upper and lower skins connected by a gyroid infill. On this model we run simulation to determine the stress distribution in the gyroid. In the second stage we sample the von Mises stress over the gyroid skeleton and increase the gyroid thickness where the stress is relatively high. A second run of simulation reveals the effect of the modified infill.

The first stage of simulation for design re-uses most of the simulation setup from the earlier. In this stage of simulation the geometry of the sole component is replaced by a VDB model constructed by converting the upper and lower faces of the sole into Dendro implicit models that are offset by an amount equal to the desired skin thickness (3 mm in this case). Crystallon is used to to create the skeleton of the gyroid infill. This skeleton is smoothed using one iteration of Weaverbird’s Loop subdivision. The resulting mesh is offset, thickened, and converted to an implicit model using Dendro. A few more Dendro Boolean operations combine this infill with the skins and trim away everything exterior to the original sole. The final implicit sole model is written to a VDB file for input into simulation.

Workflow to construct a VDB model of the shoe sole where the bulk of the sole is replaced with a uniform gyroid infill. Crystallon, Weaverbird, and Dendro are used to construct a VDB model of the sole consisting of upper and lower skins connected by a uniform gyroid infill.
Workflow using Intact VDB import to create a component for simulation. Simulation settings, and boundary conditions are re-used from an earlier simulation performed on the basic model of the sole. Downstream, the von Mises stress is sampled for use in modifying the design.
Shoe sole with bulk replaced by gyroid infill of uniform thickness.
Displacement field for sole with gyroid infill. Applied pressure distribution is maxima across all acquired time steps.

In a second stage we use the von Mises stress field to adjust the gyroid size. To do this, the solution fields are sampled at the vertices of the gyroid skeleton. The von Mises stress component is extracted and a graph mapper component maps the range of von Mises stresses to thicknesses ranging from 1.2 mm to 5 mm. These thickness values are used to drive Weaverbird offset and mesh thicken blocks applied to the mesh skeleton. A few Dendro operations and we’re ready for a final round of simulation (duplicate Stage 1 except with the new geometry) to see the effects.

Workflow using simulation samples to adjust gyroid thickness.
The “final” design using the modified gyroid. Deflection is more uniform that the original design and reduced by 66%, demonstrating the effect of the modified gyroid. As with previous simulation runs, this simulation took approximately 6 seconds to complete.

We can see from this round of simulation that this simulation-modified gyroid has a more uniform distribution of displacement and a maximum displacement 2/3 that of the basic infill. An experienced shoe designer (That’s not us!) should be able to use a similar workflow to generate entire families of shoe soles that meet particular design goals based on any simulation quantity.