Skip to main content
Version: 3.4 (unreleased)

Implicit Surfaces from a 3D Potential Field

Surface gridding interpolates a height — a surface of the form z = f(x, y) in a tilted frame. That is the right tool for most horizons, but it has one limit that no amount of tuning removes: a map position has exactly one elevation, so a surface that doubles back over itself cannot be written down at all.

Implicit surface modelling removes that limit. Instead of interpolating a height, VRGS interpolates a scalar potential through 3D space and draws the surface where that potential takes a chosen value. A level set of a 3D field has no preferred axis, so an overturned limb is simply another part of the same surface.

Use it when the geology folds back on itself:

  • Overturned folds — the same horizon appears twice, one above the other.
  • Recumbent folds — a fold closure that a height field would flatten.
  • Vertical and beyond-vertical beds — no tilted frame to set up.

For an upright, single-valued horizon the gridded surface is usually the better choice: it is faster, has fewer controls, and reports its uncertainty in metres.

Quick start

In the Interpretation Tree, Ctrl-select a polyline group and a structural measurement group, then right-click the polyline group and choose Convert to Implicit Surface (3D). A mesh named Implicit Surface appears in the project tree.

Ctrl-select several polyline groups — one per horizon — and the same command builds a conformable stack: one surface per group, all modelled together.

Conformable stacks: several horizons, one field

Select more than one polyline group and each becomes a horizon of the same model: every group gets its own mesh, but all of them are level sets of one shared potential field. That sharing is the point — the horizons inherit each other's shape, so a fold measured on one horizon folds every horizon, thinly sampled units borrow their geometry from well-sampled neighbours, and no two surfaces of the stack can ever cross. Dip measurements apply to the whole stack, so measurements beside any one horizon shape all of them.

Because the stack is conformable by construction, this is the right tool for a stratigraphic succession and the wrong one for an unconformity or an intrusion — surfaces that genuinely truncate one another need separate fields, so build those as separate implicit surfaces.

Each surface of a stack lists its companions as Co-Horizons in the Properties panel, keeps its own colour, attributes and DFN binding, and rebuilds automatically when any horizon of the stack is edited — the shared field means a change to one horizon legitimately moves the others. Deleting one mesh of the stack leaves the rest intact; deleting a horizon's polyline group drops that horizon from the field on the next rebuild, with a warning in the log.

Dip measurements are required

Unlike gridding, orientations are not optional here — the command refuses to run without them.

The reason is worth understanding, because it explains the whole method. Digitised contacts do not tell VRGS what the potential is anywhere; they only say that every point on one contact shares the same value. A completely flat, featureless field satisfies that perfectly well. It is the dip measurements that give the field a direction and a scale, and so give the surface its shape.

One measurement is enough to produce a surface, though a fold needs enough readings to trace the shape round the hinge.

If a horizon was digitised with no measurements beside it, you can still supply one by hand: Copy Orientation from any structural measurement, then use Surface Generator → Paste Orientation on the mesh. The pasted dip is applied at the centre of the contact data.

Which way is up: pole polarity

This is the one part of implicit modelling that needs judgement, and it is worth reading before trusting a folded surface.

A structural measurement records a dip and a dip direction. That notation cannot express an overturned bed — dip is conventionally 0–90°, so the normal it implies always points upwards. On an overturned limb the stratigraphic up points downwards, so the recorded measurement is the exact opposite of what the model needs. Nothing in the measurement records younging, so the information is genuinely not in the data.

VRGS therefore infers it. Auto-orient Poles (on by default) links each measurement to its neighbours and propagates polarity between them, flipping any reading that disagrees with the ones around it. This works because a surface that doubles back must pass through vertical somewhere, and that is exactly where the recorded measurement jumps by 180° while the real surface turns smoothly.

It is an inference, not a fact, so the Properties panel reports how much to trust it:

Reported valueWhat it means
Poles FlippedHow many measurements were treated as overturned. On an upright structure this should be 0.
Worst Polarity AngleThe largest disagreement left between neighbouring measurements, in degrees. Approaching 90° means the polarity was close to a coin toss.
Widest Polarity GapHow far the polarity had to be carried across bare ground, as a multiple of the typical station spacing. A large value means it crossed a stretch nobody measured.

Both warnings also appear in the message log.

Sparse measurements are genuinely ambiguous

A steeply folded syncline sampled only on its two limbs looks identical to an overturned fold. If the surface comes out inside out, untick Auto-orient Poles to use the measurements exactly as recorded, or tick Invert All Poles to flip the whole field. Measuring through the hinge is the real fix.

The generated mesh

The surface behaves like a gridded one: it stays linked to its source groups, regenerates automatically when they change, and is saved with the project. Right-click it for the Surface Generator submenu (Regenerate, Paste Orientation).

Because the field is sampled on a 3D voxel grid rather than a 2D lattice, rebuilds cost noticeably more than gridding does — seconds rather than an instant, and the application is busy while it works. Raise Voxel Budget only when you need the extra detail — and untick Auto Rebuild in the surface's properties while editing the source interpretation, so each digitised vertex does not cost a full re-solve. The edits are remembered, and one rebuild catches up when it is re-ticked (or on Regenerate).

