Skip to main content
← Roadmap
🌊 Oceanology ProIn Progress6.0.0

Included in Oceanology Pro and Oceanology Lite.

Physics-accurate buoyancy for any object

Crates, debris and vehicles float according to their actual shape with no pontoons to author. Boats still get the pontoon system, now with an in-viewport editor for placing them by dragging.


In Oceanology Pro, buoyancy moved off the game thread and off the per-actor component. The OceanologyBuoyancyRuntime module registers a Chaos sim callback on the solver, and from then on any simulated rigid body that touches a water body gets Archimedes forces computed from its actual collision geometry. There is no component to add, no pontoons to place and no per-object density dial: the object's effective volume comes from its physical material density and its mass, so a wooden crate floats and a steel one sinks because of what they are made of.

What the solver actually computes

For each interaction the solver walks the rigid body's shapes and clips them against the water surface. Boxes and convex hulls are handled directly: it tests every vertex against the plane, intersects the crossing edges, sorts the resulting intersection points by angle to close the cut face, and accumulates the submerged volume and the submerged centre of mass from the resulting tetrahedra. Buoyancy is then applied at that submerged centre of mass, which is what produces torque - a barge rights itself, a long log rolls, a half-flooded crate tips. On top of that, each submerged triangle gets a fluid force built from the relative velocity between the water and that point of the body, giving drag and an optional lift term for angled surfaces, so a rudder or a planing hull behaves like one. Large bodies are subdivided into eighths before the clip so a big collision shape is not treated as one uniform slab.

Waves on the physics thread

The game thread pushes a wall-clock water time into the sim callback every tick, and each water body's spline snapshot carries an immutable, UObject-free wave physics snapshot captured on the game thread. That lets the physics thread evaluate the primary and breaking wave displacement at each query position without touching a UObject, so a floating object rides the same animated surface that is rendered rather than a flat spline plane. Ocean bodies can additionally carry shoreline hole polygons snapshotted in world XY, so a land query inside a carved shoreline is rejected on the physics thread with no actor transforms to reconcile.

Rivers, lakes and oceans behave differently on purpose

Each registered body hands down its transform, its centre spline, its body type and optionally its width and velocity curves. Only rivers apply a directional flow along the spline. Oceans and lakes deliberately leave that channel at zero, because a non-zero spline velocity on an open body drags every submerged object sideways across the whole surface. Spline evaluation is the expensive part, so computed spline keys are cached in a world grid. Where a baked shallow-water simulation covers the area, a dedicated sampler reads height, velocity, depth and surface normal from it instead, and a query that lands outside the baked coverage returns zero depth rather than water.

Events you can build gameplay on

  • Implement IOceanologyBuoyancyEventInterface on the floating actor, in C++ or as Blueprint events.
  • OnSurfaceTouchBegin fires when a part of a body first meets a water surface, OnSurfaceTouching while contact continues, OnSurfaceTouchEnd when it loses contact with every surface.
  • Each callback carries the water actor, the water component, the submerged component, the submerged volume, the submerged centre of mass and the submerged velocity - enough to size a splash, place it and pick a sound.
  • A minimum relative velocity filters out constant re-firing while an object simply bobs.
  • In a cooked build callbacks are generated on clients only, since they exist for cosmetics; the editor always generates them.

The pontoon component is still there

Vehicles and boats often want authored float points rather than emergent geometry, so UOceanologyBuoyancyComponent and its spherical pontoons remain, together with a full river behaviour block: downstream push, lateral shore push with a traversal path width, optional downstream alignment torque with its own stiffness and damping, and linear and angular drag. The editor gives that array a proper UI - add, duplicate, remove, one group per pontoon - plus a viewport pivot editor that draws each pontoon as a wire sphere you can click and drag, with socket-driven pontoons positioned by the mesh.

Versus Oceanology NextGen

Oceanology NextGenOceanology Pro
Where it runsGame-thread component tick, one per floating actorChaos physics-thread sim callback covering the whole world
Object shapeAuthored pontoons, or a normalised voxel grid capped at 64 voxelsThe object's real collision geometry, boxes and convex hulls, clipped against the water surface
Setup per objectAdd a component, place pontoons or set voxel size, then tune body density, drag, heave damping and added massSimulate physics. Density comes from the physical material, volume from mass and density
Tuning surfaceDozens of per-component properties on every floating actorProject-wide water properties, with the pontoon component still available where authored float points are wanted
Force modelVertical displacement force plus per-voxel dragSubmerged-volume buoyancy applied at the submerged centre of mass, plus per-triangle drag and optional lift
ModuleOceanologyBuoyancyRuntime, runtime, loads at PostConfigInit
Where it runsChaos physics thread, as a solver sim callback
Settings locationProject Settings, Plugins, Oceanology Buoyancy Runtime
Water density1 g/cm3
Water drag / water lift1.0 / 0.0 (0 = no lift, 1 = standard lift)
Shape supportBoxes and convex hulls, clipped per shape
Bounds subdivisionUp to 2 levels, minimum subdivision volume 125 cm cubed
Per-step clamps500 cm/s linear, 5 rad/s angular
Surface touch callbacksBegin and End by default, minimum 100 cm/s relative velocity
Spline key cacheEnabled, 300 cm grid, 256 cells per body
Water body typesRiver, Lake, Ocean and Custom
Console variablesp.Oceanology.Buoyancy.DebugDraw, .UseImplicitDrag, .bUseShallowWaterSimulation, .bUseAccurateIntegrationForSplines
Pontoon pathUOceanologyBuoyancyComponent with spherical pontoons, details panel and pivot visualizer

This is one entry on the Galidar roadmap. For what already shipped in each release, see the Changelog.