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… |