Skip to content

Documentation / scene / BuoyancyVolume

Class: BuoyancyVolume ​

Defined in: libs/scene/src/utility/buoyancy.ts:90

The buoyancy a box-shaped hull gets from a water surface, as a force and a torque, independent of what integrates them.

Pair it with FloatingBody for a self-contained float, or feed the force and torque to a rigid body in whatever physics library the application uses.

The model ​

The hull is filled with a lattice of probes, each a block of hull carrying an equal share of the lift the whole hull can produce, scaled by how much of the block is under water. Summed, that is the buoyancy of whatever part of the hull is submerged, acting at that part's centroid - which is the centre of buoyancy, and the thing a righting moment is made of: the water pushes up hardest on whichever side has more of its blocks under, which rolls a boat back upright. There is no separate upright target.

The lattice fills the box rather than sitting on the bottom face. Probes on the bottom alone are exact for a level hull and wrong the moment it rolls: the columns rise vertically through where the side wall used to be, and the net moment pushes the roll further over instead of back.

The lift a fully submerged hull produces is mass * g / submergedFraction: the force that, once the configured share of the probes is under, balances the weight. That makes submergedFraction the density ratio and the only thing that sets the float height, and it makes the mass drop out of the buoyant motion altogether - lift and inertia both scale with it. Tying lift to mass rather than to geometry also means a heavy body cannot sink past its deck, where the waterplane and the righting moment would vanish.

What is not modelled ​

No hull-volume integral, no added mass, no drag. A probe's contribution grows linearly with depth up to its own height, which is accurate while a vessel rides on its waterline and approximate for a fully submerged one.

Constructors ​

Constructor ​

new BuoyancyVolume(options): BuoyancyVolume

Defined in: libs/scene/src/utility/buoyancy.ts:115

Creates a buoyancy volume.

Parameters ​

options ​

BuoyancyVolumeOptions

Returns ​

BuoyancyVolume

Properties ​

size ​

readonly size: Vector3

Defined in: libs/scene/src/utility/buoyancy.ts:92

Full extents in metres, in local axes.


mass ​

readonly mass: number

Defined in: libs/scene/src/utility/buoyancy.ts:94

Mass in kilograms.


submergedFraction ​

readonly submergedFraction: number

Defined in: libs/scene/src/utility/buoyancy.ts:96

Share of the height under water at rest.


gravity ​

readonly gravity: number

Defined in: libs/scene/src/utility/buoyancy.ts:98

Gravity in metres per second squared.


maxBuoyancy ​

readonly maxBuoyancy: number

Defined in: libs/scene/src/utility/buoyancy.ts:100

Lift of the fully submerged hull, in newtons.


draft ​

readonly draft: number

Defined in: libs/scene/src/utility/buoyancy.ts:102

Height of the waterline above the bottom face at rest, in metres.


restHeight ​

readonly restHeight: number

Defined in: libs/scene/src/utility/buoyancy.ts:104

Height of the hull's centre above the still-water level at rest, in metres.


probes ​

readonly probes: Vector3[]

Defined in: libs/scene/src/utility/buoyancy.ts:106

Probe centres in local space.


probeHeight ​

readonly probeHeight: number

Defined in: libs/scene/src/utility/buoyancy.ts:108

Height of one probe's block, in metres.

Methods ​

restY() ​

restY(waterLevel): number

Defined in: libs/scene/src/utility/buoyancy.ts:148

World Y the hull's centre rests at on a still surface at waterLevel.

Parameters ​

waterLevel ​

number

Returns ​

number


computeForces() ​

computeForces(position, rotation, waveHeight, waterLevel, outForce, outTorque): number

Defined in: libs/scene/src/utility/buoyancy.ts:164

Buoyant force and torque on the hull at a pose, in world space, about the hull's centre. Gravity is not included.

Parameters ​

position ​

Vector3

World position of the hull's centre.

rotation ​

Quaternion

World orientation of the hull.

waveHeight ​

WaveHeightFn

Surface height above waterLevel at a world XZ.

waterLevel ​

number

World Y of the still-water level.

outForce ​

Vector3

Receives the force in newtons.

outTorque ​

Vector3

Receives the torque in newton-metres.

Returns ​

number

How much of the hull is under water, 0 to 1. Useful for blending drag between air and water.

Released under the MIT License.