Visual simulation library for ocean rendering.
Simulating specific sea conditions with Triton

If you're using Triton for training and simulation purposes, you'll want to use its more advanced physical simulation capabilities.

There are several ways to specify ocean conditions with Triton.

One thing to understand first is the distinction between local wind waves and swells. Wind waves result from local wind conditions, as defined by the WindFetch objects that cover the observer. Swells are typically longer-wavelength waves that may have originated from distant storms not impacting the immediate area. You may want to specify these types of waves independently, and Triton lets you do that.

Another important concept is that of "fetch length." This is the distance the wind has travelled before reaching the observer. Wind waves build up over time as the wind blows across the ocean surface, so the longer the fetch length, the larger the waves.

Choosing a wave spectrum model

You have several choices of a wave model in the Triton::Ocean::Create() method. To put it simply - use JONSWAP if you're building a maritime training application, or if you're using Triton to power buoyancy models where ship motion should be realistic. JONSWAP (Joint North Sea Wave Observation Project) is able to use fetch lengths as part of its simulation, and if no fetch lengths are specified, it will automatically fall back to the PIERSON_MOSKOWITZ model. JONSWAP simply extends PIERSON_MOSKOWITZ by simulating the non-linear effects of fetch length, but these effects can be important.

The TESSENDORF, PIERSON_MOSKOWITZ, and JONSWAP models all use inverse Fast-Fourier Transforms to power thier wave simulations, so they have the same performance characteristics at runtime. However, they have different computational costs when setting up the FFT's, which happens whenever the simulated wind or swell conditions change. If you anticipate changing the wind direction and/or speed every frame, you may opt to use TESSENDORF to get the best performance, although this comes at the cost of some physical accuracy (Tessendorf uses a simplified Phillips spectrum, which is very fast to compute.) PIERSON_MOSKOWITZ is slower than Tessendorf, and JONSWAP is the slowest of the three. But again, this only matters if you are changing the simulated conditions every frame.

Specifying fetch lengths

To take full advantage of the JONSWAP model, you must specify wind fetch lengths as part of your simulation. These are inferred from the WindFetch objects that you pass into Triton via Triton::Environment::AddWindFetch().

If you call Triton::WindFetch::SetLocalization() on a wind fetch, Triton may infer the fetch length based on the bounding volume of the wind fetch and the observer's location. The center of the wind fetch represents the origin of the wind, and the fetch length is the distance from the observer to this origin. If the observer is outside the bounds of the WindFetch, its wind is not used.

You may also specify an explicit, constant fetch length using Triton::WindFetch::SetFetchLength(). If set, this overrides use of the bounds defined in SetLocalization() for computing fetch lengths. However, if SetLocalization() was called on the WindFetch, its bounds will be used to determine if the WindFetch affects the observer at all.

It is important to use realistic fetch lengths if you are specifying them at all. Typically these are on the order of 100km. The fetch length plays a very important part in the overall wave heights, so setting it too small may result in unnaturally small waves. Setting it too high may yield unnaturally large waves. If you don't have real fetch length data to work with, you're better off leaving it unspecified and using the PIERSON_MOSKOWITZ model instead.

Simulating swells

Triton may simulate swells from distant storms indepedently from local wind waves. See the Triton::Environment::AddSwell() and Triton::Environment::ClearSwells() methods. These methods give you precise control over the heights, wavelengths, and directions of swell waves that are added into the local wind waves. Typical swell heights are around 3m, and typical swell wavelengths are around 100m - be sure the values you specify are realistic to prevent anomalies. Although you may specify a direction for your swell waves that is different from the local wind direction, this may look unnatural.

Swells are implemented by modifying the input to our inverse FFT to bake in the waves you've specified. As such, you may specify as many swell waves as you would like, and they will have no runtime performance cost.

Simulating specific Beaufort or Douglas sea states

The users of your application may wish to simulate specific "sea states," and Triton makes this as simple as possible.

The Triton::Environment::SimulateSeaState() method will produce local wind waves consistent with the state given from the Beaufort scale. See for a description of the conditions each value describes.

DegreeDescriptionWave Height (m)
1Light Air0-0.2
2Light Breeze0.2-0.5
3Gentle Breeze0.5-1
4Moderate Breeze1-2
5Fresh Breeze2-3
6Strong Breeze3-4
7High Wind4-5.5
9Strong Gale7-10
11Violent Storm11.5-16

In addition to the sea state simulated, your users may also want to add in specific swell conditions. Just use Triton::Environment::AddSwell() to add as many specific swell waves as you wish, and remember to use Triton::Environment::ClearSwells() before re-creating the swell conditions.

The Douglas Sea Scale ( ) specifies local wind waves and swells independently, so it specifies both kinds of conditions at once. The Triton::Environment::SetDouglasSeaScale() method may be used to simulate these conditions. The Douglas sea scale specifies a special "confused" swell state (#9,) which Triton interprets as removing all directionality from the simulated waves.

DegreeWind WavesSwell
0Calm (glassy) (0-.1m)No swell
1Calm (rippled) (.1-.5m)Very low (short & low)
2Smooth (.1-.5m)Low (long & low)
3Slight (.5-1.25m)Light (short & moderate)
4Moderate (1.25-2.5m)Moderate (average & moderate)
5Rough (2.5-5m)Moderate rough (long & moderate)
6Very Rough (4-6m)Rough (short & heavy)
7High (6-9m)High (average & heavy)
8Very High (9-14m)Very High (long & heavy)
9Pheonomenal (14+m)Confused (indefinable)