Water Boiler
Story and info
It was around 23rd June 2002... I suddenly remembered -
Flipcode's June coding contest! It was
about one week left. "Liquid effects". Aiste suggested "A Semolina Simulator"
- that clearly required a fluid/semolina solver. In my pile of papers I quickly
found "Deep Water Animation and Rendering" - that was not very suitable. But
in the references was mentioned "Stable Fluids" by Jos Stam - that was it!
So, I quickly typed in the basic "framework", then the fluid solver (used
FFT for solving - that's absolutely incorrect because of pot boundaries, but
who cares?). As semolina turned out to be too hard, I decided to make
just the water boiler (with lots o' bubbles and rippling surface). So I modeled
the pot, drew the textures, made lots of tuning, added the bubbles... And here
it is: (tadadam!) The Water Boiler.
Requirements for running: Windows OS; DirectX 8.1; (relatively) fast CPU
(700MHz or so); known to work on GPUs: TNT2 M64, TNT2 Vanta, GeForce2MX200,
GeForce2Ti (so something along lines of those).
Download
Binary release (executable, data files)
here (401 KB). (Excuse me for programmer's art)
Source release (only sources, MSVC 6.0 project and workspace)
here (527 KB). Warning: by no means it should be
taken as an example of good design, coding style or efficiency. These things
can't be found here :)
Things I found
- Jos Stam's paper rocks!
- For the first time I have faced the "instability" of the calculations.
That occured before I implemented Stam's solver - I quickly coded a naive
solver. Fluid velocities sometimes went crazy (or even to infinity).
While instable calculations are acceptable in many cases, they are not
suitable in the others...
- (again) Direct3D 8 rocks! Especially when you're writing small
demos/techdemos - just take "common" classes from D3D examples and type
in your stuff. And with D3DX it's really "the best rendering engine
ever" :)
- Semolina is a very funny word. I didn't know it before I looked up
in a dictionary. Moreover, the thing semolina is made of is called
farina! English language is so funny sometimes :)
Things that are missing
- Correct heating. Now the heating only heats one circle of bottom water
elements. It should heat whole pot bottom almost uniformly, and also heat
pot sides.
- Solver with correct boundaries. Currently the velocities that go out of
the pot appear on it's other side (that's because of FFT). Conjugate
Gradient or similar solver should be used, with correct (cylinder)
boundaries. That would be also slightly incorrect because the water surface
is (in reality) not flat, but that's fairly negligible.
- The bubbles movement/spawning was implemented "out of the top of my head",
it's not even close to the correct movement.
- Water refraction. I planned to do this (sort of: render "from-above"
view into texture; then draw water surface as non-transparent grid,
using that texture). But there were no time left, and this already exists
in DX examples, right?
- Water caustics (same as above, especially the "this already exists" part).
Boiler in action
These show the initial pot, nearly-boiling pot, and wireframe/velocities/temperatures
view. Everything is on Duron700 / nVidia TNT2 M64, so don't pay big attention
to the FPS number :) But the real fun of watching the bubbles can't be
expressed in the shots...