Simple Liquid Simulation

Subscribe to Simple Liquid Simulation 22 posts

avatar for RTL_Shadow RTL_Shadow 1036 posts
Flag Post

I’m looking for a simple liquid simulation, does anyone know of a good one that doesn’t take much effort?

 
avatar for UnknownGuardian UnknownGuardian 8201 posts
Flag Post

Visuals or physics or both?

 
avatar for RTL_Shadow RTL_Shadow 1036 posts
Flag Post
Originally posted by UnknownGuardian:

Visuals or physics or both?

Visuals, I guess. I have a “core” in the center of my player that you can see through, and I want to be able to see liquid splash around inside of it and react to the player moving.

 
avatar for JohnnyBohnny JohnnyBohnny 113 posts
Flag Post

Here is a Box2D approach: http://www.emanueleferonato.com/2012/05/16/simulating-mudslime-with-box2d-bitmaps-and-filters/

 
avatar for qwerberberber qwerberberber 521 posts
Flag Post

DO not use circle physics. Use points particles, and the algorithm is as follows:

for each i:
-add (negative player velocity * multiplier(0.01?)) to i velocity
-multiply i velocity by damping factor(0.8?)
-for each particle i within a certain radius(20?make sure this is smaller than visual radius):
—move both i and j away from each other by dist(i,j) * multiplier(0.05?)
-constrain within the circle that is the “core”

may require tweaking.

If side view, add gravity gently.

 
avatar for RTL_Shadow RTL_Shadow 1036 posts
Flag Post
Originally posted by qwerberberber:

DO not use circle physics. Use points particles, and the algorithm is as follows:

for each i:
-add (negative player velocity * multiplier(0.01?)) to i velocity
-multiply i velocity by damping factor(0.8?)
-for each particle i within a certain radius(20?make sure this is smaller than visual radius):
—move both i and j away from each other by dist(i,j) * multiplier(0.05?)
-constrain within the circle that is the “core”

may require tweaking.

If side view, add gravity gently.

Could you elaborate on “Points Particles” and what “j” is? It’s not defined in your pseudocode.

 
avatar for qwerberberber qwerberberber 521 posts
Flag Post
Originally posted by RTL_Shadow:
Originally posted by qwerberberber:

DO not use circle physics. Use points particles, and the algorithm is as follows:

for each i:
-add (negative player velocity * multiplier(0.01?)) to i velocity
-multiply i velocity by damping factor(0.8?)
-for each particle i within a certain radius(20?make sure this is smaller than visual radius):
—move both i and j away from each other by dist(i,j) * multiplier(0.05?)
-constrain within the circle that is the “core”

may require tweaking.

If side view, add gravity gently.

Could you elaborate on “Points Particles” and what “j” is? It’s not defined in your pseudocode.

point particles means particles are not separated using circle physics and instead of using circles to represent the particle you only use x ans y. i and j belong to the same set of particles.

 
avatar for JohnnyBohnny JohnnyBohnny 113 posts
Flag Post

Fluid dynamics are actually very difficult to simulate. The first challenge is to apply physics to the water particles. Usually circle collisions are used (I think) and you could get away with that, or a simplified version, in a simple top-down game. If the game is side-scrolling, and gravity is applied to them, proper collision is more important.
The second issue is displaying the fluid. You could use circles for all particles, but this would create gaps in a blob for example, and things like that don’t occur in nature. Due to surface tension (caused by Hydrogen connections in water), water forms drops and two drops can fuse together easily. One approach I saw once is to blur the image of the particles, and then increase the contrast, so it looks normal again.

 
avatar for alecz127 alecz127 817 posts
Flag Post

I simply do NOT understand how to apply “the look”. I’ve looked at dozens of tutorials but they’ve failed to explain the part I really have trouble understanding.

step 1: apply blur (got that)

step 2: somehow apply this weird threshold thing in this convoluted way that everybody seems to do differently and it makes no sense but makes it look beautiful in the end result.

Can someone explain using the threshold and blur together to actually achieve the end result? I can figure out how to do the actual metaball physics.

 
avatar for Draco18s Draco18s 6875 posts
Flag Post
Originally posted by alecz127:

step 2: somehow apply this weird threshold thing in this convoluted way that everybody seems to do differently and it makes no sense but makes it look beautiful in the end result.

