// undine docs
Meshing
Meshing is the process of converting simulated particles into a renderable surface mesh.
Undine includes a dedicated Meshify pipeline designed to generate smooth fluid surfaces suitable for rendering.
Relationship Between Particles and Surface
The simulated fluid in Undine is represented internally as a collection of particles.
These particles store the physical state of the fluid, including properties such as position, velocity, and other solver-specific quantities.
Particles themselves are not directly renderable as a fluid surface. To produce a visual liquid surface suitable for rendering, particle data must be converted into a mesh representation.
Surface Reconstruction
This process is known as surface reconstruction or meshing.
The meshing pipeline transforms the particle distribution into a continuous surface that approximates the shape of the simulated liquid.
What affects reconstruction quality
- Particle density
- Reconstruction parameters
- Smoothing techniques applied during mesh generation
Particle data is progressively transformed into a renderable fluid surface.
graph TD
Particle["Particle Data"]
Density["Density Field Construction"]
Surface["Surface Extraction"]
Process["Mesh Processing"]
Final["Final Surface Mesh"]
Particle --> Density
Density --> Surface
Surface --> Process
Process --> Final
Meshify presets and base controls
Selecting a Meshify preset fills the visible Meshify values. Live presets (live_sculpt / live_fast / live_balanced / live_high) target Streamflow's Mesh Every Frame mode and run during interactive playback. Final presets (final_production / final_hero / final_ultra) target offline runs and force the DENSITY_MC scalar route with full anisotropy.
The base controls define the density field and the extraction threshold before smoothing, filtering, or remeshing are applied.
| Control | Purpose | Practical effect |
|---|---|---|
| Preset | Loads a coherent group of Meshify settings. | Use lower presets for iteration and final presets for production output. |
| Voxel Size | Controls the voxel resolution of the reconstruction field. | Smaller values increase detail and memory cost. |
| Influence Radius | Controls how far each particle contributes to the surface field. | Larger values make smoother, fuller surfaces; smaller values preserve sharper particle detail. |
| Iso Value | Sets the threshold used to extract the surface. | Adjust when the mesh appears too inflated, too shrunken, or disconnected. |
Quality controls
Quality controls tune the shape and density of the generated mesh after the surface field is built.
| Control | Purpose | Guidance |
|---|---|---|
| Smoothing Iterations | Repeats smoothing over the extracted mesh. | Higher values reduce noise but can remove fine detail. |
| Smoothing Factor | Controls smoothing strength per iteration. | Use modest values when preserving sharp splashes or thin sheets. |
| Taubin Iterations | Applies Taubin smoothing passes. | Useful for smoothing while reducing shrinkage compared with simple smoothing. |
| Decimate Target | Controls mesh reduction target. | Lower values reduce geometry; a value near 1.0 keeps more detail. |
| Anisotropy Strength | Shapes reconstruction using directional particle information. | Increase when motion-aligned detail should be preserved. |
Pipeline and backend
The Pipeline section controls the route from simulation cache to mesh extraction. Two scalar routes exist: VDB-SDF (particlesToLevelSet → volumeToMesh, fast, isotropic) and DENSITY_MC (anisotropic kernel, covariance-matrix shape, slower but fluid-shaped).
Anisotropy only fires on DENSITY_MC. If the surface looks like marbles instead of sheets, the run was on the VDB route — pick a final preset (final_hero / final_ultra) which forces DENSITY_MC, or set the route explicitly.
| Control | Purpose | Notes |
|---|---|---|
| Scalar Route | Chooses the scalar field build route, such as VDB SDF -> VolumeToMesh. | Defines the high-level surface extraction path. |
| Extractor | Chooses the mesh extraction algorithm. | Dual Contouring can preserve sharper structural detail than some smoother extractors. |
| Adaptive Octree | Enables adaptive spatial refinement. | Useful for reducing work in empty or simple regions. |
| Leaf Size | Controls the smallest octree block size. | Lower values allow finer adaptation. |
| Max Depth | Caps octree depth. | Higher depth can increase detail and cost. |
| Backend Policy | Chooses backend behavior. | Strict GPU requires the GPU path instead of silently choosing a broad fallback. |
| Auto Async | Allows asynchronous mesh work. | Keeps long mesh operations from blocking more than necessary. |
| Force Smooth CUDA | Forces a smoother CUDA path where available. | Use when the GPU backend is producing the preferred result for the current setup. |
Temporal stabilization and density filtering
Temporal controls reduce flicker across frames by aligning or blending the reconstruction field over time.
Density Field Filter applies additional smoothing to the density field before extraction.
| Control | Purpose | When to adjust |
|---|---|---|
| Temporal Grid Snap | Aligns the reconstruction grid across frames. | Use to reduce frame-to-frame shimmer. |
| Temporal SDF Blend | Blends signed-distance field history. | Higher values can stabilize surfaces but may smooth fast-changing details. |
| Density Filter Passes | Number of density filter passes. | Increase when the surface is noisy. |
| Density Filter Strength | Strength of density filtering. | Increase gradually to avoid over-softening the mesh. |
Smoothing, VDB, and SDF filtering
Expert overrides expose the detailed stages used to build and clean the surface field.
These settings are most useful after a good preset has already produced a nearly acceptable mesh.
| Group | Visible controls | Purpose |
|---|---|---|
| Smoothing / Taubin | Mode, Taubin Iterations, Taubin Lambda, Taubin Mu, Lock Boundary | Controls advanced mesh smoothing and boundary preservation. |
| VDB Scene | SDF Build, Half Width, Particle Radius Scale, Trail dt Scale | Controls how particles and trails contribute to the VDB signed-distance field. |
| SDF Filtering / Morphology | Filter, Filter Iterations, Filter Width, Postprocess, Offset, Open, Close, Renormalize | Filters, offsets, opens, closes, and renormalizes the field before or after extraction. |
Remesh and anisotropy
Remesh controls can regularize the mesh, while anisotropy controls use directional information to make the surface follow the motion and local particle shape more closely.
Anisotropy backends: COVARIANCE_MATRIX (rank-1 + neighbor covariance, the most accurate) and AUTO (covariance with velocity-CPU fallback when neighborhood build fails). Strength controls how strongly per-particle ellipsoids elongate along velocity — small values (0.5–1.0) keep splashes natural, larger values (1.2+) emphasize jet shape.
| Group | Visible controls | Purpose |
|---|---|---|
| Remesh / Feature Locking | Remesh Iterations, Target Edge Scale, Relax Factor, Flip Edges, Lock Features, Feature Angle | Improves mesh element quality while preserving important features when locking is active. |
| Anisotropy Shape | Shape Smoothing, Shape Tau | Smooths directional shape information over time. |
| Adaptive Radius | Adaptive Radius, Radius Scale, Radius Min, Radius Max | Changes reconstruction radius based on local behavior while keeping it inside a controlled range. |
| Legacy Density Anisotropy Detail | Backend, TD Velocity Smoothing, Tau, Speed Epsilon, History TTL, GC Period | Legacy or compatibility controls for anisotropy history and cleanup. |
Meshify actions and cache state
The Debug / Diagnostics area shows Meshify cache status and exposes Create Fluid Mesh.
The cache readout can report how many frames are available and how many are missing. Missing frames explain fallbacks or incomplete mesh output.
| Readout or control | Meaning | Use |
|---|---|---|
| Meshify cache | Reports cached frame count and missing frames. | Check before expecting a complete mesh sequence. |
| Create Fluid Mesh | Starts mesh creation from the current cache and Meshify settings. | Use after simulation frames exist and presets are configured. |
| Done: frames / fallback | Reports completion status and whether fallback behavior was used. | Use as a signal to inspect backend policy, missing frames, and mesh settings. |
Motion blur with no extra steps
Every time Meshify exports the fluid to Alembic, it automatically writes the per-vertex .velocities attribute — a velocity vector consistent with the solver, not an approximation derived by the renderer.
Cycles, EEVEE, Karma, RenderMan, or any renderer that respects the Alembic standard reads it as native motion blur input. No need to export separate caches, cook auxiliary passes, or wire a Geometry Nodes Vector Attribute setup.
The production flow collapses to: mesh it, open the renderer, enable Motion Blur. The blur is already physically aligned with the simulation you cached.
How to enable it
- Run MESHIFY SIMULATION with the preset of your choice — Alembic is the default export.
- In the render properties, enable Motion Blur (Render Properties → Motion Blur).
- If your renderer expects a non-standard attribute name (rare), point it at velocities.
Why it matters
Motion blur derived from transforms or from frame-to-frame deltas introduces artifacts on geometry that changes topology every frame — which is exactly what a fluid mesh does.
Per-vertex .velocities solves that: every vertex of the mesh carries its own Lagrangian velocity, taken from the solver's field. The blur the renderer produces is the blur the actual fluid would have.
Meshing in context
Surface reconstruction is one of the pipeline's endpoints, but it's not an isolated step: mesh quality depends on the simulation feeding it, and in turn shapes whatever renderer consumes it.