How the optics model works
A simulation nobody can check is just an opinion with better graphics. This is the whole model, including the parts that are approximations and the parts that are wrong.
The chain
- Down. Sunlight enters the water and travels to the lure's depth, losing energy per wavelength (Beer-Lambert:
I = I₀·e^(−Kd·d)). - Reflect. The lure reflects some fraction of whatever survived.
- Across. That reflection travels the viewing distance to the eye, losing more.
- Veil. Backscatter adds a glow along the line of sight, raising the black level. In dirty water this — not darkness — is what makes a lure vanish.
- See. What arrives is integrated by that species' cones, blended toward rod (monochrome) vision as light falls.
Every step but the reflection is linear in radiance, so the whole per-pixel transform folds into one 3×3 matrix plus an additive veil. That is why it runs at full frame rate on a phone.
Water types
Sampled at 8 bands (420–700nm). The shape is the point: each water type has a different transmission window, and that window is the real reason colour advice differs from lake to lake.
| Water | 420 | 460 | 500 | 540 | 580 | 620 | 660 | 700 | Backscatter |
|---|---|---|---|---|---|---|---|---|---|
| Clear | 0.04 | 0.03 | 0.04 | 0.07 | 0.12 | 0.25 | 0.40 | 0.65 | 0.05 |
| Green / algal | 0.35 | 0.22 | 0.13 | 0.12 | 0.17 | 0.30 | 0.48 | 0.75 | 0.16 |
| Stained / tannic | 1.30 | 0.85 | 0.50 | 0.35 | 0.30 | 0.38 | 0.55 | 0.85 | 0.22 |
| Muddy / suspended sediment | 1.80 | 1.50 | 1.25 | 1.15 | 1.15 | 1.25 | 1.45 | 1.80 | 0.55 |
Diffuse attenuation coefficient Kd, per metre, per band.
Eyes
| Species | Cone peaks (nm) | Low-light gain | Notes |
|---|---|---|---|
| Human (reference) | 440 / 545 / 578 | 1× | Trichromat baseline. This is the view you think you tied on. |
| Largemouth bass | 535 / 614 | 1.6× | Dichromat, green + red. Strong on chartreuse/red separation, weak on blue. |
| Walleye | 530 / 605 | 4.5× | Dichromat with a tapetum lucidum. Superb in low light; red-orange biased. |
| Rainbow trout | 434 / 531 / 576 | 1.3× | Trichromat (UV cone too, when young). The best colour vision on this list. |
| Northern pike | 525 / 615 | 1.8× | Dichromat, ambush predator. Tuned for contrast against a bright ceiling. |
| Bluegill | 460 / 530 / 620 | 1.1× | Trichromat. Sight-feeder on small forage; good colour discrimination. |
Most freshwater gamefish are dichromats: two cones, red-shifted relative to ours. They are not colour-blind — they discriminate well along their own axis. The axis just is not yours.
Two decisions worth defending
The reference observer
A photograph is already a human-trichromat encoding of a spectrum. Before re-viewing it through a different eye, that encoding has to be undone, or the broad overlap between our own cone curves shows up as a colour cast on every render. So the model inverts a human-at-the-surface observer first. The check you can run by eye in one second:human + clear + 0m renders exactly the input image. Everything else is a departure the physics has to earn.
Light adaptation
A real eye is not a light meter. Pupil, photopigment regeneration, tapetum and neural gain all pull the operating point toward ambient — a fish at 6m in stained water is not "in the dark" from its own point of view. We model that as grey-world adaptation, gaining the response until the background sits at mid-luminance. The gain is capped, and the cap scales with the species' low-light hardware. Past it the image really does go black, because "there is not enough light here for this fish to solve this problem" is a legitimate answer.
What the score measures
Detection contrast is three numbers, because a fish has three ways to pick a target out of the background and they fail under different conditions.
- Colour — difference in the fish's own cone space. The best cue in decent light, and the first to die as the transmission window narrows.
- Brightness — Michelson contrast against the background. This is the silhouette channel, and it is what survives into the dark.
- Pattern — luminance variation within the bait: barring, blotches, a dark back over a pale belly. Measured on a block-averaged image, because spatial acuity is finite and a fish at distance genuinely cannot resolve a feature the size of an eye. Reported as
—when the bait is not resolvable at all, since barring you cannot see is not a cue.
Pattern earned its own number after the mean-colour score rated firetiger as mediocre in green water. The average of firetiger is close to a green lake's background — what makes it visible is the hard dark barring inside it, and an average is exactly the operation that destroys that information.
The Tank: lure physics
A separate model, on the same principle. A lure is a grid of components; the question it answers first is whether the thing swims at all.
The failure being modelled is specific and real. An unbalanced crankbait does not swim badly — it rolls onto its side and skates, and catches nothing. That happens when the centre of mass sits at or above the centre of buoyancy, leaving no righting couple, or when the lip's drag overpowers the couple that does exist.
Materials
| Component | Density kg/m³ | Fill | Displaces |
|---|---|---|---|
| Balsa | 160 | 100% | 100% |
| Cedar | 380 | 100% | 100% |
| ABS plastic | 1040 | 35% | 100% |
| Closed foam | 90 | 100% | 100% |
| Lead ballast | 11340 | 14% | 100% |
| Tungsten | 19300 | 9% | 100% |
| Rattle chamber | 250 | 100% | 100% |
| Lip | 1200 | 30% | 18% |
| Hook hanger | 7800 | 8% | 5% |
| Line tie | 7800 | 4% | 2% |
Fill and displaces are load-bearing, not fudge factors. Without them a "lead ballast" cell is a solid cubic centimetre of lead and a hook hanger is solid steel — which made a 12cm balsa crankbait weigh 66g and sink like a bolt. Real ballast is a small slug set into the body, so the cell still displaces a full volume; a hook hanger is thin wire hanging outside it, so it displaces almost nothing while still acting as keel weight.
What decides the action
- Righting moment — buoyancy acting up at the centre of buoyancy against weight acting down at the centre of mass. Their vertical separation is the whole ballgame; the editor draws both markers so you can see it.
- Lip force — real drag at a reference retrieve,
F = ½·ρ·v²·A·Cd, with v = 1 m/s and Cd = 1.2. - Stability — righting moment divided by the lip's overturning couple. Below 0.35 it blows out; far above it, the bait is so heavily righted the lip cannot move it and the action goes dead.
The overturning couple uses the vertical offset between the lip and the centre of mass. An earlier version used the horizontal offset, which is a pitch/dive term rather than the couple that rolls a bait out — it made every sane starter bait read as "blows out."
Where this model is wrong
- RGB is not a spectrum. Reconstructing 8 bands from 3 numbers uses broad Gaussian primaries. Fine for the broadband pigments on lures; it would be wrong for a narrowband source like an LED.
- Cone curves are Gaussians. Real ones are skewed, with a secondary beta-band peak. At 8-band resolution the error is small, but it is there.
- No UV channel. Several species — juvenile trout especially — have a real UV cone, and some lure finishes are UV-bright. That is invisible to this model and to your camera both.
- No polarisation. Many fish detect polarised light and use it to break camouflage. Not modelled at all.
- Single scattering only. The veil term approximates backscatter. True radiative transfer in turbid water is a harder problem than this.
- Kd values are typologies, not your lake. They are representative of a water class. Real water varies with season, runoff and algal bloom.
- Contrast ≠ getting bitten. This scores detectability. Whether a fish eats depends on action, vibration, forage match, and mood. Those are Stage 1 and Stage 2, and they are not built yet.
If you know a coefficient here to be wrong, or have measured data that contradicts it,tell us. Being corrected is cheaper than being confidently wrong in public.