Surfs up!
Tom Kluyskens talks about the beach break effects in Surfs’ Up, with excerpts from his SIGGRAPH 2007 sketch.
There are 4 important parts to the Surf’s Up beach break effect:
waves
’licks’ — the part of the waves that laps on shore
surface foam
whitewater
1. Waves
Wave formation can be boiled down to a few relatively simple mathematical equations based on the ocean floor profile. We implemented those rules in a Houdini setup.
A series of particle lines is being emitted out in the ocean, towards the beach — representing incoming waves. Every particle controls a curve profile that can take on any wave profile shape, depending on its position above the ocean floor, and the accumulated depth D and dD information. A series of profiles is skinned, resulting in a wave surface.
2. Licks
At some point in the wave’s life cycle, a second, denser line of particles is emitted. These particles sense the beach slope and have specific rules based on simple fluid dynamics and animation curves to regulate the velocity up and back down the beach. In the same way as with the waves, each particle is associated with a curve profile, and these curve profiles are skinned to form the lick surface. From these surfaces, displacement maps are derived for in-shader displacement compositing.
3. Foam
In a separate setup, a foam pattern (convection) life cycle is simulated and rendered as a repeatable texture. The result is an image sequence representing a 3D shader: X and Z being U and V, and the sequence being the Y axis.
A hybrid RenderMan splatting shader takes “bites” out of this structure. The shader calls on attribute-carrying particles and rendered attribute maps to decide about placement, life cycle stage, deformation and fading of the original foam texture tile.
Particles are used for conveying attributes to the shader, but this technique is limited in its spatial precision. At leading edges of licks and waves, where more precise delineation is required, the shader switches to attribute texture map lookups.
Using such a shader results in relatively fast and light renders compared to using and rendering an actual particle/fluid sim. It uses a pre-rendered texture foam cycle, which delivers results that are beyond any procedural texturing method that tries to depict foam using noise functions etc.
4. Whitewater
All whitewater in the movie is done through a RenderMan clustering DSO, where many RenderMan points are added at rendertime based on an input of ‘seed points’. The seed point simulation itself is a fairly conventional Houdini particle setup.
We wanted a fixed dataset for each beach, and so all whitewater was pre-simulated and stored on disk. To get the required detail from all angles, this resulted in about 200GB of particle data for each beach.
When a beach break shot comes up, an FX TD can set off a simple procedure that takes a chunk out of the full-beach whitewater sim, based on the camera’s position. This involves camera-culling invisible parts away, and doing a smooth distance-based LOD cull of the master sim.
Conclusion
The result of the beach break effect setup is a fixed, loopable dataset of particles, texture maps and surfaces on disk, of about 300GB for each beach. This allows a beach break shot to be set up in about 10 minutes, and rendered very efficiently.
A final render of the beachbreak:

