inspirationtutorials

How to Animate Boiling Water in Blender (With Bubbling Effect)

Nov 9th 2022

In this Blender Beginner tutorial, we’re going to learn how to animate boiling water in Blender—complete with bubbles, steam, and a red-hot hot plate. 

At a high level, the basic process we'll follow to animate boiling water in Blender is: 
Table of Contents
  1. Create the vessel 
  2. Create the water
  3. Create the bubbles
  4. Build a ground plane for our floor
  5. Add and frame the camera
  6. The texture of the water and glass
  7. Create the steam
  8. Set up lights and environment
  9. Create the hot plate!

There's a lot to get done, so let's get started. 

Step 1: Creating the vessel

We’ll need something to hold our boiling water, so let’s start by creating a vessel.  We going to use glass so we can get the best view of our boiling water. Create a cylinder, and delete the top and bottom faces, leaving an open-ended tube as shown below.

Image 001.jpg

Extrude the bottom loop of the glass inwards and then use Grid Fill to create the bottom of the glass.

Image 002.jpg

Now select all and extrude and scale inwards to give our glass some thickness. Use Shift+Z to turn off scaling on the Z-axis; that way the edges of our glass will be level like they should be.

Image 003.jpg

We’ll need to select the bottom of the glass and bring it up separately. To do this, I’ll switch to X-Ray Mode, use Box Select to deselect the side walls, grab the bottom of the glass, and move it up the Z-axis.

Image 004.jpg

With the thicknesses set as needed, let’s leave X-Ray Mode, add a Bevel modifier, and tweak the settings a bit so that the glass’s edges are beveled as they would be in real life.

Image 005.jpg

Finally, let’s add a Subdivision Surface modifier and shade smooth to get the rounded surface we want from our glass.

Image 006.jpg

Step 2: Let's create the water

We need to create both the surface of our water and an emitter for our bubbles. We should still have the base of the glass selected, and that’s the perfect size for both since it perfectly fills up the glass, so go ahead and duplicate and separate that base. I’ll call this object “Emitter” (yes, I know it’s spelled wrong in the image; now stop looking).

Image 007.jpg

Duplicate that Emitter shape and drag it up, and call that layer Surface.

Image 008.jpg

Make sure to get rid of the Bevel modifiers on the Emitter and Surface objects, and the Subdivision Surface modifier from the Emitter as well. Then, add a Displace modifier to the Surface object. In this Displace modifier, we’ll create a new Voronoi-type texture, which will form the basis for our boiling water.

Image 009.jpg

I’ll tweak the feature weights, size, strength, and subdivisions of this Voronoi texture to get the effect I’m looking for. If you’d like to see the exact final values for each, I encourage you to check out the video version of this tutorial to see these changes in real-time. Here’s how the surface of our water is looking now.

Image 010.jpg

Now it’s time to animate the boiling water texture. We can do this by switching the Displace modifier to use another object for the coordinates. I’ll then create an Empty Plain Axes object and select that object for our Displace modifier’s coordinates.

Image 011.jpg

What this will allow us to do is animate the Voronoi noise pattern using the position of the Empty object, since moving the Empty object will also change the Displace modifier.

To get the Empty object moving continuously so that the boiling animation happens continuously, we can set the Z-axis of the Empty object to “#frame*.05”. The “#” symbol here is a shortcut to create a driver, and “frame” here is a special variable in Blender that refers to the frame number; as such, it continually increments as the frame the animation is on increases. The “.05” factor slows down the animation to get the effect we’re looking for.

Image 012.jpg

Now that we can see the boiling water in motion, I’ll adjust some of the size and strength values again to get closer to our desired effect, and I’ll speed up the animation slightly as well. You can see that the water peaks now have a more rounded look, which looks more realistic to me.

Image 013.jpg

Step 3: Creating the Bubbles 

With our water in good shape, it’s time to create our bubbles. Let’s start by creating a UV sphere mesh, resizing it to make it a bit more ovular, and shading it smooth.

Image 014.jpg

Next, let’s select our emitter, create a new ParticleSystem using the + symbol in the Particle tab, set “Render As” to Object, and select our Sphere as the Instance Object. This will allow us to render our bubbles as particles that look like the sphere we created. We can also change the Scale and Scale Randomness of our particle system so that the bubbles don’t all look identical.

Image 015.jpg

We can also scale our emitter down just a tad and apply that scale so that our bubbles don’t form within the walls of our glass.

Now, we have an issue: if we hit Play, we’ll see that our bubbles are going in the wrong direction.

Image 016.jpg

You may be tempted to fix this by reversing the value for gravity in the Scene Properties, but this will also affect anything else in the scene that’s subject to normal physics. Instead, let’s solve this by changing the value of gravity within the particle system from 1 to -1.

Image 017.jpg

Now if we hit Play, we should see the bubbles going in the right direction.

Image 018.jpg

It does look like the bubbles dip below the emitter first before rising up, however; we can solve that by zeroing out the initial velocity of the particles.

19.png

To introduce some natural randomness to the bubble animation, let’s change the Rotation settings. I’ll increase the Randomize, Phase, and Randomize Phase values and turn on the “Dynamic” option to accomplish this.

21.png

Our bubbles are looking great now, but there’s one more problem that needs solving: our bubbles never stop rising.

22.png

To resolve this, let’s switch to the Surface object and, in the Physics tab, turn on Collision and enable the “Kill Particles” option. Now when the bubbles collide with the surface of the water, the particles will be killed.

Image 023.jpg

