Seismic Modelling from Meshes
VRGS can turn a classified triangulated mesh into a synthetic seismic section. Where two facies meet across the mesh, that contact reflects energy; VRGS sums those reflections into seismic traces using a band-limited Kirchhoff diffraction stack and displays the result as a vertical panel hung along the acquisition line. Given a regional dip, the line is shot along the dip direction and the dip is flattened out, so dipping beds image as horizontal bands. The contributing facies and impedance can be overlaid on the same panel.
This is useful for tying outcrop interpretation to seismic, for testing how a geological contact would appear under a given acquisition geometry, and for building intuition about which contacts image well and which only diffract.
A new Seismic Section object in the project tree, rendered as a textured panel above the mesh. It is saved with the project and has its own display properties (clip, gain, polarity, colormap).
Prerequisites
Before you can create a model, the mesh must carry two per-vertex attribute layers:
| Attribute | Purpose | Typical name |
|---|---|---|
| Facies / class | Identifies which facies each vertex belongs to. Contacts are detected where this value differs across a facet. | Facies |
| Impedance | Acoustic impedance (density × velocity) per vertex. Drives the reflection strength. | Impedance |
The facies layer is normally produced by classifying or painting the mesh (for example with ANN Classify or the facies-painting tools). The seismic step reads whichever attribute layers you point it at — it does not classify for you.
Right-click the mesh and choose Add Test Facies + Impedance… to generate synthetic
Facies and Impedance layers split into elevation bands. The contacts then fall on
horizontal boundaries — a quick way to see the section (and the dipping/orthographic
projection) working before classifying real geology.
If a layer named Facies or Impedance exists, VRGS pre-selects it in the
dialog; otherwise pick the correct layers yourself.
Creating a model
- In the Project Data tree, select the triangulated mesh and make sure it is loaded into memory.
- Right-click the mesh and choose Create Seismic….
- Set the parameters in the dialog (see reference).
- Click OK. The model runs on a background worker; a new Seismic Section node appears under the seismic group and fills in when the computation finishes.
The defaults shoot a dense zero-offset line above the cliff with a 30 Hz Ricker wavelet. Run once, look at the panel, then adjust frequency, velocity, and geometry from there.
How it works
Understanding the method makes the parameters meaningful.
Reflecting elements
VRGS walks every facet of the mesh. A facet is a reflector only if its three vertices do not all share one facies — i.e. it straddles a contact. Facets sitting entirely inside a single facies contribute nothing.
Each reflecting facet gets:
-
a normal-incidence reflection coefficient from the impedance jump across the contact,
where and are the mean impedances of the facies on either side of the contact (for a facet touching three facies, the contact with the largest contrast wins);
-
an area and a centroid in true 3D world coordinates.
The reflector normal (the 2D-extrusion assumption)
The reflector normal is deliberately not the cliff-face normal. It is the impedance gradient across the facet, projected into the acquisition plane. This is the explicit form of the 2D-extrusion assumption: each contact is treated as extending perpendicular to the section.
That is why a horizontal bed reflects strongly to a source directly above it, while a vertical fault is weak at zero offset but still diffracts off its tips.
If you have measured dip vectors per vertex, they can be substituted for the
computed impedance gradient (reflector_normal_from_gradient in the engine),
turning the extrusion assumption into measured geometry.
The forward sum
For every source–receiver pair and every reflecting element :
-
traveltime uses straight rays in a constant background velocity :
-
amplitude is , where and ;
-
the contribution is deposited into the trace with linear interpolation between the two nearest samples.
Each finished trace is convolved once with the chosen wavelet (Ricker or Klauder). The default acquisition is a zero-offset line above the cliff, but the geometry is general — fixed offsets or custom trajectories are supported.
Facies and impedance overlays
As it sums the reflections, VRGS also records which contact produced each event — the facies and impedance on the high-impedance side — and exposes them as two overlays on the same panel (see Working with the result).
These overlays are projected geometrically onto the section, not along the diffraction traveltime used for the amplitude. Each contact is placed at its true depth on the trace nearest it, and where geology lies off the section the element closest to it wins. The practical consequences:
- a horizontal contact images as a horizontal band, not an arch;
- with a regional dip set (Dip > 0°) the dip is flattened out: each contact is shifted by its own dip ramp, so dipping bed-parallel contacts collapse to thin horizontal bands instead of dipping reflectors.
At zero offset the amplitude event for a contact lands on the same sample as its overlay on-axis, so the colour and the wiggle stay aligned (approximately so for off-plane or strongly-dipping geometry).
Parameter reference
Wavelet
| Parameter | Default | Notes |
|---|---|---|
| Ricker / Klauder | Ricker | Choose the wavelet by clicking its icon. |
| Frequency (Hz) | 30 | Ricker peak frequency. Higher = sharper, thinner reflections. |
| Klauder F1 / F2 (Hz) | 8 / 80 | Sweep low/high frequencies (Klauder only). |
| Klauder sweep length (s) | 8 | Sweep duration (Klauder only). |
Modelling
| Parameter | Default | Valid range | Notes |
|---|---|---|---|
| V0 — background velocity | 2500 | 1 – 100 000 | m/s (or world units/s) for straight-ray traveltimes. |
| dt — sample interval | 0.002 | 1e-6 – 10 | Seconds for a time axis; world units for a depth axis. |
| Number of samples | 1000 | 1 – 1 000 000 | Trace length. Record length ≈ (samples − 1) × dt (≈ 2 s by default). |
| Axis | Time | Time / Depth | Time uses ; Depth uses the half-distance. |
Acquisition geometry
The line is auto-centred on the mesh footprint; you override the details here.
| Parameter | Default | Notes |
|---|---|---|
| Strike (°) | 90 | Bedding strike of the target layering. 0 = North, increasing clockwise. The acquisition line is shot perpendicular to the strike — along the dip direction — making this a dip section: strike 0 runs the line East (+X); strike 90 runs it North–South (Y). |
| Dip (°) | 0 | The regional/bedding dip to flatten. 0 = a plain vertical section. With a dip set, the line is shot along the dip direction and the dip is removed, so dipping beds image as horizontal bands. Use the bedding/structural dip (typically shallow). |
| Get… | — | Pick a nearby orientation measurement (the regional dip) to fill Strike and Dip from it. The measurements are listed nearest-first to the mesh; choosing one shoots the line perpendicular to that strike (along the dip) and flattens the dip. |
| Height above top | 100 | Stations sit this far above the top of the mesh. |
| Station spacing | 5 | Distance between stations (world units). |
| Number of stations | 200 | One trace per station. |
| Offset mode | Zero offset | Zero offset co-locates source and receiver; Fixed offset separates them. |
| Offset distance | 0 | Source–receiver separation along the line when using fixed offset. |
Leave Dip at 0 for a conventional vertical section. To flatten a regionally
dipping sequence, click Get… and pick the nearest orientation measurement (or type
a Strike and Dip): the line is shot along the dip (perpendicular to strike) and the
regional dip is removed, so dipping beds read as horizontal bands.
Attribute layers
| Parameter | Notes |
|---|---|
| Facies layer | Per-vertex facies/class used to detect contacts. |
| Impedance layer | Per-vertex acoustic impedance used for and the gradient normal. |
Working with the result
Select the Seismic Section in the tree to edit its display properties:
| Property | Effect |
|---|---|
| Clip min / max | Amplitude range mapped to the colormap. Leave both at 0 to auto-scale on first draw. |
| Gain | Amplitude multiplier. |
| Polarity flip | Negates amplitudes. |
| Opacity | Panel transparency (0–1). |
| Colormap | Diverging RWB, Grayscale, Seismic (default), or Viridis. |
The panel hangs from the acquisition line with sample 0 at the top and time
(or depth) increasing into the section (across bedding for a flattened section). For a
time axis, the vertical extent maps two-way time to depth using V0 / 2.
Amplitude, facies, and impedance layers
Each section carries three attribute layers under its tree node — Amplitude (the seismic), Facies, and Impedance. Click a layer to colour the panel by it: Amplitude uses the seismic colormaps and clip/gain/polarity above; Facies and Impedance use their own colour ramp over their value range. Each layer has a histogram and a value filter, so you can, for example, show only the reflections produced by one facies, or only impedance contrasts above a threshold — filtered and empty cells become transparent. The facies/impedance overlays are projected orthogonally onto the section plane (see above), so they read as the true geology rather than the diffraction pattern.
The section — including its trace data and display state — is saved inside the project. It reappears, correctly positioned, when the project is reopened.
Tips and troubleshooting
Create Seismic… needs the mesh resident in memory. Load it from the tree first, then retry.
- "… attribute layer not found" — the chosen Facies or Impedance layer does not exist on the mesh. Pick existing layers, or classify/add the impedance attribute first.
- The panel is blank / flat — most often there are no contacts: the mesh may be a single facies, or the impedance contrast is zero. Confirm the facies layer actually varies across the mesh and that impedance differs between facies.
- A vertical fault barely shows — expected at zero offset. It diffracts off its tips; shoot fixed offsets or a custom trajectory to image it better.
- Reflections look too thick or too thin — adjust the frequency (wavelet bandwidth) and dt (sampling).
- Performance — cost scales with (reflecting facets × stations × samples). Very dense meshes with many stations take longer; the model runs in the background so the UI stays responsive. Reduce Number of stations or decimate the mesh for a faster preview.
Related
- Mesh classification (ANN Classify, facies painting) — produces the facies layer this tool reads.
- Seismic Volume — for loading and displaying recorded SEG-Y data alongside your synthetic section.