# How can I make simulation node particles stop and swap geometry at the end of their lifetime?

I have a geometry node setup that generates randomly moving points. Ideally I'd have them to start out as circles then pop without moving position once they reach their lifetime, like in this gif.

So far I've managed to create a system that stops particles once they reach the end of their respective lifespans, but there's a few limitations with my setup.

I only know how to make all of particles swap geometry at the same time, rather than at the end of their own relative lifespan.

And the popping animation is made using keyframes, meaning that it pops at the same place on the timeline for every particle.

Is there any way I can swap the geometry and play the animation locally for each particle?

As far as I'm aware, you'll need to do the animation in Geometry Nodes, and since the animation is simple, you can do it fairly easily.

First, to animate a single strip you can use a Float Curve node for each end of a line to offset it:

We will need a way to create multiple of these lines per point and offset their points only after instancing so that different animation progress is possible.

The value in the Value input of the Float Curve node needs to be in the $$[0,1]$$ range for the correct animation, $$0$$ being when the point starts dying, and $$1$$ being when the dying time ends, to get this time you divide the time since it started dying by the death length, getting the normalized death progress.

To make things organized, I separated the points by inactive, active and dying. Inactives are moved to actives if their start time is reached; actives are moved to dying if their lifetime passed; and dying ones are deleted if their deathtime passed, the normalized death progress is also calculated and stored here as a named attribute:

For each dying point we need multiple of the lines above in an circle, and to do that you first create a mesh circle of radius 1, store its vertex positions as a named attribute, and set the position of all points to $$(0,0,0)$$ before instancing a line of length $$0$$ on its points, this line has it endpoint marked as 'up' with a boolean named attribute. With that we have a line for each stripe and an offset direction (stored position) to offset its points. These instances are then converted to a single instance.

With the instance for dying points done, instance it on the dying points, then capture the position of the instances (so that we can rotate the stripes around its source point to the desired direction) before realizing them.

Now is when we offset the line points using two float curves and the offset direction, switching between them for the endpoints using the 'up' named attribute stored previously:

After that we give thickness to the lines using the Curve to Mesh node with another line with the desired length as profile:

And finally rotate so the animated shape points to the desired direction instead of up:

For the points that aren't dying, but moving (the active ones), just instance the circle mesh on them:

After all of that just join the active instances, the animated geometry and base geometry.

Full node tree:

$$\small\text{Blender 3.6.5}$$

• omg! I'm speechless. I wish I could kiss you right now, this is incredible! Thank you for not only completely overhauling and fixing my project but also for taking the time to explain it so clearly. I'm literally incapable of expressing the extent of my gratitude to you ❤️ Commented Nov 19, 2023 at 3:49