My favorite 2D liquid simulator is this IOCCC2012 submission [1]... simply astonishing.
That is the source file shown at the beginning of the video... it compiles without warnings, runs a full blown fluid dynamics sim with surface tension and everything, can take itself as its own input... truly a work of art.
I think it’s way off. It looks surface waves propagate without dispersion — tap it and watch the caustics. Real water haves have the packet of waves and the individual peaks and valleys moving at dramatically different speeds.
I was going to reply this is at least 10 years old and it was already butter smooth the first time I interacted with it (with even older hardware, from when webgl was still a novelty and not widely supported across browsers)
Shamelessly sharing some research I worked on a few years ago- Using ML to learn cellular automata which simulate a given system (uses neural cellular automata).
This is neat. Can you explain neural cellular automata? I’m familiar with neural networks and cellular automata. I’ve been interested in DNNs to analyze CAs but is this the other way around?
This seems to be a version of a lattice gas fluid model. (Or, more precisely, lattice-boltzmann, since it allows for fractional values of fluid occupancy per cell.)
I had a Santa Fe institute monograph on this back in the day, and I seem to recall that they ended up using a hexagonal grid, in order to achieve the required isotropy of fluid behaviour. Might be something to consider.
Everyone in this thread is much smarter than me. If you are an idiot like me:
make a 3x3 block, delete the middle, hold down the "spawn water" button for as long as you like while the mouse is on the empty block then remove the top block to create an explosion of water.
Seeing this wonderful simulation makes me wonder if a physics simulation using cellular automata could benefit from a HashLife-esque algo to speed up calculations.
For GoL, the speedups are just insane. The linked wiki shows a simulation:
The 6,366,548,773,467,669,985,195,496,000 (6 octillionth) generation of a Turing machine in Life computed in less than 30 seconds on an Intel Core Duo 2GHz CPU using Hashlife
But then of course, Game of Life has loads of 'boring' repeating stuff and is much more discrete compared to physical fluid dynamics simulation.
I'm not an expert on this topic but: GoL cells have only a very limited number of states whereas realistic simulations have a big numbers of possible states for each cells so I doubt it's possible.
It's a turing machine -- it potentially never halts / repeats. Hashlife isn't just about exponential time-stepping, though that's a major part of it -- it's also about isolating periodic portions of the grid for memoization and speed-up, without requiring that the entire grid be periodic. All said, it really is a specific insanely high generation here.
It's deterministic, though, so once it detects a repeated global state it will cycle endlessly so you're not calculating generation N, you're calculating generation firstOccurrence+N*cycleLength for all N. At least, this line from the wiki reads to me like this is what's happening:
> Computed by detecting a repeating cycle in the pattern, and skipping ahead to any requested generation.
Noita is a computer game that takes this concept and runs with it. Every pixel of the world is simulated and destructible. Flammable materials will start on fire and be consumed. Your primary weapon are magic wands and hundreds of spells and you use the spells to make little programs that run every time the wand is fired.
This is great, thanks for sharing. I'm planning on using this, or something similar, in a game I'm developing. It'll be waves of fog, but act like a fluid, and will encroach on simulated ants :)
I'm curious why the simulator never reaches a complete, steady state? It seems to settle mostly and then a few squares flicker rapidly. Is this just floating point math doing its thing, or ?
Also check out wavelet-based water wave simulation for a very close approach to the real thing, by a pioneer in the field of physics simulation in Computer Graphics, Matthias Muller-Fischer:
i read the article and had exactly the same thought!
especially the part where the falling cells are being rendered as full cells made me go "waaait a minute, this would look slightly weird in exactly the same way that ONI water does when it falls". Does anyone maybe with ONI modding experience insights on wether that's really how the game implemented liquids? The release date certainly wasn't too far off.
Great writeup and a fun exercise to implement by oneself as a learning project.
This is quite close to Terraria's implementation, earlier versions having the same falling water rendering 'glitch.' It does not implement pressurised water flowing upward on the other hand.
Simple Hooke's Law for Springs worked pretty well [1], even when I generalized to 3D. There much less nodes you have to iterate over to achieve a water effect.
Same idea: General framework for observer based cellular automata simulation. Invented years ago as a geospatial research.
https://github.com/ulrischa/OCell
Cool. Does anyone know a simulation (free accessible) simulation for air current? I want to see air currents in different building designs but have not found an accessible simulation yet.
Consider a J-shaped tube, open on both ends. After you add some water to the taller end, the bottom loop fills up. When you add more water, what happens? The water flows downwards even though the cell underneath is full.
That makes sense. The counterintuitive part for me was a cell causing the one underneath to become pressurized and then flowing back up. You don’t usually think of water as compressible.
A falling stream generates outward flow without piling up.
Watch your faucet run into a partially full sink: there’s a small depression where the stream impacts it — while the pressurized region under the stream pushes the water out and away.
This is in contrast to honey, which will form a mound when a stream hits, because of its higher viscosity.
A blurred line, I was thinking after asking. When the function has outputs that connect with space with visible logic, more CA; when not, more just optimisation. But this thus limits CA with art... not a good answer. What would be yours?
I don’t know. I just find it fascinating that there are two ways of looking at a problem but CAs strike me as simple computational units that can evolve in time, genetically cross each other to gain new function and demonstrate emergent behavior.
Ha, yup, I enjoyed adding that to the game :)
It was inspired by the system dwarf fortress used at the time extended with pressure to allow equalizing vessels.
No... lattice-boltzmann discritizes the navier stokes equations. This is just a cellular automaton. It uses a small number of rules in order to determine the change of every cell. You can of course conceptualize an eulerian solver of navier stokes as a cellular automata... but this system simply uses a very small set of simple rules to get something that looks right.
That is the source file shown at the beginning of the video... it compiles without warnings, runs a full blown fluid dynamics sim with surface tension and everything, can take itself as its own input... truly a work of art.
[1] https://youtu.be/QMYfkOtYYlg