How to make a loop animation in Geometry nodes using noise texture?

Hello all,

I have a problem while creating a loop animation for particular object I made.
Everything I made using nodes is perfect and works really well, but I can’t find anywhere how to properly do loop animation with noise texture.
I suppose it’s kinda hard since I have a few drivers put for frames, so I really don’t know how to do it.
I tried few methods like turning angle and animating it like 0-360 degrees but animation looks really weird in the end (maybe because of origin point since this only works if I plug noise in Offset input on Set position node which moves mesh to different place). Angle has value of 15 because if it’s zero the animation for Center won’t play.

I really hope someone can help me with this, I suppose Math nodes could be used here but I really don’t know which way to go.
If someone know more please let me know,
Thank you!

Here’s a thread on the topic:

1 Like

Thank you for your reply!

I tried recreating it like you did and it works really good.

Only problem is that it is too fast since driver value is only #frame, but when I slow it down, it’s not looping.

Could you help me more how would I do shorter animation (120 frames) and a driver with a value of #frame/10 so that it still loops?

Thank you so much :slight_smile:

The number of frames in your animation has to be equal to this number here:

image

But reducing the number of frames in your loop will lead to a lot of distortions.

Here some explanations:

What makes looping procedural texture animations in blender a bit complicated, is that we are restricted to linear 4D noise nodes.

We can loop animations by shifting the coordinates around a circle in 2 of those dimensions.

If you now have a 2D texture (that does not loop around an object), say, for the surface of a body of water, you can use 2 of the 4D-noise dimensions for the space dimensions and 2 for the time dimensions, which leads to a looped texture animation without any distortions.

But for a displacement map on an arbitrary object you want 3 space dimensions. So one of those dimensions (at least) will be coupled with the time dimensions. This is a bit hard to visualize (4D), so try to imagine that you want to loop-animate a 2 D texture with only a 3D texture node available. what you can do is create a filled torus in 3 Dimensions, the smaller circle being related to the space dimensions and the larger circle to the time dimensions.

Looping through the time dimensions will make the animation on the outer side of the torus go faster than on the inside.

Furthermore, if you keep the number of frames fixed, the speed of the animation is coupled with the size of the noise.

You can reduce the distortions by making the larger circle of the torus larger compared to the smaller circle (the torus becomes more like a cylinder), so the inside will animate almost as fast as the outside.

However, this will speed up the animation, as cycling through the time dimensions now covers more space.

The only way around this is to increase the number of frames in your animation loop.

1 Like

Actually, this particular problem has not let me sleep since that original thread over a year ago :slight_smile:

A slightly better method, if you only need displacement in one direction and are working with the Noise node may be to use the frame information not as input to the noise node but to interpolate between the color channels of the noise:

A bit of a downside is that the animation speed is tied to the animation length. (You can multiply by an integer factor, which makes the animation repeat multiple times within the configured frame length).

(Blender Version 3.4.1)
noise_loop_3.4.1_v01.blend (883.9 KB)

1 Like

Thank you so much for both answers!
I tried hard to understand every bit, and I used your file to make everything in the end.

Since you said that animation speed was tied to animation length, it was too fast for me since I needed a really slow animation, but I knew it was because of the loop, since it can only loop when frame hits loop length. For some reason, I still don’t know why (probably because I wanted to see how things work), I deleted “Animation Speed” input and Multiply node right after Divide node, just to get different motion and the one I needed, for then, because then it looked like particles are going only up and down, so in the loop it didn’t look that well.

Since I needed some randomness in animation, I added Vector Rotate node with Position input, so that particles can rotate and so that it’s not looking that obvious. I animated Rotation part for every axis in Vector Rotate node to go from 0° to 360° so it can also go in a loop, but for some reason it looked like it’s using Bezier interpolation, even though it didn’t, but it started slow, in the middle it was fast, and then again slow. So to fix that, I just moved starting degree to 180° and ending to 540°.
In the end, loop length determined how slow the loop was going, but I know it could only be 60, 120 or 240, since I had 240 frames (I still don’t know why haha), but I used 120 since it was perfect for me.

Thank you so much again for your help, and I’m glad I could learn more about Blender again, even though this part was the hardest thing I encountered haha :smiley:

1 Like