Gaussian curvature differentiated goal Kangaroo

Hi @DanielPiker,

It would be very cool if it were possible with Kangaroo to apply different goal regarding some specific geometric characteristic.

For example, if I’m working with a torus-like form, I can get an inflated-found form with applying a Pressure goal and a quite flexible Edges Length goal.

But if I somehow want to stick a bit more to the original geometry, the positive double curvature areas trying to get bigger would stay in a membrane equilibrium, but the negative double curvature areas trying to get smaller would start to form some folds.

For this basic form, a simple workaround it to differentiate the input mesh and apply the flexible Edges Length goal only to the inside part of the torus.

Torus (157.8 KB)

But if I work on more complex forms, it can soon become a difficult setup. I think It could be possible to script a Custom Goal to adopt this behaviour, but the tricky part is ofc the interpretation of gaussian curvature in Kangaroo. I’ve looked through some articles (like this one, this one, or this one describing how to translate gaussian curvature in a discrete mesh, but I don’t really understand how I could implement this in a Custom Goal component.

Would you have hints for an implementation of discrete gaussian curvature in Kangaroo ?

Thanks a lot.



Hi @flixchameroy

It’s an interesting topic.

There’s a little group of components at the end of this example that calculates the Gaussian curvature of a mesh per vertex:

(it gets the angles between ordered edges and sees how much more or less than 2pi they sum to)

So If you want to base some parameter of a goal on the Gaussian curvature of the starting mesh, that could be done without scripting by feeding this value in.

The custom ‘AngleSum’ goal at the start of that script also shows the calculation of the live angle sum as it changes during simulation. There it tries to make it 2pi everywhere so the mesh is developable, but you could instead take that calculated angle sum and use it as a multiplier for something else, like pressure or edge length.


If this is the ultimate aim, I think a different approach could work better.
For tensile membranes (inflated or not) there are limits to the shapes they can take while remaining all in tension (for instance no membrane will inflate to a bowl shape without some other sort of restraints), but still quite a lot of freedom of form depending on how the tension is distributed (unlike just the minimal surface or CMC surface solutions where tension is constant across it).
Using mesh edges with non zero rest lengths or variable strengths can be a way to adjust these shapes, but it’s not always easy to see how to change these for the input to get the desired shape and without any parts ending up in compression.
I did work some time ago on a goal which would make live adjustments to local tensions of a membrane during form-finding to get it as close as possible to a reference shape while keeping the tension within given bounds. Not sure I ever posted it though. I’ll dig it out and have another look.

Nice ! I did remember reading something like this somewhere in the forum. Looks like what I need, I’ll have a look at what I can achieve with that.

I think this was misformulated. Trying to stick to some geometry is not really the goal here, I’m more trying to work with membrane geometries lying between inflated and tensioned shapes, both worlds needing different inputs. The ultimate aim would be to avoid compression anywhere is the geometry, even at the cost of going further from the starting geometry. Thus, being able to make live adjustments to local tensions also looks like a neat feature !