Rolls an animated FFT ocean-wave surface across a subdivided host — turns a flat plane, mesh, or cloner into moving water on the GPU.
Declarative element:
<sk-ocean-displacement-point-constraint>
Not on the sk.* global — construct via the declarative element or a module import.
This is the ocean member of the PointConstraint family: like every
point-constraint it runs a GPU kernel over all of a host's points at once. Here the
kernel samples an FFT-evolved wave field
that advances every frame, so a densely subdivided surface heaves and ripples like
open water. Unlike most point-constraints it needs no SpatialField — the
wave field is its own driver — and it attaches to any points host: a mesh
(a sk-plane is the usual ocean), a spline, or a sk-cloner.
Key attributes. preset picks a sea state (e.g. calm, rough) — the
one-shot way to set the whole wave spectrum, and all the example needs. For finer
control the individual spectrum controls (wind-speed, wind-direction,
vertical-amplitude, time-scale, …) set the swell directly — higher wind gives
longer, steeper waves. Either way the host must be finely subdivided (many
segments) for the waves to read; a low-poly plane shows facets instead of a smooth
surface.
Composition. Point-constraints on the same host apply in attach order, each
building on the previous displacement. Attach the ocean FIRST so a later
sk-radial-push-point-constraint (say, a wake around a boat) layers on top
of the waves rather than being flattened by them.
Related. Its siblings in the PointConstraint family are
sk-simple-point-constraint, sk-radial-push-point-constraint,
sk-target-at-point-constraint, and the fully custom
sk-custom-wgsl-point-constraint.
Projection modes (see OceanDisplacementProjection):
'planar-xz' (default) projects the field down a single world-XZ plane —
correct for roughly-horizontal hosts. 'triplanar-surface' is an opt-in,
MESH-only surface-relative projection (height along the surface normal,
blended across three axis planes) that wraps the ocean around a non-planar
host so it reads as churning water; bind origin to the host/rig for
the object-locked "ball of water" look.
constructor(config?: { show?: boolean; windSpeed?: number; verticalAmplitude?: number; windDirection?: number; horizontalAmplitude?: number; timeScale?: number; smallWaveLengthCutOff?: number; tileSize?: number; textureSize?: number; affectsNormals?: boolean; projection?: OceanDisplacementProjection; origin?: SceneNode | null; fieldWeightRange?: readonly [number, number] })
Inherited from: PointConstraint, SkenraAnimatable
— see those pages for inherited members.
| Property | Type | Default | Description | Declared by |
|---|---|---|---|---|
show |
boolean |
— | Whether ocean displacement is active. | OceanDisplacementPointConstraint |
windSpeedanimatable |
number |
— | Wind speed (animatable). | OceanDisplacementPointConstraint |
verticalAmplitudeanimatable |
number |
— | Vertical amplitude (animatable). | OceanDisplacementPointConstraint |
windDirectionanimatable |
number |
— | Wind direction in degrees (animatable). | OceanDisplacementPointConstraint |
horizontalAmplitudeanimatable |
number |
— | Horizontal amplitude (animatable). | OceanDisplacementPointConstraint |
timeScaleanimatable |
number |
— | Effect-time speed factor (animatable). Scales the sampled scene time in the | OceanDisplacementPointConstraint |
smallWaveLengthCutOff |
number |
— | Small wavelength cutoff for ocean spectrum filtering. | OceanDisplacementPointConstraint |
tileSize |
number |
— | Wave-pattern tile size in world units. | OceanDisplacementPointConstraint |
textureSizeconfig-only |
number |
— | Displacement-texture resolution. | OceanDisplacementPointConstraintConfig |
affectsNormalsconfig-only |
boolean |
— | Whether the constraint kernel writes a recomputed normal to the | OceanDisplacementPointConstraintConfig |
projection |
OceanDisplacementProjection |
— | Projection mode. See OceanDisplacementProjection. |
OceanDisplacementPointConstraint |
originanimatable |
SceneNode | null |
— | Optional SceneNode whose world matrix defines the ocean frame. |
OceanDisplacementPointConstraint |
fieldWeightRangeanimatable |
readonly [number, number] |
— | The [lo, hi] range the normalized field weight maps onto. |
PointConstraint |
| Property | Type | Default | Description | Declared by |
|---|---|---|---|---|
targetread-only |
ConstrainablePointsHost | null |
— | The target host this modifier applies to, or null before |
PointConstraint |
fieldread-only |
Field | null |
— | The field used by this point constraint, if any. | PointConstraint |
sceneread-only |
any |
— | Gets the Scene this animatable belongs to, if any. | SkenraAnimatable |
animationsread-only |
SkenraAnimation[] |
— | Public getter for the animations affecting this target. | SkenraAnimatable |
| Method | Description | Declared by |
|---|---|---|
getPresetDefaults(preset: OceanDisplacementPreset): OceanDisplacementPointConstraintConfig |
Returns default ocean-displacement parameters for a named preset. | OceanDisplacementPointConstraint |
animate(firstArg: TypedKeyframe<this>[] | TypedPropertyIndexedKeyframes<this> | Record<string, any> | globalThis.Keyframe[] | globalThis.PropertyIndexedKeyframes | null, secondArg?: number | KeyframeAnimationOptions | globalThis.KeyframeAnimationOptions): SkenraAnimation & Animation |
Creates a new SkenraAnimation for this target per Web Animations API. | SkenraAnimatable |
removeAnimation(animation: SkenraAnimation): boolean |
Removes a specific animation from this object. | SkenraAnimatable |
constrain(type: K, config: ConstraintConfigMap[K]): ConstraintReturnMap[K] |
Creates a constraint on this Animatable using a fluent API. | SkenraAnimatable |
const ocean = new Plane({ id: 'ocean', width: 200, height: 200, widthSegments: 256, heightSegments: 256 });
const wave = new OceanDisplacementPointConstraint({ windSpeed: 35 });
ocean.addPointConstraint(wave);