To make sure that there are no breakthrough particles, we’ll also want to make sure this Collision modifier is first in the modifier chain; that will make sure the calculations are done based on the flat, unmodified surface.

Image 024.jpg

Now that we’re done creating our bubbles, we can turn off the sphere. One trick I like to use is creating a collection that’s turned off; then I can just place anything I want to turn off inside that collection.

Image 025.jpg

We can similarly go to the Emitter object and, under the Render settings, turn off the Show Emitter option.

Image 026.jpg

Finally, now that our bubbles look exactly the way we want, let’s cache them so that they’re locked in and not being dynamically regenerated each time; that will also allow us to skip around on the animation timeline. Select “Bake All Dynamics” under the cache setting.

Image 027.jpg

Now that everything is cached, we can set the Midlevel value on the Surface’s Displace modifier to so that it intersects the bubbles; that’ll give us the most realistic bubbling effect.

Image 028.jpg

Step 4: Creating the floor plane

Let’s create a floor plane for our cup to stand on. To do this, create a mesh plane and scale it so it’s big enough to comfortably fit the cup.

Image 029.jpg

Step 5: Adding and framing the camera

Use Shift+A to create a camera, and enable the “Lock camera to view” settings in the View settings.

Image 030.jpg

Frame the cup as desired—setting the focal length and zoom to do so—and turn on Passepartout so that everything outside of the camera frame is blacked out. Once that is completed, turn off “Lock camera to view”.

Image 031.jpg

Step 6: Texturing the water

To prepare to work on the water material, switch to the Cycles render engine and switch the Device to GPU Compute. Then, turn off the Scene World.

32.png

After entering a split view, let’s add a new material to the Surface object. We’ll adjust the Transmission, Transmission Roughness, Roughness, and Specular values to approximate water. Generally, I like staying a little short of 1 or 0, because I think it looks more realistic.

Image 033.jpg

Let’s turn our collection containing the bubble back on for a moment and put the water material we’ve just created on the bubble as well. We can then turn the collection back off.

Image 034.jpg

Step 7: Texturing the Glass

To start, let’s add our water texture to the glass as well. We’ll be modifying this a bit, but this will give us a good baseline for glass.

Image 035.jpg

Create a single-user copy of the water material using the button shown below to make the glass a separate material.

36.png

Change the IOR (index of refraction) of the glass material to match the appearance of glass. I’ve set mine to 0.895.

Image 037.jpg

Step 8: Creating the steam

To start creating the steam, we’ll first create a new mesh cylinder object and resize and reposition it so that it just barely fits inside the glass and just barely intersects with the surface of the water.

Image 038.jpg

Next, create an empty volume object. Add a Mesh to Volume modifier to it and select the new cylinder we’ve created as the object.

Image 039.jpg

Hide the cylinder we’ve created, and you should see an empty volume rising out of the glass. Select that volume and add a new material to it. This will automatically create a Principled Volume node feeding into the Volume of a Material Output node. If Principled Volume is feeding into Surface instead, correct it to feed into Volume.

Image 040.jpg

We will now add and connect the following series of nodes (with the corresponding properties of those nodes in parentheses):

A: Texture Coordinate (Generated) > Mapping (Vector)
41.png

B: Mapping (Vector) > Noise Texture (Vector)

42.png

C: Noise Texture (Fac) > ColorRamp (Fac)

43.png

D. Color Ramp (Color) > Principled Volume (Density)

44.png

If we switch back to Rendered View and adjust the colors on the ColorRamp node a bit, we should start to see some noise that approximates steam.

Image 045.jpg

If we change the Texture Coordinate node to the Object property and select the Empty volume with our steam, the steam will actually be able to rise throughout our animation.

Image 046.jpg

We can further tweak the Scale of the Noise Texture node and the colors of the ColorRamp node to get our steam looking more realistic.

Image 047.jpg

Note that the steam will never look quite right until we add lights, so let’s do that now.

Step 9: Set up the lights and environment

Let’s add a sun light, rotate it off to the side, and turn up the strength.

48.png

49.png

50.png

We can add a second light by duplicating the first, rotating the light to face the other direction, and turning down the strength.

51.png

52.png

Let’s also turn up our World Opacity so that if the background is caught anywhere in the camera angle of our render it’ll be visible and presentable.

53.png

Next, I will darken the plane surface our glass is resting on for a little more contrast.

54.png

Now that we have a better view of our steam with the lighting and environment in place, I’ll add some Distortion in the Noise Texture node so that our steam has a bit of a twisting, billowing effect, which feels appropriate here.

Image 055.jpg

Similarly, I’ll tweak the Roughness and Transmission Roughness of our glass material a bit.

Image 056.jpg

Step 10 Create the hot plate

Now that we have our boiling water animated so well, let’s create the hot plate that is causing all the boiling. I’ll create a mesh cylinder, resize it appropriately, add a new material, turn the Metallic property all the way up, and turn the base color all the way down.

57.png

I’ll now create another cylinder to represent the red-hot coils of the hot plate. For this one, I’ll create another new material, change the material surface type to Emission, change the color to a reddish-orange, and turn up the strength.

58.png

I’m noticing that I can still see my emitter in the shot, so I can go to the emitter’s object properties and turn off Viewport under the Instancing options.

59.png

One last tweak: under the render properties, make sure to turn on motion blur to really sell the animation.

Image 060.jpg

And that’s it; we’ve animated boiling water! Here’s the final result.

Image 061.jpg

Image 062.jpg

Guest Author

Chris Bailey

Get the latest

Sign up with your email address and get the latest, straight to your inbox.