Properties

Select the mesh and edit its parameters in the Properties panel.

Field

PropertyMeaning
Biharmonic KernelThe extrapolating kernel. With it off (the default), a measurement's influence stops dead at one Range and beyond the data the surface relaxes back to the fitted regional trend — a dipping surface visibly flattens, or flares back up, at the edges. With it on, dips carry outward indefinitely and the edges keep dipping. Evaluation is somewhat slower, and Range has no effect on the shape.
RangeCorrelation range in metres — how far a measurement's influence reaches with the standard (cubic) kernel; influence stops entirely beyond it, so larger extrapolates further. Derived from the data diagonal on the first build, then yours to change. Ignored by the Biharmonic Kernel.
NuggetSlack on the contact points, as a fraction of the field variance. 0 puts the surface exactly through the digitised points; raise it to smooth through digitising noise.
Orientation NuggetSlack on the dip measurements (default 0.01). Compass readings are good to a few degrees, so honouring them exactly over-fits. Raise it if the surface undulates between stations.
Drift Degree1 for a planar regional trend, 2 for a curved one. Reduced automatically if the data cannot support the higher degree.
Point SpacingDigitised vertices closer together than this are merged before solving. Raise it if the solve is refused as too large.

Sampling

PropertyMeaning
Voxel BudgetHow many voxels the field is sampled on (default 2,000,000, about 128³). Detail improves with the cube root of this — and so does the wait.
PaddingHow far the sampled box extends beyond the data, as a fraction of its longest side. Gives the surface room to curve past the outermost measurement.
Max Distance From DataTrim surface further than this from any control point. 0 keeps the whole sheet, which extends to the edge of the sampled box; a negative value re-derives the distance on the next build (the default for new surfaces, so the pure-extrapolation apron is trimmed automatically). Surfaces from older projects reload untrimmed.
Voxel Size, TrianglesReported from the last build; not editable.

Fit

PropertyMeaning
Contact PointsHow many contact points were used, after merging by Point Spacing — across every horizon of a stack.
Co-HorizonsThe other horizons solved into this surface's shared field (only shown for a conformable stack).
Surface MisfitHow far the surfaces miss the stack's contact points, in metres (median). Zero unless a Nugget was set.

How it works

Contact points enter the system as statements that two points share a potential, not as values — which is what lets the method work without knowing what the potential "is". Dip measurements enter as gradient constraints on the field, using the same cubic covariance model as dip-constrained gridding, extended to three dimensions. A linear (or quadratic) drift lets the surface follow and extrapolate a regional trend rather than flattening away from the data.

The cubic covariance has compact support: beyond one Range of the data the field is exactly the drift, so the surface there is the fitted trend and nothing else. The Biharmonic Kernel swaps in a globally supported covariance (the kind used by dedicated implicit-modelling packages), whose gradient influence never dies out — that is why it extrapolates dips instead of relaxing to the trend, and why it costs more to evaluate.

The solved field is then sampled over a 3D voxel grid and the surface extracted where the potential equals its value on the contact. Surface normals come from the field's own gradient rather than from the triangles, so shading stays smooth however coarse the sampling.

Using an implicit surface with a DFN

An implicit surface can be attached to a DFN as an upper limit, a lower limit or an internal barrier, exactly as a gridded one can. That is how bed-confined (stratabound) fracturing is modelled: model the top and base of the bed, attach both, and fracture height follows bed thickness.

The Model Surfaces section of the DFN guide is the authority on how each kind of surface is handled and which are accepted — read it before attaching a folded surface. A surface the DFN cannot use is refused with a message explaining why, rather than silently approximated: a mis-signed bed boundary would put fractures on the wrong side of a contact with nothing downstream revealing the error.

Tips

  • "An implicit surface needs at least one orientation measurement" — the polyline group was selected without a measurement group. Ctrl-select both, or paste an orientation onto an existing surface.
  • The surface is inside out — polarity. Tick Invert All Poles, or check Poles Flipped and Widest Polarity Gap to see how confident the inference was.
  • The fold closure is squared off or lumpy — raise Voxel Budget. The surface can only be as sharp as the grid it was sampled on.
  • The surface flattens or flares back up at the edges of the data — the cubic kernel handing over to the regional trend. Tick Biharmonic Kernel so the dips carry outward, or raise Range so the data stays in control further out.
  • The surface extends far past the outcrop — lower Max Distance From Data (new surfaces trim automatically; set 0 to keep the whole sheet). The field extrapolates its trend indefinitely by design, which is useful for projecting and unhelpful for a figure.
  • The surface bulges between measurements — raise Orientation Nugget, and check for a reading whose polarity was flipped when it should not have been.
  • Rebuilds are slow — lower Voxel Budget, or raise Point Spacing so fewer contact points enter the solve.
  • "Too many constraints for a dense solve" — raise Point Spacing. Densely digitised lines carry far more vertices than the surface shape needs.