Fluid Simulation, ah where to even begin
I'm busy working on a game and wanted to add some nice subtle touches. To have particles in the air or embers emitted from destroyed 'items' and have them not just dart about the screen as is per usual with particles. But to interact with each other, with objects in the scene that are moving in and with the users touch input on the screen, thus bringing them to life a bit. Air is basically a fluid so essentially it is a fluid dynamics problem. One I had the naivety to think I could solve simply
How hard can it be to just have particles move about and push each other around.
Surely someone has already done this and I can just use that.
Now first off there are various kinds of approach to fluids sims, all with trade offs. Some good at 2D bad at 3D, some good at gases and turbulent spirals but bad at contiguous bodies of water e.g. with surface tension. The approach for modeling say a bucket filling up with water versus a room full of hot smoke are very different.
For Unity I have found a couple of libraries
FluidSim by Philip Heckinger ( Pheck )
What appears to be a good, well implemented version, best I have found for Unity for 2D fluids
A 2D CPU or GPU accelerated implementation using 'Eulerian' method of dividing a space into cells with velocity/pressure vectors
I inquired with the creator and he had added 'vorticity confinement' but for his uses decided to remove it for performance it added little
And has not added 'viscous diffusion'
--
Very similar to the implementation here by 'Scrawk' done in Unity3D
However this implementation is incomplete and I am too stupid to work out how to augment it ;-D
it is incomplete as it is itself based upon an implementation by Philip Rideout who'm decided to leave out Viscous Diffusion and Vorticity Confinement as he did not require them ( though fluidsim above also omits these things )
The Little Grasshopper - Simple Fluid Simulation ( written in C )
Which is itself based upon the work here in GPU Gems 1 by Mark J. Harris:
And some have found inspiration from the work of Jonathon M. Cohen of NVIDIA Research here:
And in this research here by Jos Stam for Alias
Real-Time Fluid Dynamics for Games
A couple of people I found used Jos Stams work
This here which seems broken by VIC20
And work by NoiseCrime ( whom wants to keep the efforts to himself "part of a bigger project and as such i'm unable to release the code at present" )
Another article by Mick West
Practical Fluid Mechanics
And then theres the very impressive work of Grant Kot:
Who has produced a realtime sim combined various methods and the only one I have seen that tackles surface tensions and manages to merge a good gas/swirly swim with solid water like properties too. Check GFlow HD for iPad ( free ) though I didn't fancy attempting to port this to C# and all the performance implication that might have.
And then there is Fluvio for Unity3D by Thinksquirrel Software
Which is a 3D particle based approach using what he claims is SPH ( Smoothed Particle Hydrodynamics ) but I have failed to see any evidence of a fluid sim at work here. It just looks awful. I'm possibly wrong and it is amazing but the demos and videos show it doing a poor job at pretty much everything. Understandably doing 3D fluids in Unity is going to be tricky and theres nothing else on the store that does what Fluvio does... but I'm left unimpressed by the demos and how coarse they are, they barely exhibit any of the behavior I would define a fluid by. More like a series of balls attached together with weak springs... and It's not exactly 'cheap' either. Maybe I am missing something! as the free demo only lets you use 100 particles kinda making it impossible to test It's metal.
And quite annoyingly the guys at Unity seem to have solved exactly what I need with a SPH Fluid solution for Shuriken particles here:
Look for video here 'Fluid Solver'
( what an awful website Unity! )
---
Ok I purchased the Unity Fluidsim and have started trying to make sense of it and bend it to my will!:
Got it running fairly well on the phone thankfully, I only need it low res ( unlike the high res in the video ) and it is working fine with all the post effects and a ton of particles, which is surprising for a phone! ( iPhone 5 )
Main problem now is getting it to interact with touch input, how to get it to push the fluid around. It has build in collision detection of sorts but it is totally rubbish so I will likely have to do it all myself... that is once I figure out how this is all setup internally *starts prodding and poking the code looking very confused
With no description and no code and no sign of any further work on it, just a video showing how cool it is ;-P *raises fist to the sky*
This is way more involving than I had hoped for, I just wanted to be able to touch the fluid and swish it about... simple I thought. I just spent most of the day writing multi touch code to detect angle and velocity to even get started on the problem. The way this 'Fluidsim' works is a bit nuts in terms of updating various properties per frame, it just polls at regular intervals even if nothing has changed, fair enough, but I want it to be a bit more performant than that and update only when something has changed and only draw the thing that has changed not loop thru all objects process each one. Nightmare.
Next problem how to make a tap push fluid around it in every direction. Seems so simple but yet again, nope hard as a pixel/point can only have one direction at a time naturally. So to have it move in all you need a circular shape with each pixels direction set to say from the center of the circle, not too complicated that is if you are used to writing shader code. Dealing with colors and directions as numbers/vectors hurts my brain immeasurably. Well figured that out and it was ridiculously simple in the end once my brain wrapped around it and of course first solved it in an over clever complicated and highly convoluted manner.
Here is a video of multi touch input running on my desktop computer:
And now after many days banging my head against the proverbial wall, here are particles suspended in fluid *drum roll*
now just to make it look nice, like dust glinting in sunbeams, and yes it is lagging and a bit jittery but I'm working on that
Never in my life have I struggled so much, long days with nothing to show for them, mindless trying different combination of things. But I prevail victorious, my stoicism knows no bounds.
Turns out the difficulty I was having was two fold, one a bug in Unity itself which was fixed 2 days before I started working on this!!!! but I had neglected to update. And secondly a continuing bug that prevents ReadPixels to work when Anti Aliasing is enabled on iOS. Then it was only am after of mere... 10's of hours to get it working properly ;-P
Now I need to work on the performance, using object pools and trying to augment the existing particle system instead of lots of floating quads each with expensive transforms and a heavy 3D physics engine attached to each particle.
I'm curious as to if an image based approach also running on the GPU would have been easier and likely more performant... tempting.. even if it does largely negate the work I have done
Projects like TC Particles using DirectX 11 looks amazing :
Though $100 and more importantly limited to Windows machines not good, $350 for the source code
It says it has a fallback to Unity built in Shuriken particles with no DX11, though who knows what benefits and drawbacks this brings.
Watch this video and be amazed ( presuming you are in the year range 2013-2016 otherwise you will be moderately amused at how basic it is )
--
Just got it working with Unity built in Particle System ( Shuriken ) which has sped it up immensely as expected so now handles many thousands more particles with ease. And used the Unity Profiler to track down and remove a bunch of GC crippling code that was stuffing the garbage collecting with megabytes a second of 'new' operations, so easy to slip up and do that
Ah balls... I just very cleverly made some 'optimized' code then realized due to a limitation out of my hands ( Shuriken ) it intact makes it slower, then I make some more very clever code for combining touch movements and running them at a custom regular interval instead of instantly / irregularly and often too often.... and then I realize the premise of the whole optimization was based on an incorrect assumption and have in fact worked really hard at undoing someone else's very clever optimisations because I assumed it was being stupid. FAIL
In any case despite most of my efforts being counter productive, the fluid sim is running even faster now
And after finding several ways of making it slower, I now know ( hopefully ) how to make it even fasterer! except now I'm shattered and being attacked by wasps ( they enter the window after a certain time en masse to harass and make me goto bed )
I'm busy working on a game and wanted to add some nice subtle touches. To have particles in the air or embers emitted from destroyed 'items' and have them not just dart about the screen as is per usual with particles. But to interact with each other, with objects in the scene that are moving in and with the users touch input on the screen, thus bringing them to life a bit. Air is basically a fluid so essentially it is a fluid dynamics problem. One I had the naivety to think I could solve simply
:-)
How hard can it be to just have particles move about and push each other around.
Surely someone has already done this and I can just use that.
Now first off there are various kinds of approach to fluids sims, all with trade offs. Some good at 2D bad at 3D, some good at gases and turbulent spirals but bad at contiguous bodies of water e.g. with surface tension. The approach for modeling say a bucket filling up with water versus a room full of hot smoke are very different.
For Unity I have found a couple of libraries
FluidSim by Philip Heckinger ( Pheck )
What appears to be a good, well implemented version, best I have found for Unity for 2D fluids
A 2D CPU or GPU accelerated implementation using 'Eulerian' method of dividing a space into cells with velocity/pressure vectors
I inquired with the creator and he had added 'vorticity confinement' but for his uses decided to remove it for performance it added little
And has not added 'viscous diffusion'
--
Very similar to the implementation here by 'Scrawk' done in Unity3D
However this implementation is incomplete and I am too stupid to work out how to augment it ;-D
it is incomplete as it is itself based upon an implementation by Philip Rideout who'm decided to leave out Viscous Diffusion and Vorticity Confinement as he did not require them ( though fluidsim above also omits these things )
The Little Grasshopper - Simple Fluid Simulation ( written in C )
Which is itself based upon the work here in GPU Gems 1 by Mark J. Harris:
And some have found inspiration from the work of Jonathon M. Cohen of NVIDIA Research here:
And in this research here by Jos Stam for Alias
Real-Time Fluid Dynamics for Games
A couple of people I found used Jos Stams work
This here which seems broken by VIC20
And work by NoiseCrime ( whom wants to keep the efforts to himself "part of a bigger project and as such i'm unable to release the code at present" )
Another article by Mick West
Practical Fluid Mechanics
And then theres the very impressive work of Grant Kot:
Who has produced a realtime sim combined various methods and the only one I have seen that tackles surface tensions and manages to merge a good gas/swirly swim with solid water like properties too. Check GFlow HD for iPad ( free ) though I didn't fancy attempting to port this to C# and all the performance implication that might have.
And then there is Fluvio for Unity3D by Thinksquirrel Software
Which is a 3D particle based approach using what he claims is SPH ( Smoothed Particle Hydrodynamics ) but I have failed to see any evidence of a fluid sim at work here. It just looks awful. I'm possibly wrong and it is amazing but the demos and videos show it doing a poor job at pretty much everything. Understandably doing 3D fluids in Unity is going to be tricky and theres nothing else on the store that does what Fluvio does... but I'm left unimpressed by the demos and how coarse they are, they barely exhibit any of the behavior I would define a fluid by. More like a series of balls attached together with weak springs... and It's not exactly 'cheap' either. Maybe I am missing something! as the free demo only lets you use 100 particles kinda making it impossible to test It's metal.
And quite annoyingly the guys at Unity seem to have solved exactly what I need with a SPH Fluid solution for Shuriken particles here:
Look for video here 'Fluid Solver'
( what an awful website Unity! )
---
Ok I purchased the Unity Fluidsim and have started trying to make sense of it and bend it to my will!:
Got it running fairly well on the phone thankfully, I only need it low res ( unlike the high res in the video ) and it is working fine with all the post effects and a ton of particles, which is surprising for a phone! ( iPhone 5 )
Main problem now is getting it to interact with touch input, how to get it to push the fluid around. It has build in collision detection of sorts but it is totally rubbish so I will likely have to do it all myself... that is once I figure out how this is all setup internally *starts prodding and poking the code looking very confused
With no description and no code and no sign of any further work on it, just a video showing how cool it is ;-P *raises fist to the sky*
This is way more involving than I had hoped for, I just wanted to be able to touch the fluid and swish it about... simple I thought. I just spent most of the day writing multi touch code to detect angle and velocity to even get started on the problem. The way this 'Fluidsim' works is a bit nuts in terms of updating various properties per frame, it just polls at regular intervals even if nothing has changed, fair enough, but I want it to be a bit more performant than that and update only when something has changed and only draw the thing that has changed not loop thru all objects process each one. Nightmare.
Next problem how to make a tap push fluid around it in every direction. Seems so simple but yet again, nope hard as a pixel/point can only have one direction at a time naturally. So to have it move in all you need a circular shape with each pixels direction set to say from the center of the circle, not too complicated that is if you are used to writing shader code. Dealing with colors and directions as numbers/vectors hurts my brain immeasurably. Well figured that out and it was ridiculously simple in the end once my brain wrapped around it and of course first solved it in an over clever complicated and highly convoluted manner.
Here is a video of multi touch input running on my desktop computer:
And now after many days banging my head against the proverbial wall, here are particles suspended in fluid *drum roll*
now just to make it look nice, like dust glinting in sunbeams, and yes it is lagging and a bit jittery but I'm working on that
Never in my life have I struggled so much, long days with nothing to show for them, mindless trying different combination of things. But I prevail victorious, my stoicism knows no bounds.
Turns out the difficulty I was having was two fold, one a bug in Unity itself which was fixed 2 days before I started working on this!!!! but I had neglected to update. And secondly a continuing bug that prevents ReadPixels to work when Anti Aliasing is enabled on iOS. Then it was only am after of mere... 10's of hours to get it working properly ;-P
Now I need to work on the performance, using object pools and trying to augment the existing particle system instead of lots of floating quads each with expensive transforms and a heavy 3D physics engine attached to each particle.
I'm curious as to if an image based approach also running on the GPU would have been easier and likely more performant... tempting.. even if it does largely negate the work I have done
Projects like TC Particles using DirectX 11 looks amazing :
Though $100 and more importantly limited to Windows machines not good, $350 for the source code
It says it has a fallback to Unity built in Shuriken particles with no DX11, though who knows what benefits and drawbacks this brings.
Watch this video and be amazed ( presuming you are in the year range 2013-2016 otherwise you will be moderately amused at how basic it is )
--
Just got it working with Unity built in Particle System ( Shuriken ) which has sped it up immensely as expected so now handles many thousands more particles with ease. And used the Unity Profiler to track down and remove a bunch of GC crippling code that was stuffing the garbage collecting with megabytes a second of 'new' operations, so easy to slip up and do that
:-)
I love you built in Profiler!Ah balls... I just very cleverly made some 'optimized' code then realized due to a limitation out of my hands ( Shuriken ) it intact makes it slower, then I make some more very clever code for combining touch movements and running them at a custom regular interval instead of instantly / irregularly and often too often.... and then I realize the premise of the whole optimization was based on an incorrect assumption and have in fact worked really hard at undoing someone else's very clever optimisations because I assumed it was being stupid. FAIL
In any case despite most of my efforts being counter productive, the fluid sim is running even faster now
:-P
And after finding several ways of making it slower, I now know ( hopefully ) how to make it even fasterer! except now I'm shattered and being attacked by wasps ( they enter the window after a certain time en masse to harass and make me goto bed )
Note to self, don't sun self in garden then fall up some steps with phone in hand:
On the Plus side new 30"
:-D
woo go team me!;-)
On the down side I have the wrong display connector lead so I get to enjoy all of 50% of my new monitor
:-D
My 'Command Center' while I was waiting for the 30" to arrive, Thought I'd try Portrait and enjoyed it a lot for coding... what a huge nerd I have become
Though I still got nothing on this guy:
And he's got nothing on this guy:
And here is a horse enjoying a helicopter ride in McGuyver:
Possibly the greatest thing I have ever witnessed on tv is McGuyver escaping on horse back and being air lifted mid stride
And while I'm in a random mood been watching StarTrek TNG from scratch as they re-released in HD:
And turns out my style choices or lack thereof have led me to become a perfect imitation of Inspector gadget
:-/
One has to be able to take the piss out of ones self *sips tea*
Great sadness, I dropped my bake well *sobs*
My Kitty likes the smell of Brioche it would seem, silly Sasha:
Also some truths
And screw the person who invented Menu Bar Icons and didn't set up a governing body to regulate it:
And why.. why so many tabs, what is wrong with me:
And lastly I made this graph of relative time scales, each pixels was something like 1000 years If I remember right. So for example you can see Fish and Plants in total have been around 4x longer than dinosaurs, and that the entire transformation it took from Lemurs to Modern Human beings was similar to the amount of time Dinosaurs evolved and were alive for entirely. And that for a huge chunk of time we just had single cell life, but that single cell life sprang up relatively quickly and it took AGES to get to multi cell, but once it had... everything got started then
:-)
Your entire life and that of everyone you have ever known is also on that graph, It's an invisible smudge too small for the naked eye to see though, like a mustard burp, momentarily tangy and then forgotten in the air
Every little thing in making a game is a hurdle, or at least a dozen google searches then a hurdle
Today wrote my own InputManager for multi touch, made it way smarter than I should have, it will look for a special component on the object you touch ( which it find by doing ray cast from the camera ) if none was found it can look at the object parent, and parents parent etc till it finds one, it can also contact ALL parents if they have a listener on them, simple really. I can also have it auto add a component to the touched object that caches all this so it is fast without having to perform lookups every time.. like a boss
So code to have good component orientated design to handle touching the iPad screen:
But that's a bit misleading as that contains code to auto add components and handle duplicate objects, singletons and such
But you get the idea, every little tiny thing, involves 100 other tiny things and so on
Lets not even think about how the ray cast to find the touched object itself is leaning on 1000's of lines of physic engine code and scene caches to aid in speed
Speaking of ridiculous code, I have been slowly write examples for various c# concepts and functionality...
All of this, and none of it actually visibly does a damn thing. In fact at his point all I have done in Unity is make a box move, but I decided to learn the language first so learn it I shall *grumble*
Today wrote my own InputManager for multi touch, made it way smarter than I should have, it will look for a special component on the object you touch ( which it find by doing ray cast from the camera ) if none was found it can look at the object parent, and parents parent etc till it finds one, it can also contact ALL parents if they have a listener on them, simple really. I can also have it auto add a component to the touched object that caches all this so it is fast without having to perform lookups every time.. like a boss
So code to have good component orientated design to handle touching the iPad screen:
But that's a bit misleading as that contains code to auto add components and handle duplicate objects, singletons and such
:-)
But you get the idea, every little tiny thing, involves 100 other tiny things and so on
Lets not even think about how the ray cast to find the touched object itself is leaning on 1000's of lines of physic engine code and scene caches to aid in speed
Speaking of ridiculous code, I have been slowly write examples for various c# concepts and functionality...
All of this, and none of it actually visibly does a damn thing. In fact at his point all I have done in Unity is make a box move, but I decided to learn the language first so learn it I shall *grumble*
Unity3D is amazing, great, wonderful etc etc
And then you get all excited about having spent all year reading and learning C# in depth like a boss. Having read the entire Unity manual, 100's of articles.... 1000's of articles....
And then... aaaand then... you can't even figure out how to draw a simple rounded rectangle on the screen to make a button. Basic things you take for granted in Flash completely missing in Unity. As Unity really is more of an operating system for making things. And so off you must head to the asset store and goole to find someone else's code to solve this. And then you find dozens of approaches, some long ago abandoned and longer updated, and the best ones no longer developed as Unity snatched the debs up and employed them! How is drawing a simple shape so complicated!
In any case, I decided to create a rounded rectangle in vector style using no bitmap data, found Vectrosity was super good at turn lines into polygons that then draw on the screen to look like well... lines. Nicked some kind to draw circles, put them together in a class and tadda the rounded rectangle drawing class was born:
And yah it has a glitch in it, but otherwise good job team me only took me several days of googling and trying to find a compromise
Ok now to just draw it the size I want and make it fit the width of the screen on ipad/ios etc etc...
Seriously... ok this too is hard apparently!
Which sprite / UI manager do I use, NGUI, SpriteManager, EZGUI..... on and on, oh Unity is bring out a new GUI system... they said a year ago... ok can't wait for that
Screw it, made my own Transform like class with relative scaling, positioning and all that fancy jazz. Took longer than I thought... many days arguably wasted
:-)
Now I need to draw my Logo, but at a different location and scale depending on the screen size, screen dpi.. orientation... oh god, what can of worms is this....
So I write that by having multiple copies of my special Transform and a script that picks which one of those to use based on criteria....
And there you have it, several weeks to get my logo and a rounded rectangle drawn to the screen exactly where I want it
This while making a game thing... could end up taking quite some time I think :-S
In the process made some weird looking stuff!
First attempt at rounded rectangle created some weird bacon like creations:
Rectangles ahoy:
Playtime with procedurally rounded rectangles!, Oh the fun I have:
Tinkered with making 3D looking text:
There are a total of 0 books on advanced Unity 3D with C#
I mean... seriously, what are you doing learning Unity if you need this bit explaining this verbosely:
That explanation did not need to take up that much space
:-D
Speaking of learning to code, it is funny to think how far I have come, even if it feels like I am not moving sometimes
Not long ago something like this would have made me quite emotional:
And now it just makes me screw my face up a bit
( it was complaining because I was using a nullable values represented by question marks. Your chance of figuring that out if you just started C# about the same as == null ?? -1