Attractor depth: perspective, depth_fade, depth_hue, spin
Three of these four are exact no-ops on every flat family, the same way
a b c d already carry family-specific meanings. perspective, depth_fade
and depth_hue do something only on the 3-D families — thomas and
lorenz. On de_jong, clifford and the five IFS figures they are
exactly the identity: those maps have no third coordinate, so the engine
hands the shader a depth extent of zero and every cue collapses to a no-op.
Binding them there is not an error and produces no warning — it produces
nothing at all. (Verified by capture: at any setting, zero pixels differ —
asserted for all three in core/tests/attractor.rs.)
depth_fadeis a no-op on a flat family too, and the arithmetic is why it once was not (design-backlog 0067). The haze is1 − depth_fade · (1 − depth01(dn)), and a flat family’sdn ≡ 0would put the multiplier at1 − depth_fade/2, sodepth_fade = 0.9would dim a flat figure 45 % everywhere with no depth gradient (measured onattractor_dissolve: 20.1 % of pixels moved, max channel delta 97, whileperspectiveanddepth_huemoved zero). The fade term is now multiplied by the family’s has-depth flag, so all three cues are the identity together. If an old draft leaned on the dimming as an undocumented brightness trim on a flat family, it silently brightened back —exposureis the parameter that means “dimmer” and says so.
spin is the exception and reaches every family. The flat ones rotate
in-plane through the same angle, so an audio-driven spin is a real look on
De Jong today, and a fern that rocks a couple of degrees either side of upright
reads as wind. That asymmetry is deliberate; do not read it as an oversight.
| Param | What it does | Range that means something |
|---|---|---|
perspective | Near material grows and far material shrinks, position and point size together. Segments foreshorten, because both endpoints project independently. | 0 (orthographic, the default) .. ~0.3 in practice; the clamp is at 0.8 and the reason to stop short of it is below |
depth_fade | Attenuates brightness with distance — the substitute for occlusion, which this scene does not do. 1 takes the far end to black. | 0 (off) .. 1 |
depth_hue | Shifts the palette coordinate by ±depth_hue/2 across the depth range, so distance moves colour as well as contrast — on a ramp that travels in hue at roughly constant lightness. On a dark-to-light ramp (which is what the 3-D presets have shipped) it duplicates depth_fade instead, and under ink_amount = 1 it is structurally dead, like saturation. design-backlog 0062 | 0 (off) .. 2 * min(hue_center, 1 - hue_center), past which the offset wraps on the LUT’s repeat sampler and far material lands on the near colour |
spin | Rate multiplier on the display rotation. 1 is unchanged, 0 holds the figure still, negative reverses it. | any |
Four things you cannot discover by binding them:
-
perspectiveis clamped at0.8, silently. A preset asking for more gets the ceiling, not a warning — the same undiscoverable-ceiling shapebloom_thresholdandvigoralready carry. The number means the figure’s depth half-extent as a fraction of the camera distance, so the near-to-far magnification ratio is(1 + p) / (1 - p):0.5gives 3:1,0.8gives 9:1, and the singularity would be at1. -
perspectivemostly MOVES the figure, and azoomedit cannot recover that. The magnification is applied before the view transform, so raising it does make the figure bigger — but that is the small half. Measured peak-to-peak over four spin phases on a bare Lorenz, 600 px square:perspectivecentre-x swing widest span 0.00 0.04 NDC 522 px 0.15 0.11 NDC 525 px 0.25 0.20 NDC 529 px 0.40 0.37 NDC 542 px 0.60 0.55 NDC 555 px The near side is magnified, so the projected centroid shifts toward whichever side is currently near — and as the figure turns, that shift orbits. The swing is about 0.9 x
perspectivein NDC; the size growth across that whole sweep is 6 %. Azoomis a static scale, so it cannot recover a phase-varying translation: all it can do is shrink the figure until the orbit fits inside the frame, which is what the 3-D presets paid for (attractor_lorenz, since retired, went 1.32 -> 1.16;attractor_thomas1.14 -> 1.02). So the real ceiling is ~0.3, not the0.8clamp — past that the figure visibly slides around the frame instead of turning in place, which is a worse artifact than the flatnessperspectivewas bought to fix. The clamp is not where the projection breaks; at0.8it is still a true perspective divide and reads as a strong wide angle, not a fisheye. This ceiling note is design-backlog 0061’s documented resolution; the deeper fix — re-centring the projection on the figure’s projected centroid — remains unowned. -
spinis a multiplier on 0.18 rad/s (spin = 1is one revolution per 34.9 seconds), and its usable ceiling is set byfade, not by taste —spinandfadeare one look. A frame of trail drawn while the figure turns is a frame of rotational smear: push the pair too far and the accumulation stops being a trace of the trajectory and becomes concentric arcs, which destroys exactly the volumeperspectivewas bought to buy. Measured: atfade = 0.932(~15 frames of trail) the rendered ladder1 / 2 / 3 / 5 / 8reads crisp, crisp, softening, smeared, scribble — usable peak about 1.9;attractor_thomasrunsfade = 0.955(~22 frames) and its ceiling is correspondingly lower, about 1.3. The arithmetic agrees: holding the smear under ~5° needsrate < 0.087 / (frames / 60)rad/s, so the ceiling falls asfaderises. (This bullet used to say2–4is where the rotation becomes legible — true for a trail-free scene, wrong for every attractor preset that ships; design-backlog 0063.) The phase is integrated, so aspinbound to audio accelerates the figure rather than snapping it to a new angle — but the integration fixes the discontinuity, not the range: a wide binding like1 + bass * 5swings the figure through most of a revolution between transients and reads as tumbling, not drive. The 3-D presets have modulated narrowly (the since-retired Lorenz1.0–1.8, Thomas1.0–1.3). -
The illusion has a density limit and haze does not remove it. Nothing occludes anything here — two strands crossing simply sum — so as
[particles] densityrises the figure reads more and more as X-ray whatever these are set to. If depth stops reading, lowerdensitybefore raisingperspective.
Built from a8ce055 at version 0.115.0. This site tracks main and is not versioned per release.