password: jupjazz
Extended version of the abstract above:
Intro
When I joined the Surf’s Up team in November ‘05, I was asked do develop a solution for shore break — or beach break. Basically, I had to develop the effects for the transition zone between land and ocean.
We had all seen the amazing work done on Madagascar. But, as the beach was such a prominent location in Surf’s Up, we set out to make it just a notch better.
As the production ramped up mid ‘06, it became clear that the beach break would be featured in lots of shots (ended up being about 70), and so I envisioned the system to be highly procedural, ideally allowing a TD to generate beach break for a shot with a single click of the mouse. And that without killing the renderfarm in the process.
This imposed certain technical constraints to the system. Full-fledged fluid sims at this scale were quite out of the question for example. Everything had to be done using relatively conventional, existing tools.
But despite those technical constraints, we wanted to keep the main visual characteristics of waves lapping on shore.
There’s 4 important parts to beach break :
waves
’licks’ — the part of the waves that laps on shore
surface foam
whitewater
1. Waves
For this part of the effect, I set out to study the physical dynamics of waves and beach formation, and to my surprise wave formation can be boiled down to a few quite simple mathematical rules and formulas based on the ocean floor profile. I then implemented those formulas in a procedural wave system.
As I was most fluent in Maya, I took my first stabs at it with a combination of Maya dynamics and MEL scripts, but I soon became clear that the high level of proceduralism was crying out for a Houdini implementation. I quickly ported whatever I had to Houdini, and never looked back.
The basics of the wave formation system are the following (videos) :
a series of particle lines is being emitted out in the ocean, towards the beach — representing incoming wavetrains (in reality wavetrains are generated sometimes 100s of miles from shore, in a storm for example, and can travel for days before hitting the coast) (video 3951)
every particle controls a curve profile that can take on any wave profile shape
every particle senses ocean depth D and ocean depth changes dD and adapts its speed to those conditions
depending on D, dD and the particle’s speed, and some other variables representing wind and other conditions, the particle ‘chooses’ a wave profile
wave profiles run on two axes : the wave shape/type and the wave phase
a series of profiles is skinned, resulting in a wave surface
so the result is that a series of waves will ‘grow’ and slow down as they approach the beach, and ‘crash’ at a certain depth, after which they die
2. Licks
Now for the more tricky work of having waves lap on shore (we called that part of the wave the ‘lick’)…
From the start I was given two beaches to work with — let’s call em North and South beach — and very thin sliver of beach estate to play with. (image) Lowering the ocean level to increase the size of the playing field was of course a big no-no as many effects depended on that zero level (image), as was having waves lap too high on shore (we wanted minimal interaction with the characters and objects). This constrained us to a quite specific ‘dance’ of waves :
Not too big or too fast so they wouldn’t lap too high. Not too slow so they wouldn’t look unnaturally sluggish. Not too small as we wanted at least some crashing wave action — it’s a surfing movie after all.
So a compromise was struck, and it turns out the frequency and size of the waves we got is more or less what you would find on a beach of that profile! Not that very many beaches actually have that profile of course, but there are nonetheless physical rules for beach formation. Prevailing winds and ocean floor profile define shape and frequency of the waves, which in turn shape the beach. We went the other way — adapting the size and frequency of the waves to the beach profile.
The technical implementation of the licks works like this :
each wave hitting the shore emits a new –denser– line of particles
the particles sense the beach slope and have specific rules based on simple fluid dynamics and animation curves to regulate the velocity up and back down the beach
in the same way as with the waves, each particle is associated with a curve profile, and these curve profiles are skinned to form the lick surface
[Having waves and licks as separate surfaces was a conscious decision. This 2-module approach was necessary for the rendering side of things, and allowed the system to be much more flexible and customizable down the line.]
We had to make sure that the zero line (image) where beach and ocean intersect, was covered by licks at all times. So I staggered the incoming waves in a semi-random way — emitting them from a ‘ladder’ (image), assuring even coverage, yet random enough to feel ‘organic’.
At the same time I made sure the emission pattern was repeatable, so we could create a beach break loop, where all elements would loop back on themselves after about 400 frames — giving us a finite system even for longer shots.
3. Foam
The ‘organic’ overlap of surfaces came to be the main challenge on the rendering side. The foam top layer was the next stage in the beach break development. It is visually the most critical part of the effect.
The challenge was multi-fold :
it needs to ‘evolve’ from solid foam to swiss cheese foam to nothing
the foam ‘stretches’ up the beach, and has internal fluid-driven motion up and down the beach
it has to tie in perfectly with the leading edge of waves and licks
yet it cannot be UV-mapped on the surfaces because of the organic overlap of the surfaces
This last point (not being able to UV map) drove us to make the texturing particle-based:
’splat’ the surface with foam where a particle is present. This also partly solved (I), as we could attach a life attribute to the particle and guide the texture through a foam ‘lifecycle’.
However, particle based texturing is not precise enough for sharp leading edges (III), and so the shader detects those edges based on particle attributes and switches to a projection map-based texturing approach in those areas. Those same maps are then used to stretch the foam texture space and convey its internal motion on the lick surface, solving (II).
Having this more ‘holistic’ way of texturing the licks made the shader independent of geometry, and allowed us to replace the many overlapping lick NURBS surfaces by 1 big ocean plane and use displacements instead — which allows for much more flexible control, like in-shader displacement compositing. Originally even the waves were implemented as displacements, but we switched back to surfaces for various technical reasons.
The evolving foam pattern itself was first implemented as a particle sim, then later that sim was tailored to repeat in U and V, and rendered out to a square texture map for use in the splatting shader.
The foam sim involved simple fluid dynamics under form of a custom-made Houdini bubble-POP (by Dan Kramer). The bubble POP makes particles behave like bubbles — conserving volume and doing a dance of sticking together and repelling eachother. I added to that a simulation of convection to get the ‘swiss cheese’ look.
The result was an image sequence representing a 3D shader : X and Z being U and V, and the sequence being the Y axis. Texture splatting particles would take a bite out of this structure through the prman foam shader, resulting in relatively fast and light renders compared to using and rendering an actual particle/fluid sim.
4. Whitewater
The last noteworthy element in the beach break effect is the whitewater. All our whitewater in the movie is done through a Renderman clustering DSO, where many Renderman points are added at rendertime based on an input of ‘seed points’. You give it a particle sim of a 1000 points, and it multiplies that to a million at rendertime.
The sim was a fairly conventional Houdini setup, with the following caveats :
it had to repeat perfectly over 400 frames
it had to be light enough to store on disk
it had to be LOD’ed so the pointcount at rendertime stayed within limits
(I) was solved easily by simming 800 frames and then overlapping the last 400 with the first 400 frames — simply put. This allowed us to have 1 fixed mastersim per beach, which was once simmed and then stored on disk.
To get the required detail from all angles, (II) ended up being about 150GB of data for each beach.
(III) was solved by a one-click solution for LOD’ing (II) : when a beach break shot comes up, a TD can set off a procedure that takes a chunk out of the full-beach whitewater sim based on :
– a frame offset
– camera position
This involves camera-culling invisible parts away, and doing a smooth distance-based LOD cull of the master sim. A shot looking all the way down the beach for example, kills away particles in the far distance to about 2% of the original amount. (video)
This completes the beach break setup. (videos of final shots)
Summary :
The result of the beach break effect setup is a fixed dataset of particles, texture maps and surfaces on disk, of about 200GB for each beach. This allows a beach break shot to be set up in about 10 minutes.
Base elements of the effect :
NURBS wave surfaces
displaced ocean surface for the licks
particle/projection-map based foam shader
clustered and LOD’ed whitewater particle sim
Extra elements :
wet sand animated maps
ocean ‘wavetrains’ (by Debbie Carlson), and their
dampening maps to flatten the frequencies down to nothing on the beach
rock splashes
interactive foam and ripples for character interaction
surface prman attributes for rendering and lighting effects like refraction and coloration
And here’s the intro to the movie, which shows some other work I did on Surf’s Up: whitewater for the ‘spilling breaker’ type wave (a wave that doesn’t curl over), and camera splash.
The whitewater, as before, is clustered to ten of millions of points at rendertime by a Renderman dso, and rendered using deep shadows. The droplets on the camera window are simple metaballs, rendered as a normal map, then used to warp the plate in comp. A bit like a heat distortion pass.
