top of page

Whale breaching

Brief User Manual:

The primary goal of this project is to utilize the ocean spectrum to build a realistic ocean system.

By leveraging water tank simulation data, the aim is to create vivid splash effects to portray the breaching behavior of whales.

  • Render Program: Mantra                         Min, Max Ray Samples: 1,9

  • Resolution: 1280 x 720                          Lights: key light, env light(HDRI)

  • Pixel Sample: 4                                          

Technical Guide

KakaoTalk_20240116_185459465_edited.png

First I created the ocean surface using the ocean spectrum node which creates a volume form of wave and controlled the wave form more clamly by controlling wind spectrum type and decreasing wind direction.

​

KakaoTalk_20240117_003419926_edited.jpg
KakaoTalk_20240117_011212914.jpg

Using flattank I connected with whale animation as a static object so that the whale can collide with the ocean surface and create waves. â€‹

KakaoTalk_20240117_175439015_08_edited.j
KakaoTalk_20240117_175439015_03.jpg
KakaoTalk_20240117_175439015_07_edited.j
KakaoTalk_20240117_175439015_05_edited.j

I use the VEX code to find the length of the velocity vector (f@vlen). I remove points with a velocity length of less than 2 and those below Y coordinate 0, getting rid of unnecessary underwater points. Afterward, I create a vector volume from the velocity vector bounding box and connect it to a PopNet. Using Advect by Volume, particles move close to existing points, creating more points within the original area without going beyond it.

​

​

KakaoTalk_20240117_175439015_02_edited.j
KakaoTalk_20240117_175439015_01.jpg

For drip simulation, I imported a whale animation and applied paint to indicate the areas on the whale object where the particles will drip onto its surface. Using the point wrangle node, I set up a condition to delete points if their random point number is less than the bias so that the points can disappear within a specified range and I also oriented their normals along the y-axis.

KakaoTalk_20240121_204042854.jpg
KakaoTalk_20240121_204042854_01.jpg

Then I created a circle near the area where the whale jumps and created a surface on the ocean with skin node. I connected the splash and the circle surface with the ocean evaluate so that it could attach to ocean waves and deleted unnecessary particles under the ocean surface.  

KakaoTalk_20240121_235134931.jpg
KakaoTalk_20240121_235414306.jpg

I gave nosie on the particle using attribute vop. To avoid noise at the emitter's start, I use particle age normalization. By dividing the age, I make sure it's 0 when born and 1 when it dies, giving it a smooth lifespan. Then, I add turbulence noise, blending positions with bias data. This makes particles stick to the surface at first, gradually showing natural noise like a whale surfacing. A ramp helps control the noise to create subtle water patterns.

​

KakaoTalk_20240122_002408997.jpg
KakaoTalk_20240122_002218527.jpg

To show points clumping together, I used two Attribute VOP nodes in a drip simulation. The first node takes points within a certain radius, and averages their values, preventing particle scattering. The second Attribute VOP, tied to the whale's surface, gets average point values, keeping particles stuck to the surface for a flowing water effect without spreading.

​

​

KakaoTalk_20240122_005849582.jpg
KakaoTalk_20240122_003858822.jpg

After the drip simulation, I cleaned up unwanted elements below the water surface using Point Wrangle and attributes. Then, I created mist using Pyro Source, generating density and temperature attributes. Adding point velocity and employing rasterize, I created a volume for the simulation.

​

KakaoTalk_20240122_010821333.jpg

I simulated using the mist source I created and utilized a Gas Wind node to move the volume in a specific direction. In this case, I shifted it by 1 unit along the z-axis and adjusted the wind strength using the wind scale.

KakaoTalk_20240122_011305390.jpg
KakaoTalk_20240122_022546528.jpg
KakaoTalk_20240122_022014349.jpg
KakaoTalk_20240122_024119256.jpg
KakaoTalk_20240122_023632227.jpg

To minimize the mist data, start by compressing it using Volumecompress. Next, separate the Density and Velocity volumes with Blast. Convert VDB transforms them into VDB format, and VDB Vector Merge combines them into a single volume, reducing the data size. Switch the voxel scale to 2 using VDB Resample with "using voxel scale only," and then use Merge to combine the reduced vector data.

KakaoTalk_20240122_030431183.jpg
KakaoTalk_20240122_030747893.jpg

Going back to the ocean surface, the sections with simulation are rendered directly, thanks to the simulation itself. In contrast, areas without simulation use displacement for rendering. By employing a particle fluid mask, you can apply a volume mask. This selectively renders the simulated part with a water displacement shader in blue, while the unsimulated red areas are rendered without the simulation effect.

KakaoTalk_20240122_031524804.jpg

The bounding box within the regions of the particle fluid surface serves the role of expanding the water surface based on the original water tank. This is utilized to connect the ocean surface to the channel of the water tank simulated.

bottom of page