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.
- Create the vessel
- Create the water
- Create the bubbles
- Build a ground plane for our floor
- Add and frame the camera
- The texture of the water and glass
- Create the steam
- Set up lights and environment
- 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.
Extrude the bottom loop of the glass inwards and then use Grid Fill to create the bottom
of the glass.
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.
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.
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.
Finally, let’s add a Subdivision Surface modifier and shade smooth to get the rounded surface we want from our glass.
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).
Duplicate that Emitter shape and drag it up, and call that layer Surface.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Now if we hit Play, we should see the bubbles going in the right direction.
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.
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.
Our bubbles are looking great now, but there’s one more problem that needs solving: our bubbles never stop rising.
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.
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.
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.
We can similarly go to the Emitter object and, under the Render settings, turn off the Show Emitter option.
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.
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.
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.
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.
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”.
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.
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.
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.
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.
Create a single-user copy of the water material using the button shown below to make the glass a separate material.
Change the IOR (index of refraction) of the glass material to match the appearance of glass. I’ve set mine to 0.895.
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.
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.
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.
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)
B: Mapping (Vector) > Noise Texture (Vector)
C: Noise Texture (Fac) > ColorRamp (Fac)
D. Color Ramp (Color) > Principled Volume (Density)
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.
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.
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.
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.
We can add a second light by duplicating the first, rotating the light to face the other direction, and turning down the strength.
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.
Next, I will darken the plane surface our glass is resting on for a little more contrast.
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.
Similarly, I’ll tweak the Roughness and Transmission Roughness of our glass material a bit.
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.
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.
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.
One last tweak: under the render properties, make sure to turn on motion blur to really sell the animation.
And that’s it; we’ve animated boiling water! Here’s the final result.