Hi Sjeiti, I wrote this, thanks for the comments.
Agreed it needs some optimization. The reason the attractor gets recalculated when rotating, is that there is actually no geometry at all..
This is different from the approach used in e.g. https://syntopia.github.io/StrangeAttractors/, where the Runge-Kutta integration is done is JS and converted to geo. The advantage of that approach is that the rotation is smooth (and there is no shader recompilation), but the number of lines/tubes is limited by the time for JS to do the RK integration.
In my approach, the image is generated fresh from each viewpoint as follows:
- initialize a floating point texture A with the start points
- in a shader, update all points in parallel to their next position, via R-K, writing to texture B
- draw all of the GL line segments via a vertex shader which reads the line endpoints from the textures A and B (with lighting done in the line fragment shader)
- composite the result into the framebuffer
- repeat for the number of integration timesteps, ping-ponging A/B
- iterate over frames, with the start points jittered, blending each frame equally
This renders the thick tubes over time.
This way the integration happens entirely in shaders, with JS never seeing any geometry. So a really huge effective amount of geometry can be rendered (billions of lines?). The disadvantage is that the integration is re-done for every viewpoint, and also the GLSL shader is recompiled whenever the vector field changes. I was optimizing here for detail of the visualization more than for smoothness of the interaction -- but I would like to improve the interactivity for sure.
(There's no web workers involved -- except during GIF rendering, with uses the very nice lib https://jnordberg.github.io/gif.js/).
>It could use better controls for changing the attractor constants. Changing those constants can really give you a good feeling of what chaos and strange attractors really are.
>Some of the controls also feel a bit hard to handle, you might want to look into doing custom controls or looking at UX a bit more.
I'm keen to know where I can improve the controls. For the number/color scrubbing in the code editor I just use http://enjalot.github.io/Inlet/ pretty much out-of-the-box. It does seems a little clunky, though generally I really like the notion of the UI being integrated with the code like this.