Spline rivers with flow physics
Draw a spline, set width, depth and velocity at each point, and the current becomes something gameplay can actually feel.
Included in Oceanology Pro and Riverology 3.
A river in Riverology is a spline. You place points, and the water between them is interpolated from values you set on each point. That authoring model is the same in Riverology 2 and in the Pro core Riverology 3 inherits, but the core carries a richer per-point channel set and, more importantly, it carries velocity as authored data rather than as one global speed dial for the whole river.
What you author per point
In the core, each spline point carries its own depth, river width, water velocity and audio intensity, stored as interpolated curves along the spline. Inserting a point between two existing ones lerps the metadata rather than resetting it, so refining a curve does not destroy the profile you already tuned. Each channel has its own in-viewport visualiser you can toggle independently, so you can inspect width without velocity arrows drawn over the top of it.
- Depth: how deep the channel is at this point. Feeds the water info texture, wave attenuation in shallow water, and buoyancy.
- River width: the width of the channel here. Drives the generated surface — the river component builds one spline mesh per spline point and evaluates width per key along it.
- Water velocity: a current magnitude at this point, combined with the spline direction to produce a flow vector.
- Audio intensity: a scalar so rapids can be loud and pools quiet without splitting one river into several actors.
What the current does to gameplay
Flow is not decoration. Buoyant objects in the core have a dedicated river behaviour block that reads water velocity and turns it into force, and every part of it is tunable per object.
- A downstream push scaled by a velocity strength coefficient and clamped by a maximum water force, so a fast river does not launch light debris.
- A lateral shore push that nudges objects toward the bank, or, with a negative factor, back toward the centre so nothing piles up on the edges. It operates inside a traversal path width you define.
- Optional torque that aligns an object with the downstream direction, driven as a spring with configurable stiffness, damping and a per-update torque ceiling. That is what stops a log from riding a rapid sideways.
- Switches for the awkward cases: always allow lateral push regardless of forward speed, and allow the current to keep acting on something moving fast upstream. Turn the second off for player-controlled boats so the player keeps authority.
- A selectable pontoon index for sampling the water, so a long hull is not steered from the wrong end.
How velocity reaches everything else
Velocity is not queried object by object at runtime. The water zone renders a water info texture across the region, packing flow magnitude and direction, with magnitude normalised against a global ceiling exposed as a console variable. Materials, buoyancy and Niagara all read that one source, and a blur pass smooths the velocity field before anything consumes it. On the Niagara side, the water data interface returns water velocity together with surface position, water depth, plane normal and wave height at any point, which is what lets foam, spray and floating debris follow the current without bespoke plumbing per effect.
Flow authoring: Riverology 2 against the core
| Feature | Riverology 2 | Oceanology Pro core |
|---|---|---|
| Width per point | Taken from the spline point's scale | An explicit river width channel with its own visualiser |
| Depth per point | Taken from the spline point's scale | An explicit depth channel, default 150 |
| Velocity per point | No per-point channel; flow follows the spline direction with globally tuned speed parameters | A per-point velocity scalar, default 128 |
| Surface geometry | Spline meshes generated at a fixed segment length you set | One spline mesh per spline point, width evaluated per key |
| Audio along the river | Audio cue assets with no per-point intensity channel | A per-point audio intensity channel on the spline |
| Buoyancy tuning | Automatic downstream force; tuning limited to the object's own physics settings | A river behaviour block with push, shore push, alignment torque and upstream rules |
Defaults and limits
| Default depth per spline point | 150 units |
|---|---|
| Default river width per spline point | 2048 units |
| Default water velocity per spline point | 128 units per second |
| Default audio intensity per spline point | 1.0 |
| Maximum velocity encoded in the water info texture | 1024 units per second, adjustable by console variable |
| Velocity blur radius in the water info pass | 1 by default, range 0 to 16 |
| River traversal path width, buoyancy | 300 units |
| Maximum river push force, buoyancy | 10000, with shore push capped at 300 |
| Downstream alignment defaults | Strength 0.05, stiffness 20, damping 5, maximum acceleration 10 |
| Riverology 2 debug tools | Unscaled spline width 75, plus spline width, per-point string and surface entry/exit debug draws |