The initial mesh you choose can have a huge effect. If you can find the time to follow this topic you can see we start with an initial mesh and then subdivide it before the minimal surface bit happens.
Something to bear in mind here is that for the curves you show, the only true minimal surface (zero mean curvature) possible is 5 flat patches!
Because it is defined by a balance between the principal curvatures at each point (they have to be equal and opposite), a minimal surface can never form long thin necks like this.
I’m guessing though that what you are actually after is a relaxed surface, as could be formed by a fabric with all parts in tension (just not equal tension in all directions).
Kangaroo can find both true minimal surfaces and more general relaxed surfaces, and it would be fairly simple to set up here.
It’s true as martyn says that the initial mesh is key.
I would actually use a regular quad mesh for this case though - it’s probably easier to control.
This just looks tremendously helpful.Thank you Daniel. I’ve been looking at Shigeru Ban’s Pompidou Center in Paris and taken by the lattice structures he has been able to achieve.
The distance between something that is actually “structurally expressive” and what “looks good” is often deceptively far apart but I thought I would start at least looking at methodologies for replicating these smooth surfaces with wood latticework as a starting point.
Your illustration is right on the dot. I’ll download this grasshopper file and see how far I get. I did manage to get Kangaroo 2 installed.
Interesting what you say about the four circles being the minimal surface. I think I read some information previously in this thread about “necking” and it sounds like that phenomenon is what you are discussing. Among other things, a piece of fabric has the ability to deform as a function of its length in a given direction. I suppose soap film doesn’t perform the same way.
Thank you again for all this. You have me wanting to recall my primitive, and somewhat bygone, understanding of eigen values, gaussian curvature, mean curvature and such…The Kangaroo engine is great and I can’t wait to introduce it to my son who is in the middle of a high school physics class.
No Kangaroo as physics engine is a great tool for relaxing shapes just as Daniel has shown here. Yet the outcome is a dense mesh. This works great and extremly easy if you have no modification in mind later on.
But just imagine you want to cut out a specific part of it. Now you are dealing with meshes and this becomes really difficult to do. Especially if your cutout shape is curved.
I mean you can combine both approaches. Create a mesh as reference and reverse it with Sub-D surfaces. Sub-D can be easily converted to Nurbssurfaces.
Of course the surface layout is not optimal, but its curvature continious and the eye doesn’t stop somewhere.
My point is just, if you don’t care about having a perfect relaxing shape, you can directly go for sub-d and give your form a unique detail.
“Mean curvature” is just that both principal curvatures (at u and v direction, which are directed/signed) sum up. Its “Minimal” if they sum up to be close to 0. This basically reduces the tension of a shape and makes it “relaxed”. Rhino has analysis tools for that. So a pure modelling approach can be optimized by having this analysis on.
If one implements structured quadrilateral meshes (i.e. where the order of the vertices within each subdivided coarse face is a regular grid going from left-to-right/down-to-up) it’s pretty trivial to convert the relaxed mesh into NURBS patches after the form finding stage. Here’s an old example of this workflow (about 20 seconds in):
Edit: Since this was originally part of my PhD studies I think I can share it. Here’s the subdivision and mapping components I wrote implemented into Daniel’s example above (baked brep on the right). Note that the NURBS patches don’t have great continuity with this method, but I imagine that could be implemented as well (maybe even using K2 goals):
If it has to be a minimal surface, then once the boundary is set, the shape is determined, and isn’t something you can change. For certain boundaries there might be a small number of discrete options to choose between, but that’s it.
If the target is just something with a smooth looking shape that’s going to be built out of rigid material, and you want lots of freedom in the shape, then I agree, hand sculpting a SubD might be easier.
If it’s going to be an actual tensile structure though, the possible shapes are still strongly constrained if you don’t want your fabric to end up flappy or wrinkly.
While it doesn’t have to be a minimal surface, as the tensions in warp and weft directions can be unequal, you do need them to be physically consistent across the surface. Sculpting something which does this by hand seems rather tricky, as you wouldn’t have any feedback about the balance of forces. Yes, you can check the mean curvature, but since there are valid tensile shapes far from minimal, it won’t be much help there.
Also, one correction - the 2 principal curvatures are not generally in the u and v directions of a parametric surface - they follow their own set of directions and are always perpendicular to each other. This interplay between the directions of geodesics, principal curvatures, and the actual warp/weft fibers of the fabric is one of the most complex parts of designing layouts and cutting patterns for tensile structures.
Thanks for sharing these!
Great to have some better ways of generating the strips.
Also, interesting point about continuity of NURBS surfaces.
Here’s some nice work on relaxing NURBS directly in Kangaroo with some isogeometric goals:
The same group have also developed a whole plugin around isogeometric analysis - Kiwi3d.
I wonder as well if with the native Rhino SubD objects now, whether it might make sense to create some specifically SubD based goals. Of course one can already relax the control mesh of a SubD and have it update, but interesting to think about basing the forces not on the edges of the cage, but the changing surface of the SubD patches themselves.
About the continuity. I don’t think its feasible to align surface with higher continuity just by appling “goals” to it. Matching (multiple) surface can result in a state where there is simply no solution. The layout of surfaces is extremely important to ensure G1+ continuity on multiple edges. When working in the Automotive design, we usually tried to find a surface layout which made it possible to match. The other way around does not work, you cannot ensure higher continuity on an arbitary set of surfaces. Of course you can move points closer to the edge, but this is essentially not leading to good overall look, because a second constraint is the overall flow of contuinity (no waves etc)
Thats by the way the greatest drawback of sub-d surfaces. It forces to use an (internal) surface layout which makes it really difficult to build in details, like transitions from sharp to smooth areas of a model. Yet its an extremely useful compromise. Since you are able to work with the surfaces further down the pipe!
So for something productive (which is not “just” an 3d print) I would always apply some sort of extra step in trying to get at least a sub-d surface model out of it. Of course somebody could try to apply relaxation on sub-d’s, which somehow is what a sub-d already does? So I’m not sure if the outcome will be much different…
Why not? if an energy accurately models the difference from G2 continuity where the patches join, and we minimize that energy. I’m talking about the situation where none of the surfaces are fixed, except at some external boundary (and they are all untrimmed). We could combine it with some other fairness and spacing targets to avoid waves etc.
There are constraints on the shape of the external boundary which allow finding a continuous surface, but provided these are met and you are free to move all the other control points as much as needed, what arrangements of patches around an interior vertex would prevent a G2 matching?
Now actually deriving this energy in a useful form isn’t easy, but I don’t see any reason why it isn’t theoretically possible.
As for relaxation of SubDs - subdivision results in smoothing, but it is a very different smoothing to what you get from relaxation.
For example, this simple elbow of 3 cubes. from left to right - SubD without relaxation, SubD with cage edges relaxed, subdivided then relaxed as a fine mesh.
What I’m wondering about is an energy for moving the points of the coarse cage such that it gives a shape more like the last one, but without needing to actually move around all the points of a finely subdivided mesh.
I mean you can enforce g1 and even close to g2 to almost any situation. XNurbs and similar tools shows that its possible to match up arbitary patches in a visually satisfying manner. Still the outcome is often not a very nice surface, resulting in issues when working further with such surfaces (such as offseting)
Of course if such a goal generates a situations where matching is easy then its likely to work. But it may require not to move the affected cps in normal direction but also in u v direction and the boundaries as well.
Very good conditions for matching surfaces is having the same or similar surface properties of all surface involved and that edge- and centerisolines having g1 continunity to its counterpart on the other surface. This however requires to move even the edges. It is also beneficial if cps are equally distributed and showing a smooth overall flow. And a very ‘rectangular’ of ‘fan-like’ surface boundary helps as well.
In Rhino 7 McNeel finally introduced a deviation analysis, which basically creates needle lines on the edges to evaluate the continuity of two surfaces. This is extremely useful, because it shows that continuity can be very different along an edge. Even slightest unsmoothness, can cause great local discontinuities.
With such an analysis you can even manually match a surface, pushing it under a certain tolerance. Something I have done very often when modelling professional, especially on corner fillets. I think if you try to manually match a surface to g1 you can clearly see, that its not just pushing points up and down. You further will notice that the iso alignment is extremely important, and not having that makes it extremly difficult, even impossible to match. You can further check how well Rhinos (and any other CAD’s) ‘Match’ command actually works if the conditions are bad.
The same Rhino can do now is shown here using Icem:
@DanielPiker Thanks for mentioning us! You can use Kiwi!3d for formfinding while preserving your initial NURBS discretization. I actually tried to formfind the Centre Pompidou Metz for my thesis. It worked quite well. Kiwi will try provide a minimal surface, i.e. the columns will reduce to a line. This can be prevented by using a high Young’s modulus. Then, you can choose an intermediate result inbetween your initial surface and the minimal one.
I’ve spent some quality time looking at your kind grasshopper routine and trying to adapt it specifically to what I am trying to accomplish. Given that I am still trying to dial in the milling process also, this complicates things. Could you explain a bit more why you include the following nodes in the routine?
I’m attaching a grasshopper routine that is undoubtedly more involved than it needs to be. Please forgive any lack of clarity in the file. Of substance is the fact I can’t seem to generate the circular holes that you have. For the sake of a generating a good theoretical surface that can serve as a basis for the wood members I find myself wanting these circles. It undoubtedly has to do with the fact I have skipped this whole warp and weft thing due to the more involved nature of my basic mesh. Any advice on this front is appreciated.
The separation into Warp and Weft is not always needed - just sometimes it can be useful as a way of controlling the shape. For this to work well though, you need an all quad mesh designed in a way that can be separated - like the red and blue lines in Anders’ post above.
(I see you also have the boundary option of the post-relaxation Weaverbird subdivision set to Fixed - switching this to smooth will give you smoother boundaries)
Your mesh is composed of a mix of triangles and rectangles. What is the reason you chose this arrangement of an orthogonal grid with holes cut out instead of the concentric/radial arrangement shown in the earlier posts?
It’s not necessarily a problem, depending how you want to use it, but for fabric structures it often makes sense to orient the mesh edges in a way that at least roughly corresponds to the way the fibres of the fabric will be oriented.
You talk about building this from wood though, so maybe this is all less relevant in this case.
One thing worth thinking about with these Shigeru Ban structures is that although at first glance they have a similar look to an actively bent timber gridshell, the construction technique is very different.
For a gridshell like Mannheim, the laths start out straight, connected with joints allowing rotation, and are bent into shape as the shell is erected. The design and calculation and erection procedure of these structures was complex, but the pieces themselves were relatively simple.
For structures like Shigeru Ban’s 9 bridges golf club, or Pompidou Metz though, the pieces were formed into very complex doubly curved shapes before being assembled. I believe the milling, lamination and screw arrangement for these pieces was all quite involved.
Thank you so much for the thoughtful reply. Yes, you have correctly sensed my challenges.
I am trying to create a more orthogonal approach to constructing the woven wood structures like you see so ambitiously executed at the Pompidou Center. I am also trying to do this with most of the work done on the CNC table. I dream of milling all this with sufficient precision that running single bolts through the predrilled half-lap points will go together with very little wood work in the field.
I have been studying how plywood deforms when it receives a few precisely placed “slot” cuts. The idea is these cuts are made with a thin tapered bit, and the plywood is steamed and bent until these cuts close. I have machined a stainless steel steaming jig that will confine the steaming to a focused “strip” of the plywood surface. The jig steams both sides of the plywood along this fold line. It is a pretty involved process, but I’m hopeful the fruits of the labor will result in a rigorous methodology for consistently bending plywood (specifically Russian birch) in a single cylindrical “roll” through various angles and with various approximate radiuses. A single grid line will essentially be constructed of a couple of different cylindrical bends. This is important since the shape we are discussing has a gridline trajectory that is not purely cylindrical. The idea is to mill a single “grid line” flat on a table while planning for its future required distortion as it crosses other members and ultimately assumes the mesh shape. The grid line will need to be broken into several segments since my CNC table is only 8’. Hopefully, the redundancy of the mesh will minimize the problems associated with this relatively short segmentation.
Yes, your observation about the difficulty erecting these structures is a great point and -as far as I’m concerned - one of the biggest obstacles to seeing more of these made. The thing that seems to be most often missing is the required research linking the great geometric information that Rhino (and Kangaroo) can provide with the material performance data.
I love the Pompidou structure and how its inspiration coming from an Asian hat, as it does. But establishing an orthogonal language has its own compelling rationale despite its less isometric geometry. This brings me to a fairly subtle but important refinement I need to make to how the mesh you kindly shared with me behaves. I have attached a sketch that attempts to summarize my challenge. The way the smoothing worked in your last example, it wound up inscribing a fairly circular form inside an octagon where the grid pattern formed the column base. I need the mesh to superscribe this octagon. See sketch. Any help you might have in this regard is appreciated.
Thank you again for all your help thus far. Kangaroo is just great.
I’m taking a second look at this beautifully simple example and I’m wondering if the circle that appears to be generated from it at the base is a perfect circle. If so, the simplest way to produce a helpful starting mesh would be to compensate for the difference that exists between the octagon and the starting square by scaling the inner squares 1.082. See attached image. What do you think of this approach?
Thank you again for Kangaroo, and sharing your introductory thoughts about minimal surfaces in Grasshopper. So often seemingly innocent project inquiries turn out to be a journey into worlds unknown. To chase the dream of producing columns similar to Shigura Bans in Rhino, I’ve put together a couple helpful-but-flawed grasshopper routines (highly inspired by your examples). These routines produce developable ribbons out of compound curved surfaces (when I don’t encounter bugs). In any case, here are a few images to share the progress this far. Thanks again for your help.