algorithmic modeling for Rhino
I have been modelling large scale versions of carbon nanostructures out of reed and 3d printed nodes and am trying to develop a workflow to model these structures using grasshopper/kangaroo. Below are some pictures of the specific configuration I am trying to model out of the reeds in varying stages of being "rolled up".
Basically I am trying to roll up a hexagonal sheet into a cone, while maintaining their edge lengths. I know that there are a lot of threads on this forum concerning modelling topology based off of equal edge length polygons, my main interest in this is not to develop a random surface to apply a function on top of but to make a tool that is more generative based off of the material/topological properties of carbon bonds. The closest thing I have found related to this are the discussions of Lobel frames.
Currently I have been trying to work through it from two ways, one using an array of hexagonal solid bodies with magnet snaps at their vertices and trying to manually zip up the cone using K2. However because all of the planes distort slightly when taking the form it is proving to be difficult and not exactly what I am looking for.
I think ideally I would like something that can just translate the hexagonal form using Daniel Piker's mesh dual from a equilateral triangle mesh after it has been rolled. Then I would have the network of closed polylines to build from. However I think the current way I have of zipping up the sheet using the K2 gripper is a bit too analogue. I also cant seem to find a way to join the mesh after it has "zipped" together in the simulation to create a smooth transition as well as complete the hexagonal pattern along the seam.
Another problem with the mesh dual strategy is that it only works with closed hexagons, it does not leave any loose strands open to be "zipped".
Attached are the two working files for the strategies outlined above.
In short I am looking for suggestions on how best to approach ways of modelling the form that I originally modeled out of reed. None of the strategies I have come up with get me the topological equivalent of the built model.
More specifically, Does anyone know of a way of joining a mesh seam during a kangaroo simulation so that it can inherit the hinging properties of a closed mesh?
Any help or suggestions would be most welcome!
**An important topological side note**
The draft angle of the specific cone that I modeled was determined by 4 pentagons placed at the nose of the cone. The rest are equilateral hexagons spiraling outward and growing each row. I haven't really figured out how to get there yet with the script but thought it would be important to mention for all you geometry geniuses.
Really nice work, August!
I have been fascinated by this simple system for a few years. Here is my earliest illustration:
The principle could be described as this (for triangular/hexagonal meshes)
In your example the round tip pf the cone has valence 5 connections, the rolled up sides have 6 and the branching point (where the surface is growing) has 7.
In my example the actual meshes were modelled flat, observing to correct valence patterns only. And then relying on the geometrical/physical constraints simulated in Kangaroo to 'pop into shape'. I hope I can share a demonstration of this using your geometry soon.
By combining these principles it should be possible to recreate any surface (with more or less precision). The Lobel Frames you shared look fascinating. They seem to establish an archetypal set of shapes that can be modelled using this principle. I have to look into this further.
Whether we look at the triangular primal or polygonal dual of these forms/networks is open to us, they are completely interlinked (geometrically and energetically). On the computer it is often easier to work with the triangular primal representation as so many applications can handle triangular meshes.
Design tools, yes there should always be more good design tools. Daniel Piker's Mesh Machine is quite an incredible example as it can dynamically change the connectivity of the mesh to directly control the local surface. Here is a great paper Daniel shared earlier to discuss this in more detail
and another one
so much to say..
I hope there are some helpful pointers
Thank you for your response and for sharing those links. I'm a huge fan of your work and it's really great to hear your thoughts on this.
Yes, it is quite an incredible phenomenon. For more complex structures do you also start with the 2d pattern shown in your video, or do you work from the form down with something like mesh machine? As I model more complex structures out of reed it becomes more difficult to imagine how to piece them together from the 2d primitives in Kangaroo but it seems to be the only way to ensure the symmetry of the polygons.
Thanks again for the pointers, this particular project has been quite rushed and I've had to stop fiddling with the script and start cutting all the parts. I do have an updated script and many more questions which I will share after things get a little less hectic.
In general with Kangaroo it is easier to change geometry during simulation than it is to change topology.
This is because of the way it interacts with the rest of Grasshopper and its directed graph system - generally you set which points a goal acts on upstream of the solver component, and since the data only flows one way this doesn't get changed by the solver.
There are some exceptions to this - like snaps or collisions, which are goals that act on large numbers of points, and which pairs among them are interacting can change during the simulation. However, for other goals like hinges, that aren't written with this sort of dynamic connectivity included, it isn't possible with standard components (though it is via scripting - you could either have a custom version of the hinge goal that selected dynamically the points it acted on by proximity, or you could have a custom solver script, which added and removed goals between iterations).
For this reason, the approach Mathias shows works well - as long as your topology is what you want, you can start with very unequal edge lengths, and let them even out once the solver runs.
It can also be very helpful here to work with mesh subdivision - because this does not change the placement of the irregular vertices (corresponding to the pentagons and heptagons in the dual), it just adds extra regular vertices between them, so you can start by modelling the simplest level with just a few triangles.
Also, although topologically you can switch back and forth between them, when working with hexagonal networks like this, there is actually quite a bit more geometric freedom when relaxing them than with meshes of triangles with equal edge lengths.
Fixing the edge lengths of a triangular mesh removes most of the freedom of the surface to change shape, since it also fixes all the face angles.
With a hexagonal mesh though, the shape can deform without changing edge lengths, through changes in the angle between edges, and also via twisting about the edges(which can happen even keeping the angles fixed). It also looks like the sticks can bend a bit in your model.
I had a play using some snapping components to show one way of exploring these types of structures - definition below. (Probably for a more controlled design process though you still want to start by modelling the base meshes in Rhino, but it can be fun to play with.)
In the first file below I've used a combination of snaps and collisions, which have the effect of keeping the bonds straight.
In the second example I showed another approach using rigid bodies. Because they have a thickness, they also have some resistance to twisting about the connection, unlike in the first example.
In can sometimes be useful to switch on and off either the collisions or the snaps here (with the toggles connected to the strength multipliers), because the collisions can make it hard to pull parts together to make new connections, and if something snaps together unintentionally you can still pull them apart.
...I've also been thinking that one day it would be interesting to try making a script that lets particles store and update an atomic valence, so they snap together with other ones to form molecules until they saturate this. I'll let you know if I get this working.