Skip to content

Sand Pickup with FLIP and Granular

Use a FLIP wave tank to move a separate granular sand bed through a Flow Field.

FLIP waves moving a separate granular sand bed in the official Sand Pickup demo
The official Sand Pickup demo: wave motion displaces sand while water and sand keep separate particle groups.

Reference setup from the demo

Use 30 fps, frames 1–120, and Substeps 1. The dimensions, wave and material values below come from 03_flip_sand_pickup.blend. The following steps build a wave-driven pickup setup with those values. Water and Sand have separate groups and Emitters; only Sand has an emitting mesh source.

Part Settings
FLIP Domain 10 × 4 × 3 m, center (0, 0, 1.5)
Water profile Water group, Radius 0.04 m, Lifetime 1000 frames
FLIP Fluid Water group, Voxel Size 0.16 m, Prefill enabled, Level 30%, Hexagonal packing, Water Profile selected
Liquid behavior Balanced quality, FLIP Ratio 0.96, Viscosity 0, Surface Tension 0.08, Vorticity 0.18
FLIP substeps Adaptive enabled, CFL 0.8, Minimum 1, Maximum 1
Waves Enabled, Amplitude 4, Frequency 0.52, Randomize 0.16, Speed 1.3, Surface Band 3, Direction (1, 0, 0)
FLIP boundaries Closed on all six sides
Sand source Box 8.2 × 3.5 × 0.28 m, center (0, 0, 0.4)
Sand fill Volume Fill Grid, Particle Spacing 0.095 m, Jitter 0.12, Auto Particle Radius off
Sand particles Sand group, Radius 0.045 m, Lifetime 1000 frames, zero Initial Velocity and Surface Push
Granular Sand group, Dry Sand: Stiffness 0.78, Friction 0.35, Cohesion 0, Viscosity 0, Solver Iterations 6, Activation Frames 5
Seabed Collider Box 20 × 8 × 0.18 m, center Z 0.1089 m; Collision filtered to Sand, Bounciness 0, Friction 0.75
Flow Field Domain Separate object matching the FLIP Domain dimensions and position
Flow Field Sand group, Voxel Size 0.18 m, Update Every Substep, Apply As Position Offset, Strength 0.4, Max Speed 0.6
Field operation One FLIP Velocity layer, source FLIP - Water Waves, Splat Radius 0.5 m, Strength 1
Sampling Linear; Outside Domain Ignore
Water color Change Color filtered to Water, Advanced Color using Speed 0–4.5, blue-to-white ramp
Preview Water Point Cloud filtered to Water, GPU Preview Point, Particle Radius, Radius Scale 0.25
Preview Sand Separate Point Cloud filtered to Sand, GPU Preview Sphere, Particle Radius, Radius Scale 1

Use evaluation order Gravity → Collision → FLIP Fluid → Granular → Flow Field → Change Color. In Lists, Gravity is lowest and Change Color highest in the visible Effects stack. Keep Collision and Granular filtered to Sand, FLIP Fluid and Change Color to Water, Flow Field to Sand, and Gravity applied to All. FLIP supplies the water motion before Flow Field samples it.

The base setup has one FLIP Velocity field layer. Threshold and Remap Magnitude are optional additions described later. Position Offset moves sand without changing its stored velocity; choose Field Drag when the transferred motion should also change velocity.

Water, sand and the Flow Field

FLIP Fluid supplies the water motion. Flow Field samples that motion and applies it to Sand. Granular supplies contact and friction between sand grains. This transfer is one-way: the sand follows the sampled water motion; this setup does not make its movement push water back.

The sand does not become FLIP liquid. Its radius, material, group, and post-effect appearance remain independent of the water particle profile.

1. Build the tank and water profile

  1. Start a new Lists system and create named groups Water and Sand.
  2. Create a cube named FLIP Domain, Dimensions (10, 4, 3), Location (0, 0, 1.5), and apply Scale.
  3. Name the first Emitter Water Profile, assign Default Group Water, Radius 0.04 m, and Lifetime 1000 frames. Remove or disable its starter source so it does not emit independently.
  4. Add FLIP Fluid, name it FLIP - Water Waves, and set Apply to Group Water. Select FLIP Domain, enable Pre-Fill Domain, choose Water Profile, Fill Level 30%, and Hexagonal packing.
  5. Apply the liquid, Waves, boundary and adaptive-substep settings from the table. Keep Whitewater, Sheeting and Reseeding off for this example.

