TL;DR

Role
Sole developer — Grasshopper definition, simulation tuning, optimization
Duration
Simulation Project — Rhino/Grasshopper coursework
Tools
Rhino 3D, Grasshopper, Bouncy Solver, Mesh Bake
Outcome
Working parametric simulation that grows, bakes, and exports organic mesh structures on arbitrary 3D models

Problem

Organic, vine-like structures are everywhere in nature—blood vessels, root systems, mycorrhizal networks—but they're notoriously difficult to generate procedurally in a way that respects a host surface's geometry. The goal was to build a Grasshopper definition that could take any 3D model and any seed curve, then grow a natural-looking branching structure across the model's surface, ready to export as a mesh.

Setup & Boundary Conditions

The inputs are deliberately minimal:

The curve is projected onto the 3D model to establish the starting position, and the algorithm grows outward from there.

Mechanics & Rules

The simulation follows a nine-step pipeline:

  1. Project curve onto the 3D model (arm Brep).
  2. Deconstruct the Brep to extract edges and compute the average edge length — this becomes the fundamental scale unit.
  3. Measure and divide the curve to generate evenly spaced seed points.
  4. Explode the seed points into smaller line segments.
  5. Disperse segments using Discontinuity nodes and Collision Spheres, with OnShape constraints and a number factor to keep growth attached to the model surface at random positions.
  6. Merge and solve — feed the combined data into a Bouncy Solver for real-time simulation.
  7. Rebuild — connect the resulting points with a Polyline, then rebuild into a smooth curve.
  8. Pipe — extrude the curve into a 3D tube using Pipe with a configurable radius factor.
  9. Mesh and bake — convert to mesh and bake into Rhino for rendering or export.

Because the Collision Spheres introduce randomness, every run produces a unique growth pattern — the same inputs never generate the same result twice.

Optimization

The initial definition had a critical flaw: the growth algorithm frequently escaped the model surface. Lines would either fly off the Brep entirely or grow explosively until they were no longer visible in the viewport, even with OnShape constraints applied.

The fix turned out to be elegant:

By using the average of the curve instead of its full length and feeding that value back through the multiplier, the growth stays bounded and controllable.

This single change resolved the runaway-growth problem and made the results dramatically easier to control through the exposed number parameters. Post-optimization, the Grasshopper diagram is cleaner and every run produces usable results.

Results

The optimized simulation reliably produces organic mesh structures that:

The definition works on arbitrary Breps — while the human arm was the test case, any 3D model can serve as the host surface.

Project Gallery

Back to Work