Skip to main content

Module silhouette

Module silhouette 

Source
Expand description

Silhouettes: where a curved face turns away from the eye, the outline it shows without any edge there — the sides of a cylinder seen side on.

For a view along d, a point of a surface Scalar(u, v) is on its silhouette when its normal is perpendicular to d: g(u, v) = (S_u x S_v) . d = 0. That is a curve in (u, v), traced here as such:

  1. Seeds. g’s sign is sampled along a grid of iso lines of the surface’s domain. Between two samples of opposite sign a silhouette crosses the line, and bisection finds where. Sampling only decides where to look: what is traced is the exact zero set. The interior grid lines sit at irrational fractions of the domain, a free choice made so they do not run along the symmetric iso lines silhouettes so often are. A closed loop crossing no grid line lies within one cell, and encloses a critical point of g (an extremum): each cell where g could vanish is halved into boxes, those that could hold a critical point halved again, and through each left a line across the cell is sampled too ([loop_seats]), crossing such a loop. A trace seeded on a short line steps no further than half of it, so a small loop is traced in steps of its own size.
  2. Tracing. From a seed, predictor-corrector steps follow the curve: a step along the tangent (-g_v, g_u), sized to a fixed length in 3-D, then Newton back onto g = 0. A trace ends where the curve leaves the domain, landing exactly on its boundary, or where it closes on itself. Every grid line a trace crosses marks the seed there as traced.
  3. Trimming. The traced curve in (u, v) is cut where it crosses the face’s trim curves, and only the pieces inside the face are kept.
  4. Curves. Each piece becomes a 3-D curve through exact silhouette points along it, widened to enclose the silhouette between them too (as a traced intersection branch is, NurbCurve3D::fit_enclosing): two silhouettes that are one line on the paper — mirror images seen along the mirror’s normal — are then seen to run along each other.

The curve encloses the silhouette, so a point of it is near the silhouette, within its width, not on it. Whoever needs a point exactly on it — the visibility test does: a ray grazing a face at its silhouette tells the truth only from the exact point — asks Silhouette::exact_point.

Structs§

Silhouette
A piece of a face’s silhouette.

Functions§

edge_crossings
Where the edge curve, bounding the face face_id along the coedge coedge_id, crosses the face’s silhouette seen along d: the parameters where the face’s normal there turns perpendicular to d.
face_silhouettes
The silhouette of face_id seen along the unit vector d, as curves on the face: none for a plane, or for a face seen edge on throughout.