Open photoshop or gimp.

Draw a gradient.

Apply the “Threshold” filter.

Observe results.

Think about applying this effect to a blurred circle.

Think about what happens when multiple circles in proximity to each other are blurred.

 
avatar for DPbrad DPbrad 1197 posts
Flag Post

http://www.fastswf.com/Nmx6mcc
Click on the left side of the window to get the original blurred bitmap, and then the meta-ball effect on
the right. I whipped this up quite quick so it looks a bit ugly but the basic principle works.

Code:

Meta-bitmap blur

_meta.bitmapData.fillRect(_meta.bitmapData.rect, 0);
			_meta.bitmapData.threshold(_bitmap.bitmapData, _bitmap.bitmapData.rect, new Point(0, 0), ">", 0x88888822, 0xffffffff);
			_meta.bitmapData.applyFilter(_meta.bitmapData, _meta.bitmapData.rect, new Point(0, 0), new GlowFilter(0xFFFFFF));

_bitmap is just the original bitmap on the left, which gets gradient filled shapes drawn to its bitmapData.

EDIT: Another meta-ball test I found. http://www.fastswf.com/X_xnhtI
I have the source if you want it, just ask and ill upload it.

 
avatar for alecz127 alecz127 817 posts
Flag Post

@DPbrad I’d love the source if you wouldn’t mind. I think its making more sense.

 
avatar for DPbrad DPbrad 1197 posts
Flag Post
Originally posted by alecz127:

@DPbrad I’d love the source if you wouldn’t mind. I think its making more sense.

Sure, here you go: http://dpbrad.com/storage/Metaballs.zip

 
avatar for RTL_Shadow RTL_Shadow 1036 posts
Flag Post

That second one looks sexy as heck, especially with the dynamic lighting :)

Edit: So here is my current code:

			var b:LiquidBall;
			for each ( b in balls )
			{
				//physics
				if ( b.v.y < 2 )
				{
					b.v.y += gravity;
				}
				
				//collision
				if ( dist( b, middle ) >= radius - 8 )
				{
					b.v.y = 0;
				}
				
				b.x += b.v.x;
				b.y += b.v.y;
				
				//rendering
				liquidData.copyPixels( baseBallData, baseBallData.rect, new Point( b.x, b.y ), null, null, true );
			}

Now, obviously this won’t work, because if a ball goes anywhere besides straight down it will only set y to zero. How do I effectively handle a collision. The container is a circle, and “middle” variable is the center of it.

 
avatar for RTL_Shadow RTL_Shadow 1036 posts
Flag Post

Any idea how to properly handle collisions?

 
avatar for RTL_Shadow RTL_Shadow 1036 posts
Flag Post

I got it, ****:
http://www.fastswf.com/ecVXiqU

 
avatar for alecz127 alecz127 817 posts
Flag Post
Originally posted by RTL_Shadow:

I got it, ****:
http://www.fastswf.com/ecVXiqU

hells yeah brotha! Way to go!
I’m still at square one. x o
Then again I had to work a day job all day.

 
avatar for feartehstickman feartehstickman 522 posts
Flag Post

Apart from the fact they still bounce at rest, that looks quite good.

 
avatar for Ace_Blue Ace_Blue 1127 posts
Flag Post

Wait a minute or two and the particles end up on top of one another. By pushing them around with the mouse you can get them to all collapse into one particle that is no longer affected by gravity with a bit of effort. Methinks there is a bug somewhere, unless you factored in evaporation somehow?

Anyway compacting all the droplets into one is way more fun than it has any right to be.

 
avatar for Senekis93 Senekis93 4090 posts
Flag Post

Yep, there’s a bug. You can also make them move to the top and stay motionless up there.
Looks nice.

 
avatar for RTL_Shadow RTL_Shadow 1036 posts
Flag Post

Yep, there’s a few bugs I need to iron out. Mostly cause I prototyped this for fast-creation, not no bugs.

 
avatar for BraydenBlack BraydenBlack 271 posts
Flag Post

This topic made me wanna try n re-create the effect in spewer, so i made a slime-like liquid simulation here It can get pretty laggy after 500 particles because of all the collisions but i’m working on optimizing it. Click-drag to spawn slime particles.