Prefill supplies the initial water without a source mesh. Fit the domain before increasing resolution. A smaller Voxel Size uses more GPU memory and simulation time.

2. Create an independent sand population

  1. Create Sand Bed Source, a cube with Dimensions (8.2, 3.5, 0.28), Location (0, 0, 0.4), and apply Scale.
  2. Add a Particles Emitter named Sand Bed, assign Default Group Sand, and use that object as a Volume source. Set Grid fill, Spacing 0.095 m, Jitter 0.12, and Auto Particle Radius off.
  3. Set Start Frame 1, Lifetime 1000 frames, Radius 0.045 m, zero Initial Velocity and Surface Push. Give the grains a sand-colored birth color.
  4. Create Seabed Collider, Dimensions (20, 8, 0.18), Location (0, 0, 0.1089), and apply Scale. Add Collision using that object, filtered to Sand, Bounciness 0, Friction 0.75.
  5. Add Granular filtered to Sand and choose Dry Sand with the values in the table. Keep Persistent Bonds off. Add Gravity, Force (0, 0, -9.81), applied to All.

Grid fills the sand bed once at its start frame. Gravity and Granular continue to act after the local transferred water motion weakens. Sand Radius controls grain contact; it does not need to equal the FLIP Voxel Size.

3. Create the Flow Field domain

  1. Add Flow Field.
  2. Set Apply to to Group and select Sand.
  3. Create a separate cube named Flow Field Domain, Dimensions (10, 4, 3), Location (0, 0, 1.5), and apply Scale. Assign it as the Flow Field Domain.
  4. Set Voxel Size 0.18 m, Update: Every Substep, Apply As: Position Offset, Strength 0.4, and Max Speed 0.6.
  5. Use Sampling: Linear, Outside Domain: Ignore. These settings match the illustrated setup.

A smaller Flow Field Voxel Size increases the number of field cells in all three dimensions. Fit the domain closely and refine only when the visible pickup needs more detail.

4. Reconstruct FLIP velocity

  1. Add a FLIP Velocity field layer.
  2. Select the named FLIP effect under FLIP Source.
  3. Set Splat Radius 0.5 m, layer Strength 1, Blend Mode Add, and Layer Weight 1. Splat Radius controls how far sampled water motion reaches around the water particles.
  4. Keep this as the only field layer for the first result. If you need to inspect it, enable Show Field, choose Vectors or Streamlines, and select Selected Layer Result.

If no vectors appear during playback, check that FLIP - Water Waves is enabled, water particles exist on the current frame, and the Flow Field domain covers them.

5. Display and play the pickup

Add Change Color, filtered to Water. Enable Advanced Color and add Speed, range 0–4.5, Blend Mode Normal, Target RGB, with a blue-to-white ramp. Add separate Point Cloud post effects filtered to Water and Sand, using the preview settings above.

Arrange the complete Effects stack in the stated evaluation order, then play from frame 1 through 120. Waves move across the tank and displace the sand bed. The water and sand retain separate colors and groups. Save the setup before trying the variations below.

For Blender rendering, switch both Point Clouds to Blender Geometry. The point display illustrates the two populations; a continuous liquid surface would require a Water-filtered Mesher, as described in Waves with Whitewater.

Optional: remove weak motion and shape the response

Add operations after FLIP Velocity in this order:

  1. Add Threshold and set its Threshold just above motion that should not disturb settled sand. Vectors below the selected magnitude are removed.
  2. Add Remap Magnitude when the useful liquid-speed range should produce a different sand-response range.
  3. Set Input Min and Input Max around the retained field magnitudes.
  4. Set Output Min and Output Max to the desired transferred magnitude.
  5. Inspect Final Field in the viewport and confirm that inactive water regions do not drive the sand.

