Heat Method in Geometry Nodes
I made a small tool. It’s a welcome distraction from Squishy Volumes. By the way, Squishy Volumes now simulates on your GPU. Blog post(s) to follow.
If you’re just here for the nodes, you can import this via Tree Clipper:
TreeClipper::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
Basically, this request for help on Reddit sparked the idea. It immediately made me think of the The Heat Method for Distance Computation. A quick search didn’t yield something like this for Blender, but I found this for Houdini, which is probably very similar.
I couldn’t let it go without giving it a shot.
It turned out pretty good. I decided to take it as an excuse to get into blogging again, and here we are.
Problem
We want to get the “flow” of a surface. This allows us to do many things, for example, create the scales of armor and have them point in the “natural” direction. Let’s stick with that example.
I don’t know how to do that with Blender’s built-in tools. And judging from the lack of provided solutions to the Reddit post, it might not be possible. (Not counting custom Geometry Nodes setups as built-in tools)
Manually orienting each of the scales on the armor is obviously not feasible. And something purely procedural is also not desirable (IMHO). One wants to retain a good amount of artistic control.
Being able to paint the mesh to create hot spots for the scales to point to seems like a good approach!
Solution Idea
We could leverage weight painting to indicate where we want the scales to point. That is nice because it gives immediate feedback. But this would be somewhat tedious to do consistently across the whole mesh.
So that’s where the heat method comes in.
We can treat the painted weights as heat and solve heat diffusion on the mesh. Then we take the directions of the gradients of that diffused heat and et voilà!
Controllable, consistent directions on the mesh.
The calculation of the gradients is simpler than you may think: we can get an estimate for each vertex by summing the vectors that point to its neighbors and weighting that sum by the neighbors’ heat value.
So how can we do that in Geometry Nodes?
Realized With Geometry Nodes
Here’s the whole picture.
Diffusing the weights is easy with the Blur Attribute Node. And we’re ok with very small values far away from the hotspots that we paint. We just need them to be slightly different in the right direction.
The gradient calculation is more difficult. I don’t think that there’s a built-in node for that.
We first need to have a way to iterate over the vertices’ neighbors. That’s a job for the Repeat Zone! Alas, that needs a constant number of iterations. But not to worry, we can combine the Total output of the Edges of Vertex Node
and get the Max via the Attribute Statistic Node.
Of course, this will yield too many iterations for some vertices, but we can check for that and skip adding something if the current Iteration exceeds the respective Total.
We need some shenanigans to get the vertices’ neighboring index, which I’ve hidden in that Edge Neighbor Index group:
Then it’s a simple matter to get the weighted vector to the respective neighbor.
After the zone, we have the gradient estimate and can apply it to our problem. We calculate a rotation that matches the gradient direction and instance a given object on the mesh vertices. It seems like a good idea not to instance on vertices that have received no heat at all.
How to Use
Install Tree Clipper and follow the steps in this video:
Fin
And that’s it. Let me know if this is useful to you!