Best particle system

Hi,

I would like your thoughts on the different particle systems out there. I have found two SPE from Squarefeet (original from Stemkoski) and Proton.

Both look like they are no longer maintained, and I was wondering if you use either one of these two with a recent THREEjs version.

If you have experience with both of them: which one doe you like best, which one gives the most flexibility?

And do you know other particle systems for ThreeJS?

I use SPE. I have a PR for fixing fog for three 104.

Best one I’ve found by far. It’s too bad squarefeet never pursued getting SPE added to the three examples before he moved on. Some other guy made a far less advanced version and got it merged. Not sure what the criteria was. Oh well, I plan to personally maintain my own SPE build, in order to keep it alive for as long as I can.

1 Like

Would be nice to merge it into ThreeJS, but I understand ThreeJS has it’s own particle engine?

Could not find it in the docs…

Does anyone have any samples of the Particle engine working in a scene with other objects?

I used to use SPE, and squarefeet and I had a go at a complete rewrite with a lot more features. The scope turned out too high and we were quite busy at the time, so the project just kind of got abandoned. Fast forward to about 6 months ago and I sat down to write a good-enough particle engine for my game, since SPE was not cutting it at the time for me, as I had more requirement by that point than what SPE was intended for.

After about a week of prototyping I had the core for my new engine, that I call “particular” and after almost 3 month of refactoring and debugging I had it pretty much finished.

My particle engine does something a bit different from SPE. Where SPE is intended for rendering huge number of particles and having good flexibility over number of emitter and memory usage, my engine largely ignores particle limits, I didn’t need millions, so it was intended to be super flexible and provide very good frame rates with large number of small emitters - that’s really a more typical usecase for games.

The reason I write this is that after having worked with particle engines for a while now - I feel that my priorities of what’s important in an engine have changed a lot. I believe the following are not very important in a particle engine:

  • huge number of particles
  • complex simulation model
  • simulation stability and reproduceability

Instead, I believe the following are more important:

  • support for large number of emitters (you want to be able to add particles to whatever you see and not have to worry if your FPS will tank just because you added an emitter with 5 particles somewhere)
  • offer a lot of flexibility in parameterization of particles, both statically and over time
  • support a good render model, preferably with soft particles, lighting and shadows are a bonus.
4 Likes

Super cool. Is this something that you plan on getting merged into threejs?

Haha, no way, there is simply too much there. I think something way simpler might have a place in three.js. Here’s a glipse at just the Particle System classes themselves, excluding most of the spatial reasoning, math and serialization:


I don’t think people would be interested in merging it.

1 Like

Oh wow, yea perhaps a bit heavy =]

Well at least I would be interested in merging it into my own project.

I found three-nebula to be the best. It’s based on Proton and has a lot of configuration options. The importing from JSON was also a huge benefit to my projects.
Downside is that the performance for it isn’t the best, sadly.

1 Like

That does look impressive too… performance to me is not vital if it is not too dramatic.

@davidpox nebula looks good, I can’t say the same for performance. Most of the examples run below stable 60 FPS on my i9. The timing for my entire game including all the systems is is below 4ms. Probably with more work performance can be improved. Still, looks really good.

Which ones are smallest, yet still maintain z-depth correctly?

At this moment I am experimenting with SPE - z-depth problems can be solved by setting renderOrder higher than the rest of you object, so the particles are rendered last.