Threshold and Remap are ordered operators. If Remap comes first, weak liquid motion may be enlarged before Threshold sees it. Swapping these operations changes the result.

Optional: change how sand follows the field

Under Particle Response, choose one mode:

  • Position Offset moves particles directly by the sampled field without changing stored velocity. This is the mode used by the demo.
  • Field Drag pulls sand velocity toward the FLIP field with a rate controlled by Response. Start here when sand should lag behind the water and retain its own motion.
  • Steering turns sand toward the field while limiting acceleration with Max Steering Force. Use it when direction should follow water without fully copying velocity.
  • Velocity blends directly toward field velocity with Velocity Blend. It produces tighter following and can overpower the granular character if used too strongly.
  • Force treats the field as acceleration, which can accumulate speed.

Set overall Strength, then use Max Speed as an optional safety limit. Keep Sampling: Linear for smooth interpolation unless you want to test voxel-stepped motion. Outside Domain: Ignore leaves sand under gravity and Granular after it exits the transfer region; Fade provides a gradual boundary when a hard cutoff is visible.

Balance pickup and settling

  1. Reset and simulate from the scene start.
  2. Watch the moment water first contacts the sand.
  3. If using Threshold, adjust it until weak peripheral water stops moving the bed.
  4. Adjust Flow Field Strength until moving water can lift or carry exposed grains. Response applies to Field Drag; it does not control Position Offset.
  5. Watch grains after they leave strong flow. Gravity and Granular should become dominant again.
  6. If sand follows water too exactly, reduce Velocity Blend, switch to Field Drag, lower Response, or reduce the Remap output range.
  7. If sand never moves, verify the final field visualization before increasing Strength. Lower Threshold if that optional operation is enabled.

Tune the transfer before changing the Granular preset. Granular defines the sand material; Flow Field defines how strongly water motion is communicated to it.

Nodes version

  1. Create a Volume Source for Sand Bed and a Water Profile Emitter with independent emission disabled. Merge both Emitter particle outputs with Merge Disjoint Streams.
  2. Add a Flow Field node filtered to the Sand group.
  3. Add FLIP Velocity. Add Threshold and Remap Magnitude only when the optional magnitude processing is needed.
  4. Chain their Previous connections in source-to-operation order and connect the final component to Field Operations.
  5. Select the FLIP effect in the FLIP Velocity component.
  6. Connect the complete merged stream through Gravity → Collision → FLIP Fluid → Granular → Flow Field → Change Color, using the same group filters. Feed the final stream to both Point Clouds and Simulation Output / Particles; connect both Result outputs to Simulation Output / Geometry.

Component connections set the field operation order; moving nodes does not change it.

Resolution and performance

FLIP Voxel Size, Flow Field Voxel Size, sand particle Radius, and final display size are four independent controls.

  • Finer FLIP voxels increase the liquid grid cost.
  • Finer Flow Field voxels increase transfer-grid cost.
  • Smaller sand particles increase particle count and Granular neighborhood work.
  • Display size can change appearance without fixing an incorrect physical Radius.

Choose each resolution for the feature it represents. Matching all values numerically is not required.

Troubleshooting

  • Sand moves outside the water: Inspect the final Flow Field, reduce Splat Radius, raise Threshold, or use Outside Domain Ignore.
  • The field is empty: Select an enabled FLIP effect, check that water particles are present on the current frame, and fit the Flow Field domain around them.
  • Pickup is delayed or stepped: Try Every Substep for the Flow Field, increase simulation substeps, or refine the field only if the displayed vectors lack the required temporal or spatial detail.
  • Sand never settles again: Reduce field Response/Strength, raise Threshold, or use a finite domain with Ignore/Fade outside behavior.
  • Sand loses its granular character: Avoid a full Velocity Blend. Use Field Drag or Steering so Granular and gravity retain influence.
  • Performance is poor: Tighten both domains, increase Flow Field Voxel Size, reduce Splat Radius if it is broader than necessary, and review sand count and Granular iterations separately.

See FLIP Fluid, Granular, and Flow Field for their complete controls.