Mesh Dimensionality Report
An outcrop model is a surface, so up close it is always two-dimensional, but as a whole it sits somewhere between a flat wall and a closed body. A cliff face is a wall; a gorge, a ridge or a quarry wraps round; a scanned boulder or a hand sample encloses a volume. No single number captures that, so the Dimensionality Report measures a mesh in four different ways, gives a verdict on top, and reports an effective dimension between 2 and 3 for comparing one model with another.
It answers questions such as: can this model be gridded as a height field, or draped on a DEM, without losing surface? Is it one face or does it wrap round? At what scale does it stop looking flat? How much of it is exposed rock rather than vegetation or scree? And it plots the mesh's face normals on a stereonet, which is where the fabric it reports comes from.
Running it
- Select the mesh in the Project Tree.
- Right-click and choose Attributes & Analysis → Geometry → Dimensionality Report.
- Set the exposure thresholds if the defaults do not suit, choose whether to write the layers and open a stereonet, and press OK.
The dialog's first line says whether the mesh has a photo texture (without one there is no vegetation test) and whether it carries a Patches layer from Grow Planar Patches. It reopens with the values last used.
The analysis runs with a progress bar and takes a few seconds on a typical outcrop model. When it finishes:
- The report opens as an analysis report in its own window. It is saved in the project's Reports folder as Mesh dimensionality - mesh name.htm and listed under Reports in the Collections tree. Every run writes a new report, so an earlier one, and any notes added to it, are never overwritten.
- The Messages panel gets one line: the verdict, the effective dimension and the name of the report.
- Triangle attributes are added to the mesh: Fabric Dip and Fabric Azimuth for the normal fabric, and Exposure, Greenness and Roughness for the exposure (see The layers it writes). Exposure is left as the displayed layer, so the classification is on the model for checking.
- A Stereonet window opens on the mesh with the fabric pair as its Mesh Attributes source, with the mesh Poles and the density contours switched on.
Several meshes can be selected at once; the dialog is shown once and each mesh gets its own report and stereonet. The mesh must be loaded in memory. Deleted triangles are left out; attribute filters are ignored.
Reading the report
The report opens with a Summary: the verdict, the effective dimension and the exposure. A section for each measure follows, its figures in tables, and a closing Layers section names the attributes the run wrote to the mesh. Lengths are in model units.
It is an ordinary report, so you can write your own notes into it, add captures of the 3D view or the stereonet, and export it to PDF; see Analysis Reports.
The verdict
One of three:
| Verdict | Meaning |
|---|---|
| 2D, a single-facing surface | The face normals cluster and the surface is a single layer along its mean normal: a wall, a bedding plane, a cliff face. |
| 2.5D, a curved surface | The normals fan out into a girdle, or the surface stacks and faces away from its mean normal in places: a curved cliff, a gorge wall, a ridge, a face with overhangs. |
| 3D, a body | The surface is closed with no consistent front, or its normals point every way, or it stacks two or more layers along its own thin axis: a boulder, a hand sample, both walls of a gorge together. |
The sentence after the verdict says which measure decided it, so the number it rests on is easy to find in the sections below.
The effective dimension
Vollmer effective dimension is a continuous value between 2 and 3, printed to two decimals. It comes from the fabric of the face normals (next section):
effective dimension = 2 + G/2 + R
where G and R are the girdle and random fractions of the fabric. A flat wall reads 2.00, a half cylinder 2.50, a sphere 3.00, and a cliff that bends partway round a hill lands in between according to how far its normals spread. It is the figure to use when comparing outcrops.
It has one blind spot, shared with the whole fabric section: two parallel walls facing each other read 2.00, because the fabric cannot tell a normal from its opposite. The verdict checks the layer count and the topology first for exactly that reason.
Normal fabric
Every triangle's normal is weighted by its area and the set is read exactly as the stereonet reads a set of poles:
- Vollmer P / G / R: the point (cluster), girdle and random fractions of the fabric, which sum to 1. The largest names the fabric: a cluster is a wall, a girdle a curved, developable surface, a random fabric a body.
- Woodcock K and C: K above 1 is a cluster, below 1 a girdle; C is the strength of the fabric. Both are infinite for a perfectly flat mesh.
- Fabric mean plane: the dip and dip direction of the plane the normals cluster about.
- Girdle axis: for a girdle fabric, the plunge and trend of the axis the surface bends about, which is the fold axis or the axis of the gorge.
- Directed resultant: the length of the area-weighted mean normal, from 1 when every face agrees on a front to 0 for a closed body or two facing walls. This is the figure that separates one wall from two.
Height-field test
Could the surface be written as a height z = f(u, v) over a plane? The mesh is projected onto a plane and the projected area landing in each cell of a grid is counted as layers. It is done twice: about the mesh's own mean normal (the best plane to grid it on), and about the vertical (the DEM question).
- Layers: the mean number of layers over the footprint, each cell weighted by the area it holds. A pure height field reads 1.00.
- Stacked: the fraction of the surface sitting in cells with two or more layers, that is under an overhang or behind another part of the surface.
- Facing away: the fraction of the surface area whose normal points away from the axis. About the vertical this is the overhang fraction.
- Gaps inside the outline: empty cells inside the convex outline of the footprint, as a fraction of the cells inside it. On a cliff scanned past trees these are the holes the trees left; on a concave outcrop the re-entrants count too, so read it with the shape of the model in mind.
When the mesh has no consistent front (directed resultant near 0), the thin axis of its extent is used instead of the mean normal, and the report says so.
The footprint cell is at least four mean triangle edges wide, so the layer count is coarse on a very coarse mesh; the table gives the cell size used, in model units and in mean triangle edges.
Extent
An area-weighted principal component analysis of the surface itself, not just of its vertices:
- Range along the three principal axes, and the standard deviation along each, so a long thin wall and a wide low one are told apart.
- Linearity / planarity / sphericity, with the same definitions as the point-cloud dimensionality features.
- The best-fit plane of the extent as dip and dip direction, and the plunge and trend of its long axis.
Note that the extent is about where the surface is, not how it faces. A cliff that wraps round a hill has a rounded extent but is still one surface; the fabric and the height-field test are what say so.
Scale
Points are sampled uniformly over the surface and, at each of eight radii from a few sample spacings up to the size of the model, the linearity, planarity and sphericity of the neighbourhoods around them are averaged. The table says what the model reads as at each scale (a line, a surface or a volume), and two radii are picked out:
- the radius at which the neighbourhoods stop being flat (mean sphericity above 0.1), which is where roughness or curvature starts to matter;
- the radius from which the model reads as a volume, or never, if it stays a surface at every scale within the model.
A rough wall stops being flat at a small radius but never reads as a volume; a gorge wall stops being flat at the radius of its bend; a closed body reads as a volume once the neighbourhood holds most of it.
Topology
From the triangle edges alone:
- open or closed, the number of boundary edges and their total length, and an openness figure (boundary length over the square root of the area: about 4 for a square, 0 for a closed surface);
- the number of connected components;
- non-manifold edges, shared by more than two triangles;
- edges with inconsistent winding, where the two triangles sharing an edge are wound in opposite senses. When more than 1% of the edges are, the report warns that the directed resultant and the facing-away figures cannot be trusted, because the mesh does not agree with itself which way is out.
On a mesh of more than thirty million triangles this section is skipped.
Exposure
How much of the model is bare rock, and how much vegetation or loose cover? Every triangle is put in one of four classes, and the report gives each class as a fraction of the surface area (and a triangle count):
| Class | Rule |
|---|---|
| Vegetation | Its texture is green: the green leaf index, (2G − R − B) / (2G + R + B) at the centre of the triangle's patch of texture, is at or above the greenness threshold (default 0.08). |
| Rock | Not green, and either inside a planar patch (when the mesh has a Patches layer and the option is on), or dipping at the steep dip (default 45°) or more, since nothing loose stands steeper than its angle of repose, or, below that dip, within the roughness threshold (default 15°) of the normal smoothed over its neighbours: a bedding surface or a pavement. |
| Cover | Not green, gentler than the steep dip and rougher than the threshold: scree, rubble, soil with clasts, dead or leafless vegetation. |
| Unclassified | Only when the roughness could not be computed (a mesh over thirty million triangles) and neither colour nor dip decided. |
Roughness is the angle between a triangle's own normal and the normal smoothed over the rings of triangles around it, smoothing passes plus one rings (default three). It is a high-pass filter on the surface: a face inside a smooth bedding plane or a cliff face reads near 0°, a face on a clast or a bush reads tens of degrees. Set the passes for the size of the roughness you want to count: more passes smooth over larger features.
The report also gives:
- Mappable: rock inside planar patches, as a fraction of the surface, when a Patches layer was used. This is the exposure you can take measurements from.
- Colour sampled on: the fraction of the surface that had a texture to sample. Below half, the vegetation test has not really run and the report says so. Black texels count as no texture.
The known failure cases are the ones the rules cannot see: dry grass and lichen are not green and lie smoothly, so they read as rock; a shadowed face reads dark, not green; a very blocky cliff below the steep dip can read as cover. The classification is written as the Exposure layer for exactly this reason: look at it on the model and move the thresholds, or paint the corrections.
Mesh
The number of triangles used, deleted and degenerate, the vertex count, the surface area, the mean edge length and the bounding box.
Typical values
| Cliff face | Curved cliff | Scanned boulder | Two facing gorge walls | |
|---|---|---|---|---|
| Fabric | cluster, P near 1 | girdle, G large | random, R near 1 | cluster, P near 1 |
| Effective dimension | 2.0 | 2.3 – 2.7 | 3.0 | 2.0 |
| Directed resultant | near 1 | 0.5 – 0.9 | near 0 | near 0 |
| Layers about the mean normal | 1.0 | 1.0 – 1.3 | 2.0 | 2.0 |
| Topology | open | open | closed | open, 2 components |
| Verdict | 2D | 2.5D | 3D | 3D |
The layers it writes
Fabric Dip and Fabric Azimuth are triangle attributes holding each triangle's own dip and dip direction, folded so that the dip is always between 0 and 90. They differ from the Dip and Azimuth that Geometry → Dip Angle and Azimuth write in exactly that fold: on a triangle whose normal points downward the plain Dip layer can exceed 90, and the stereonet then refuses the whole layer. The Fabric pair always plots.
Deleted and degenerate triangles have no value. Each run replaces the pair, and they are saved with the project like any other attribute, so the stereonet can be reopened on them later: add the mesh to a Stereonet window, pick them as the Dip Attribute and Azimuth Attribute under Contour Properties, and set Data Source to Mesh Attributes (see Plotting a mesh's dip and azimuth).
The exposure writes three more triangle attributes:
- Exposure: the class, as an integer: 1 rock, 2 vegetation, 3 cover, 0 unclassified. It is left as the displayed layer after the run.
- Greenness: the green leaf index the vegetation rule read, from −1 to 1; no value where the triangle had no texture.
- Roughness: the angle in degrees between the triangle and its smoothed normal; absent when the roughness pass was skipped.
To tune the thresholds, colour the mesh by Greenness or Roughness and read the values off the vegetation and the scree you can see, then run the report again with them. To correct the classification by hand, paint over the Exposure layer or derive a new attribute from it with the calculator.
Untick Write the layers in the dialog to get the report alone.
Notes and limits
- The report uses the base level of the mesh, every triangle not deleted. Hidden triangles and attribute filters are not honoured; to analyse a part of a mesh, extract it first.
- The stereonet window plots one pole per triangle. On a mesh of millions of triangles the density contours take a while; switch them off under Contour Properties if the window is slow.
- The fabric and the effective dimension are area-weighted, so a fine patch of triangles counts by its area, not its triangle count. Photogrammetry meshes are dense wherever the photo coverage was, and this keeps that from biasing the result.
- The height-field test drops each triangle into the cell under its centroid, which is why the cells are kept large against the triangles. It counts layers, not exact overlap, and partly covered cells at the rim of the footprint read as a single layer.
- The exposure reads one texel per triangle, at the centre of its patch of texture, from the active texture set. Texture pages not already in memory are loaded one at a time and released again. The roughness pass needs about 24 bytes per triangle and is skipped above thirty million triangles, when only the colour and steep-dip rules classify.
Implementation: vrgs::meshdim::Analyse in VRGS2020/MeshDimensionalityCore.cpp
does the measuring and formats the report page, and has no dependency on the rest
of VRGS; MeshDimensionalityReport.cpp runs it, writes the layers, opens the
stereonet and saves and opens the report. The fabric statistics follow Woodcock (1977) and Vollmer
(1990); the scale features follow Demantké et al. (2011).
See also
- Attributes — the per-vertex and per-triangle attributes, including the dimensionality features the scale table uses.
- Stereonet — plotting and contouring the mesh's poles, and the fabric statistics.
- Grow Planar Patches — extracting the planar faces a mesh exposes, the next step once you know it is one.
- Triangular Meshes — every right-click command on a mesh.