How to make instances follow bend of the curve

Hi all,

As far as I’ve described the issue in my initial post, everything works perfectly.
Now I’ve tried to resolve the following thing myself, but the solutions I’ve found, don’t really work with what I got so far.

The issue:
I need the instances to bend with the curvature of the… curve. Below you can see my nodes and the setup so far.

I’d also like the instances to keep their UVs if possible.

Thanks

I’ve now watched and read a bunch of geo node tutorials and I still can’t say that I understand how everything works. Now I’ve established that I can’t solve this by myself and need some help or a solution from the community.

If I use this method, the alignment (facing X towards curve tangent and Z upwards from the mesh vertices) doesn’t work anymore.

Side note: Curve tilt seems unpredictable and really needs to be solved differently.

There are other problems as well. Like if I try to extract multiple curves from the same mesh, the arrayed mesh will stretch from the end of one to the beginning of the other curve:
image
It’s a deal breaker.
I also need to use the accumulated curve length to drive the array length and I’m not sure how to remove the component that moves the array along the curve. I want them match positions and not drive trains around the curve.

In short:
What I basically want is the combination of the array modifier using curve length and the curve modifier, but only using geo nodes and with the additional benefit of it aligning not to the curve tilt, but to the mesh normal and curve tangent.

I’m really not deep enough into geo nodes and math never was my strongest subject, so I’m really struggling here.

It would make me really happy if I could make this work.

Thanks

Hi all,

I’m trying for a while to align some arrays to surfaces in blender using geometry nodes.
In my initial post I got help to resolve the orientation issue I had. It felt like my third eye opened, I achieved enlightenment and finally understood the secrets that were hidden from me.

But soon I noticed that this doesn’t work like a better version of the array modifier using curve length combined with the curve modifier.
Where the modifier method makes the arrayed mesh follow the curve and deform with it, the instances stay rigid and if the curve radius is too small, they will stick out.
image

Below is an example of what it looks like with the modifiers

The problem with this method is the curve tilt. I usually need to put arrays on top of surfaces. For this I extract a curve from a loop on the surface and use it for the array. The curve tilt doesn’t align to the surface though! If everything is flat, it’s fine, but as soon as the topology becomes 3-dimensional and curves in a bit more complex manner, it becomes unpredictable.

I don’t feel like going in and editing the tilt for each curve control point, so I thought there must be a method using geometry nodes that combines all the steps in my workflow so that I can reuse it. It would make my workflow faster and super flexible.

There are methods that I’ve looked into, but they don’t work to my satisfaction.

I’ve made a post before this one which could maybe give you more information, but it didn’t receive any attention, so I’m trying again. I hope I’m not breaking any rules.

Currently I have this setup.


The axes are aligned as I want the curve tilt (the purple stripe) to be. It should be following the orientation of either the green or the blue axes along the whole length.

Here is the node system I have so far.

I hope someone smarter than me can help and that this post doesn’t get buried as well.

Thanks!

@SterlingRoth @zeroskilz @AlphaChannel @Zorro_Weaver

1 Like

This is a method I first saw suggested by @StrayBillie but I cannot find the post it was from:


…This is the simplest method I’ve come across for aligning center-aligned objects on a curve.

You’re basically resampling the curve to the dimensions of the object you’re instancing and then you capture the direction vectors for edges and instancing on edge points.

Good luck.

2 Likes

This is very cool and a great method to know (I can already see where I can use it), but sadly it is not what I’m looking for. The curve has to be extracted from the mesh, otherwise there is a possibility that the arrayed objects intersect with the underlying mesh if the curve segments don’t match with the underlying topology. My clients are picky about stuff like this.

Quick edit:
I use Maya for stuff like this at work. We have a plugin that does what I’m looking for, but in a very manual way. Having this in blender geometry nodes would save a lot of time.

There is a plugin that makes the curve align properly with the surface, but this would not be an improvement over the method we use in Maya.

You can try this curve-tilt node-group:

If you use the normal as the reference vector the instances will align to the surface.

Good luck.

2 Likes

That’s a rabbit hole I have to go down first. I hope I manage to grasp it all :sweat_smile:

I might get back to you with followup questions, or a thank you if it works out.

Thanks for the reading material for now :+1:

Sorry, you can probably avoid the rabbit hole and just use standard nodes:

Here selecting the middle loop of edges and instancing a cube on it… trick is to combine the edge direction hint mentioned above with capturing the mesh edge normals.

Good luck.

4 Likes

Good morning! I was AFK for the weekend and didn’t see your reply. Thanks again!

I see the alignment to the surface normals and that’s great, but I still don’t see where it makes the instances deform with the surface too?

Right now this is happening…:

… but I need this to happen:


No geometry nodes here. Just array and curve modifier

It needs to bend with the curve/surface.

I’ve wrapped my head around the rotation and alignment issue. The deformation is what is killing me now.

Or maybe I’ve missed something in your explanation? It’s hard to be sure when talking about a topic I barely comprehend the basics of :sweat_smile:

I’m gonna go through the linked thread and see if I can learn some more.

Thanks

Hello this quick node setup may help you https://www.youtube.com/watch?v=iR8zSQuQW9A

1 Like

ah ok i see you need it to deform the surface, it doesnt the curve modifier do the job for you?

1 Like

Hi @MichaelBenDavid

Thanks for the video. It’s easy to follow and informative, but still doesn’t solve my main problem. He still uses rigid chain links, but I need them to be bendy. Like soft mushy rubber links that bend with the curve.

1 Like

No. The curve modifier relies on the curve tilt for the alignment and the curve tilt is not really good for that. In one of the earlier replies in this thread you can see the tilt of the curve represented with a purple poly strip. It doesn’t follow the surface and even crosses it on while it bends.


The curve tilt makes the poly strip go from above the surface to below it.

The curve modifier also doesn’t make the workflow faster and scalable. I would have to repeat the same manual steps for possibly hundreds of time, depending on the project.

1 Like

you can study higgsas curve deform node group here (Higgsas) Geometry Nodes Groups Blender 3.1/3.0

Maybe you can adapt it to instances and you need to realize instances in order for them to deform.

4 Likes

That’s treasure trove of information. Thanks for the link. I will dig in as soon as I find some time.

2 Likes

Ok, how about this?
I have an idea, but no clue how to do it and I need you to guide me.

I have the instances aligned nicely. now I want to position all the vertices to the nearest point on the curve, and then give an offset to each vert based on their relative point in space. Similar to the @higgsas curve deform node group, but without the adjustment around curve length.

I’m stuck at the “position them on the curve” part. Whatever I try, the vertices get all positioned to 0,0,0
Is this even possible?

Thanks @zeroskilz @canerasln @MichaelBenDavid

1 Like

sry i don’t know much about curves deforming meshes, don’t have the time to figure it out currently.

2 Likes

Can someone tell me how to slap the vertices of the instances to the loop or curve?

I think I can get the Y and Z offset if I use a scale instances node (Y and Z to 0)and get the difference in position from there (in theory, practically it’s denting my head), but I can’t figure out how to apply the offset on X. So I thought if I can use something to project the vertices to the nearest point on the edge or curve, I could apply the offset after that.

I can’t figure out how to do this with the Raycast node and I’m not any smarter with the Sample Nearest node.

Am I even on the right path here, or is it wishful thinking?

Thanks in advance

Here is a bit compilated setup that beds instances, also alights it to mesh normals

curve deform.blend (365.2 KB)

6 Likes