a scene that was always going to be difficult was the flood.

i knew from the beginning that i wanted to visually reference Hokusai's Beneath The Wave at Kunagawa but didn't know how to pull it off.

i was inspired by the cutout animation of waves in Kihachiro Kawamoto's Dojoji Temple but wanted something more dynamic and with less drawn animation involved.

ultimately i decided to deform nurbs planes using sin functions. four points are required to define a sin wave. i used sixteen control points for each plane so that i could have two levels or waves, one that repeated every four control points, and one that repeated every sixteen.

i then put placed a lattice around all the waves. this lattice was in turn deformed by sin functions, creating much larger waves. this is the basic expression.

wv01_ZZ_01cls15Handle.translateY = sin((wv01_mainCTRL.speed * frame * 0.01) * 1.5707961) * wv01_mainCTRL.smWAVEamp * 0.05 + sin((wv01_mainCTRL.speed * 0.025 * frame) * 1.5707961) * wv01_mainCTRL.mdWAVEamp * 0.05;
wv01_ZZ_01cls0Handle.translateY = sin((wv01_mainCTRL.speed * frame * 0.01 + 1) * 1.5707961) * wv01_mainCTRL.smWAVEamp * 0.05 + sin((wv01_mainCTRL.speed * 0.025 * frame +0.25) * 1.5707961) * wv01_mainCTRL.mdWAVEamp * 0.05;
wv01_ZZ_01cls1Handle.translateY = sin((wv01_mainCTRL.speed * frame * 0.01 + 2) * 1.5707961) * wv01_mainCTRL.smWAVEamp * 0.05 + sin((wv01_mainCTRL.speed * 0.025 * frame +0.5) * 1.5707961) * wv01_mainCTRL.mdWAVEamp * 0.05;
wv01_ZZ_01cls2Handle.translateY = sin((wv01_mainCTRL.speed * frame * 0.01 + 3) * 1.5707961) * wv01_mainCTRL.smWAVEamp * 0.05 + sin((wv01_mainCTRL.speed * 0.025 * frame +0.75) * 1.5707961) * wv01_mainCTRL.mdWAVEamp * 0.05;

this expression controls the y value of each control point. to get the wave to curl over, i originally applied the same expression to the x value. however, this made it slant over in a straight line, rather than curl. ultimately i had to square the x value to create a curve. this produced the desired results.

wv01_secondLATcls25d_GRP.translateX = wv01_secondLATamp25.translateX * wv01_secondLATamp25.translateX * (wv01_mainCTRL.bigWAVEfarAMP + wv01_secondCTRL.bigWAVEfarAMP) * 0.1 * (wv01_mainCTRL.bigWAVEfarCRL + wv01_secondCTRL.bigWAVEfarCRL);

in this case, the variable wv01_secondLATamp25.translateX has already had the sin function applied to it. so this value maybe be treated as the result of the sin function. i then multiplied this result by attributes that could easily be controlled by the animator.

this created the basic wave shape. i added additional cutouts to form the whitecaps on the crest of the wave.

linked here is a rar archive of all MEL scripts required to build the wave rig.