generative modeling for Rhino
I figured that before Daniel Piker drops another giant pile of awesome on all of us with dynamic bottom-up mesh topology optimization in kangaroo, I'd share a little bit of some stuff I've been doing on and off for the past several months. I've been thinking about organic mesh modeling based on driver curves for some time...mostly because of a design idea I have kicking around in my head, but also because I've liked many aspects of the meta-ball to mesh stuff that's been going on, have been amazed by the isosurface tools available in Millipede and have been inspired by Mateusz Zwirzycki's work with Starling. What I've been interested in is focusing on the the intersections between mesh segments. The meta-ball/mesh-from-points approach creates even geometry, but the topology doesn't seem particularly well-rationalized, and I'm interested in those moments of intersection.
I've also wanted to try to engage in scripting with meshes on a deeper level for a while, so in my down time in the spring I started up on this, but I now have a little more time to explore it as a vehicle for my research. Lacking the deep skills that might allow me to develop, for example, a physics-based engine that can dynamically re-write mesh topology, I've instead been focused on a top-down approach...it uses driver curves, hexagonal paneled mesh tubes, a stitching algorithm, and then a series of topology optimization passes that apply optimized patches where possible to create a unified, closed mesh. Finally, with a little love from kangaroo and weaverbird, I do some dynamic laplacian smoothing and extract the dual.
There is still a lot more room for further optimization, and there are several approaches for me to take...it's a matter of writing the code and/or waiting to see what Santa (aka Mr. Piker) possibly brings for us in the coming months. I suspect that starting from a point that's at least a bit closer to an optimized mesh will accelerate the impact of new functionality in kangaroo...in the meantime, this has been a great exercise for me to better understand scripting with meshes...
update: Thanks for the interest everyone! In response to Andrew's request for further explanation regarding the stitching process:
Walking through it...we begin at (1) with just a series of adjacent and overlapping hexagonal mesh tubes. The first phase of the script (2) identifies any mesh vertices that are either too close to or lie within another mesh, and it extracts all faces associated with those vertices. Then (3) the script searches all of the newly naked vertices for proximity to other meshes...it seeks the closest point and (where possible) tries to match up the topology so that the resulting initial stitch will lead to a hexagon...any place where two vertices on different initial meshes lie within tolerance it splits the difference between the two and welds them together. The topology optimization strategy here is very primitive, and I think further refinement will be able to create a better result. The next bit (4) first takes the naked polylines left over from the newly welded mesh and makes sure that they are split at any self-intersections. This took a bit of time...often, naked polylines return curves that cross over themselves, which obstructs the next part. Here (5) each naked polyline is analyzed iteratively, triangulating in sequence along the lowest angle between segments...so it looks at the polyline, finds the lowest angle, builds a mesh triangle, rebuilds the polyline and then repeats until each polyline has been fully stitched. Here again I think there is room to improve the topological optimization process. Next (5) comes a smoothing process with weaverbird's wonderful laplacian smoothing component. Finally (6) the mesh is ready for testing against the patch database for any pentagons, heptagons and octagons that can be re-worked to maximize the hexagonal duals in the mesh.