PBD particles on a skeletal mesh

Hi everyone,

I’m a complete beginner working with Niagara, and I’m trying to spawn mesh particles on a character that collide with each other. By combining information from various tutorials, I managed to achieve the effect, but I’m encountering some noticeable issues:

  1. Uneven Particle Distribution – Certain areas, like the hands, spawn an excessive number of particles, creating an unnatural concentration.
  2. Glitchy Movement of particles – During the character’s animation, some particles show a sudden, jumping-like motion.

I’ve attached images of my Niagara System and the character for reference.

Any insights on how to fix these issues would be greatly appreciated! Thanks in advance for your help. :blush:

Hi @M1z3me1,

Let’s see if I can help you figure this out:

For your uneven distribution problem, this is actually expected behavior. It is likely your hands, head, and feet have a higher tri density than the body. Since the module’s logic is grabbing a random triangle from the ones available, it makes sense it is more likely to grab triangles from the high-density areas.

There are a few potential workarounds here. The first (and not recommended) is to remesh your character (or a version of your character that is sampled) so your tris are more evenly distributed. You could also try changing the Whole Mesh LOD- perhaps in your case a higher LOD has more evenly distributed particles.

More likely though, you’ll have better luck directly-setting which triangles receive particles to guarantee even distribution.


This method directly associates the particle ID with the array index- guaranteeing that as long as the array length is equal to the number of particles spawned, every index will receive exactly one particle.

Another potential method would be to direct-set a range of triangles to sample

You could use this to avoid many triangles in the high-density areas by selectively excluding them from the range. Using a scratch pad, you could combine more than one range for a more precise selective exclusion. (Let me know if you need help setting that up)

As for the glitchy movement, this might be harder to narrow down because a few things could be causing this. I would try temporarily disabling collisions, and see if the issue persists when the particle location is direct-set with no outside influences. Also, you’ll probably want your particle system in Local Space- make sure that is set correctly.

The particle system should be updating the tri locations every frame, so your sampling rate shouldn’t be the issue.

I am curious what you’re using the Particle Previous Position for? I could see this causing issues depending on where it’s used.

Let me know if this helps!

Hi Sarah,

First off, thank you so much for your response! I switched the character and increased the LOD, which significantly improved the particle distribution.

Regarding the glitchy jumping movement I figured out it might stems from using the PBD particle system from the advance niagara examples (which also explains the “previous particle position” use), while tying it to a skeletal mesh.

For this project, my goal is to create an effect similar to the Popcorn Man from the Advanced Niagara Demo (shown in this video https://www.youtube.com/watch?v=31GXFW-MgQk), around 00:01:30 , though I don’t need the construction or destruction)—where particles are attracted to a skeletal mesh while still behaving as colliding GPU particles. Jonathan Lindquist mentions that the effect was achieved using PBD particles spawned inside baked distance fields for each part of the character’s body (00:40:00 on the video).

I understand the general approach but haven’t been able to find the specific example he used or a tutorial outlining the steps to achieve this effect. Would you be able to point me in the right direction? Any references or breakdowns would be incredibly helpful!

Thanks again for your help!

@M1z3me1 Ahh okay, that actually helped a lot. The great thing about these demos is that all of them are released as content examples. I opened up the content example project and was able to easily replicate your system, and I think I found the problem.

Using just the Position Based Dynamics, I’m seeing the same issue you are. It looks like the particles are having a hard time detecting collisions with each other.

But, if you go further into the content examples, you’ll see the setup that Epic used for the popcorn man- 3.8, Structural support. Here, if you replace the Shape Location with the skeletal mesh location and add one to the particle update as well, you’ll have particles that move perfectly with the character.

Looks like upping the number of collision iterations produces a better result with a complex mesh

The issue I’m seeing now, which is mind boggling, is that this is working perfectly in the preview window, but not in the level.

I would try this solution in your project, I’m hoping this is just a project setting causing this. If you’re seeing this issue on your side too, we can figure it out from there.

I would highly suggest you dive into these content examples- they’re great learning tools. You can download them from Fab- they’re called Content Examples- and you can open the Advanced Niagara level to see these exact systems and many more.

Hi Sarah,

This is perfect—thank you!

I worked on the first emitter in the Structural Support example, and it looks great. I was able to eliminate the bouncing/tremor of the particles by adjusting the Number of Neighbors in the Neighbor Grid parameters.

I just have one remaining question. I wanted to introduce a subtle force, like wind or noise, to create gentle movement while keeping the particles tied to the skeletal shape, making them distance a bit and then return. However, when I added the force and then the force solver, the system broke.

I then tried applying it to the third emitter instead, thinking maybe parenting was needed. But when I added the force next to the Gravity in Particle Update, it only affected the system once the particles were no longer bound to the skeleton—which makes sense.

Is there a way to apply a light force while still preserving intra-particle collisions and the skeletal form?

Thanks again for all your help!

Hi @sarahlenker,

Can I take you up for the offer of going through the set up of the scratch pad to select which triangles get particles attached?

Thanks again!

Hi there @M1z3me1 ! Sorry for the late reply- it’s been a very busy few weeks.

If you still need help with this, here’s the scratch pad setup I would recommend for setting your each of your particles to a random tri in range:

For the tri array- you can’t dynamically create indexes and their values, but you can change them. So, with this example, I’m setting the minimum triangle at each index, then to add a random range I’m setting the max value to the min + 50. If you want to be very direct, you can even use a second array with each index’s range amount to input the max (tri array index as min, tri array index + max amount index)

If you just want to directly attach the particles to a specific tri though, you can axe the scratch pad and just use the array.

And make sure persistent IDs is checked! This is how we can get the association with the array, since particle 0 will have ID 0, particle 1 will have ID 1, etc…