Blender Geometry Node Particle System
Overview
The "Blender Geometry Node Particle System" is an alternative to Blender Particle System. Note it is not meant to completely replace it. Instead, It provides a way to generate and simulate particle physic directly in the geometry nodes.
The nodes have been tested with Blender 4.3.
In this package, you will get a bunch of geometry node assets and predefined geometries for creating a complete particle system using geometry node power.
The current implementation provides:
- Three solvers: Euler solver, RK2 solver and Euler solver with support for collisions.
- Forces: weight, wind, attractors, drag.
- Spawner: spawn particles on your defined geometries
The current implementation supports multiple particle systems at the same time, multiple wind, attractor and drag forces.
It also support collision when using the Euler Collision solver. Note that collision is a complex problem and there is still issues with complex or multiple colliders where particles can go through.
Installation
Copy the provided simulationNodes.blend file into your asset User Library Folder:
That's it. You should now have access to the simulation geometry nodes in your asset browser.
Manual
Assets
In your asset browser, under Simulation, you will find geometry nodes and objects. Geometry nodes can be used directly inside the geometry node modifiers. The objects, representing forces, can be drag and drop in the 3D viewport.
Step by Step Basic Configuration
- Start by creating an object that will be used as the emitter. Let's create a plane for the moment.
- Create another plane that will be used as the simulation system for the particle system simulation and also as the referential system. Optional: call it: simulation.
- Add a geometry node modifier on this object.
- Add a new node by searching for EulerSolver.
- Set the Simulation input of the EulerSolver using the "Self Object" node.
- Set your desired gravity: -9.8 for instance.
- Set the masses of your particles. If you set the value directly, all the particles will have the same mass. Let's set it to 0.01.
- Optional: Set an initial speed for your particles.
- Set the life span in seconds.
- For the particles themselves, you have two options: define the particle instances directly or use a spawner (or both). Let's use the instances. You can generate your instances with any geometry node you want. The only constraint is that you have to provide instances and not just points.
- As an example: add a "Distribute points on Faces" node followed by a "Instance on Points" node and connect the Instances output to the Points input of the EulerSolver node. For the Instance input of the "Instance on Points" node, you can choose whatever geometry you want like a sphere for instance. Don't forget to apply the scale on your instance object or change the scale in the "Instance on Points" node.
- Connect or join the Points output of the EulerSolver node to the output of your geometry node.
- Congrats! You just have you first simulation. Press Play. You should see your particle falling down and accelerating
Your geometry node should look like that. Note that the "Object Info" node representing the emitter. It must be set to relative.
Your scene should look like that:
Going Further: Drag
We will now add some forces to the simulation. In the EulerNode, you can see a Forces collection input. This is the collection where all the forces are defined.
- Create a new collection and optionally call it Forces.
- Drag and drop the Drag object from the asset browser into your 3D workspace. You should now see a box. Scale and place it like you wish. This represents the volume where the drag will be applied to the particles.
- Place your drag into the Forces collection.
- Click on the drag in the scene outliner. Go in the modifier tab, you should see a geometry node modifier with a drag property. By default the drag coefficient is set to 0.1.
- In the EulerSolver node, set the Forces input as the Forces collection we have just created.
- In the playback timeline, go back to the first frame and start play. Now instead of infinitively accelerating, the particles will reach a maximum speed due to the drag until they go out of the drag volume.
- Experiment with different values or create several drag volume with different drag coefficient. This way you could simulate particles going from air to water.
Going Further: Wind
In the same way we added a drag force, we can add wind forces. To do so:
- Drag and drop the Wind object from the asset browser into your 3D workspace. You should now see a plane with a yellow arrow. Scale, place and orient your wind plane like you whish. The normal of the plane defines the orientation of the wind. Note that the wind will be applied for particles in front of the wind plane up to a certain distance defined by the length parameter in the wind geometry node. Don't forget to put the wind object into the Forces collection.
- Click on the wind in the scene outliner. Go in the modifier tab, you should see a geometry node modifier with a different properties. Set the length and the force as you want (For more details on the settings, refer to next sections). Let's set the Force to 0.001 and the Length to 100. Note that particle with higher mass will be less affected by wind.
- As always go back to the first frame and play.
- Experiment with different settings and with additional wind forces.
Going Further: Attractors
Attractors will attract or push away particles. Force is dependent on particle distance to the attractor and particle masses.
- Drag and drop the Attractor object from the asset browser into your 3D workspace. You should now see a sphere. Place your Attractor at the desired location. Don't forget to add the attractor object into the Forces collection.
- Click on the attractor in the scene outliner. Go in the modifier tab, you should see a geometry node modifier with a different properties. Set the force (carefully), min and max distances as you want (For more details on the settings, refer to next sections). Let's set the Force to 0.0001 and the Length to 100. If you set a negative force, the attractor will act as a pusher instead.
- As always go back to the first frame and play.
- Experiment with different settings and with additional attractor forces.
That's it! You explore all the currently available forces. Note that, nothing prevent you from animating the attractors!
Particle Spawner
The particle acts as a constant particle generator that generates new particles each frame based on an emitter (like the one defined previously, Distribute Points on Faces. To create an use a particle spawner, follow the following steps:
- Add the node Spawner.
- Connect the Points input of the spawner to the output of your point generator.
- Connect the outputs of the spawner to the simulation node spawner input (like Euler).
- Set the desired instances on the Instance input.
- Tweak the settings to randomize the scale and the rotation of the particles.
- You can control the flow of particles with the Flow setting. Note that to get different particle initial positions, you need to change the seed of the generator (for instance the Distribute Point on Faces) to a changing value. You can use the Frame node.
Accessing particle attributes in the shaders
You can access different named attributes in the shader editor.
- First you need to add a Set Material node and connect the output of the solver.
- Select the material to assign.
Your geometry node should look like this:
In the material itself you can access the different attributes by using the Attribute node. It is important to set the type as Instance.
Here is a list of the different attributes you have access to:
- Life: life of the particles
- Life Span: life duration of the particles
- Velocity: velocity of the particles
- Collision: true if a particle is in collision
API
Solvers
Euler
Computes the particle system motion. It uses Euler integration to compute velocities and positions from forces.
- Simulation: represents the referential/simulation object. Usually set to Self Object.
- Points: instances for which to solve the motion.
- Spawner: the spawner used to generates a flow of particles.
- Gravity: simulation gravity. -9.8 for earth gravity.
- Forces: collection of forces.
- Particles->Masses: masses of particles. Can be a unique value or a different value for each particles. In this case use a named attribute on the instances to represent the masses.
- Particles->Initial speed. Initial speed of the particles. Same remark as above.
- Particles->Life Span: life span of the particles. Same remark as above.
Dynamic RK2 Solver
Computes the particle system motion. It uses Runge-Kutta 2nd order integration to compute velocities and positions from forces. It is more stable than Euler. Use it only if Euler is not stable enough. Takes more CPU ressources.
Refer to Euler for the description of the inputs/outputs.
Euler with collision
Computes the particle system motion. It uses Euler integration to compute velocities and positions from forces. Also support collisions with geometries. Note that collision is a complex problem and in some cases, particles may go through geometries.
- Collisions: collection of collision geometries. Simply put your collision geometries in the a collection and assign this collection to this input.
- Refer to Euler for the description of the other inputs/outputs.
Forces
Weight
Weight is applied based on the masses of the particles and the defined gravity. There is no force object per se.
Drag
Drag represents the force applied on a moving object in the opposite direction of the movement. Think of drag due to the air or the water. The drag is only applied in the box of the drag object.
- Drag: drag coefficient. This is dimensionless and it is a mix of different drag factors. The current simulation does not take into account the projected area or the shape of the particles.
Wind
Wind represents the force applied by the wind on particles. It is defined by a direction and a box shaped volume.
- Force: force of the wind (dimensionless). It is not a physical measure of the wind but an overall force coefficient.
- Length: max distance from the wind plane the force is applied.
- Turbulence: define a random wind force on each particle. Can simulate floating dust particles for instance.
- Gust Probability: probability of a wind gust happening. A wind gust is a sudden, momentary, burst of wind. It is random in direction and duration.
- Gust Intensity: intensity of the gust.
Attractor
Attractors apply an attractive or repulsive force based on the distance of the particles from the center of the attractor.
- Attraction Force: intensity of the attraction if positive. Intensity of the repulsion if negative.
- Min Distance: minimum distance at which the force is applied on particles.
- Max Distance: maximum distance at which the force is applied on particles.
Animating attractors positions (with key frame) is a nice way to move particles around.
Spawner
A spawner is used to generate a flow of particles from a specified emitter. With a spawner you can easily simulate snow of rain for instance.
- Points: input points generated by an emitter (like Distribute Points on Faces).
- Seed: used for randomization.
- Flow: intensity of the flow of particles. Higher values generate more particles.
- Instance: the object to instantiate on each particle.
- Scale->Scale: scale of the instances.
- Scale->Uniform: if true scaling is uniform.
- Scale->Min Scale: minimum random scale.
- Scale->Max Scale: maximum random scale.
- Scale->Randomize: amount of scale randomization between 0 and 1.
- Rotation->Rotation: rotation of the instances.
- Rotation->Min Rotation: min random rotation angles.
- Rotation->Max Rotation: max random rotation angles.
- Rotation->Randomize: amount of rotation randomization between 0 and 1.
A pack of geometry nodes for particle system simulation