JavaScript particle simulator
cake23.de
cake23.de
Three.js also has some pretty nice to follow particles samples:
http://threejs.org/examples/#webgl_particles_random
To the author: great work. It looked very much alive on my screen when I first loaded the page.
EDIT: I assume the "native-code" part is something like webgl?
Graphics hardware is incredibly fast and programmable (via shaders), and now that WebGL is part of the standard, Javascript programs can actually use the hardware's capabilities. What we see in a lot of this demos is not the javascript interpreter being fast. Although chrome's V8 actually is fast (compared to other js implementations at least), most of the work is being done by the video card.
For example, I was surprised to find out recently that Firefox 25 is smoother and faster nowadays than Chrome on Mac Os X when running my interactive geometry genereator that is based on javascript/canvas (http://GeoKone.NET).
Also, a way to reset the simulation without reloading the page would be nice.
There's even better methods that take O(n) time, like the fast multipole expansion ones.
Of course, you'd still need to fall back to N^2 for the nearest particles, or the accuracy would be unusably bad. But it's a much smaller N.
Using Version 31.0.1650.57 m Google Chrome is up to date
It complains about the lack of an OpenGL extension, but it looks fine.
1) implementation there's quite some boilerplate in JS to set up all the textures and the main animation loop, but if you look closely the CPU is mostly idle and the "heavy lifting" is all done on the GPU by several shader programs. There are no libraries used and you can take a copy of the html file and simply start by breaking things apart. For the massive speed I'm updating the particle data with a clever fragment shader trick that i've learned from https://twitter.com/BlurSpline/status/161806273602519040 And in a DIY fashion, I've mashed this up with my own texture feedback loop. The main idea is that the particle positions (and the velocity vectors too, each 2D only) are stored in a texture's rgba values (float32). So updating the particles data is in fact a render process of a quad in one draw call. Then I had also rendered the particles to another texture to sum up the "density" of the primitive 1 pixel point projections.
2) complexity when it comes to the mere particle count, the complexity really is O(n), but there's a wee bit more to it. The projection of the particles to the framebufferobject or the screen is the most costly in this setup and it's fillrate-limited by the graphics card. There's a noticeable difference when the particles are evenly distributed or when they overlap, but it must stay in the O(n) realm i suppose. Then there's another texture feedback loop system that is also directly dependent on the pixel count. The particles are stored in a 1024x512 pixels wide texture and the hidden texture feedback layer is also of that size, but it could differ too. There is absolutely no direct interaction between any two particles here. I project the particles to a density texture that is then diffused with an optimized two-pass Gaussian blur calculation and several resolution reduction steps. All the textures from the different steps are available as in put sampler to the shader programs, in particular "fs-advance" for the Turing patterns and the density projection (hey there, the blue channel is unused ^^) and "fs-move-particles" where i simply grab the gradient from the diffused density to update the particle's velocity vector and do the verlet integration.
The concepts used here also have names - just ask google or wikipedia for "dissipative systems/structures" and "stigmergy".
3) the fluid simulation code is not by me! Evgeny Demidov is the original author of the WebGL shaders for that: http://www.ibiblio.org/e-notes/webgl/gpu/fluid.htm I'm only adding to the current advection matrix
4) code size this could possibly fit into a 4k demo but i have no interest in that kind of challenge. i rather like to share something that is easily readable by others.
cheers!
How many single particles are visible at every moment? Would it be possible to control the movement of the particles by the fluid field to form predefined shapes? to make them cluster into predefined (even moving) areas?
For some time now, i wonder if it would be possible to visualize some population statistics (think the percentile wealth distribution f.e. ;) by using some thing like this and make every single person "visible" within the statistic.
I believe it would make many "distributions" more intuitively understandable. Imagine some several thousand single "very wealthy" entities contrasted by several thousands or millions of "average" entities ;)
Obviously such interactive diagrams easily hit (hardware/software) limits, but even if displayed with some mapping like 1 point equals several (hundreds/thousands) real world entities, i think such display of magnitude in the real world would be very engaging.
Thanks again.
It's pretty slow on my computer. Would ASM.js work better?
It uses OpenGL ES it seems, doesn't work in IE 11.
Edit: It would be interesting to know if this would perform better using WebGL and running it in IE 11, anyone has any thoughts on that?
&
22 FPS on Firefox..
It's gorgeous... reminds me of the good old "visualization" days of Winamp and MusicMatch
Anyway, I don't think this demo is exhibiting inter-particle attraction, but I'm not positive.
Disclaimer: I haven't actually analyzed the source.
I've had a look here: http://creativejs.com/2013/11/coupled-turing-pattern-and-219...
but there's no details on the specifics
It'd be nice if the color gradually changed.
I really can not wait until there is some new community to which these unemotional sociopaths can wander.
I applaud you good sir or madam for your wit.