How the fish behaviour models work
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 the Fish Vision Camera 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. |
Fish vision is not one standard system: cone count and spectral sensitivity vary by species, population, life stage, and light environment. The profiles above are simplified inputs to this model, not a claim that every fish of a listed species sees exactly this way. For example, a laboratory study found two cone classes and tested color discrimination in largemouth bass; that result should not be generalized to every freshwater gamefish.
Evidence behind the vision profiles
The largemouth-bass profile uses the two cone peaks reported by Brown and colleagues (535nm and 614nm). Their study measured photoreceptors from nine fish and included a behavioral color-discrimination assay. A broader review describes substantial diversity in fish visual systems, which is why the other species profiles here should be read as model parameters rather than species-complete measurements.
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. The model uses their vertical separation and the smaller of those two forces as a restoring proxy; the editor draws both markers so you can see it.
- Lip force — drag estimated as
F = ½·ρ·v²·A·Cd. The Tank lets you vary v from 0.2 to 2.4 m/s; its default is 1 m/s, with 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.
This is a two-dimensional side-view proxy for tracking stability, not a three-dimensional roll simulation. It uses vertical lip offset against the restoring estimate. Lip load rises with the square of retrieve speed, while the beat rate rises roughly with speed. The Tank's vertical tendency combines buoyancy and lip dive force; it does not predict an exact running depth. Disconnected components are excluded from the calculation.
The Fish: the decision model
The third model, and the one the other two exist to feed, is the fish decision model. It models a four-stage predation sequence, and every stage can fail on its own terms — because "it didn't work" is useless, while "it never detected it" and "it tracked it and refused at two feet" are different problems with different fixes.
- Detect — vision (from the optics model) OR the lateral line. Two independent channels, which is why a rattle earns its keep exactly where colour stops working.
- Approach — is it worth moving for: hunger, aggression, and whether the profile falls inside the species' prey window.
- Track — follow and evaluate. Both too little action and too much are real failures.
- Commit — eat, or refuse after inspection.
Temperature is the master variable
Fish are ectotherms, so water temperature is not a modifier here — it sets metabolic rate, which sets how much a fish needs to eat, how far it will move, and how fast a presentation it can physically run down. The curve is deliberately asymmetric: performance climbs steadily to the optimum, then falls off sharply above it as oxygen demand outruns supply.
| Species | Optimal | Feeds between | Forage | Wants wobble | Aggression |
|---|---|---|---|---|---|
| Largemouth bass | 27°C | 7–34°C | 60–180mm | 4–9 | 0.85 |
| Smallmouth bass | 21°C | 5–29°C | 40–120mm | 3–7 | 0.8 |
| Walleye | 20°C | 2–27°C | 50–150mm | 1–4 | 0.45 |
| Northern pike | 18°C | 1–26°C | 100–350mm | 5–10 | 0.95 |
| Rainbow trout | 14°C | 1–22°C | 15–70mm | 2–6 | 0.55 |
| Bluegill | 24°C | 8–32°C | 5–30mm | 0–3 | 0.4 |
The blind eat
When vision fails but the lateral line still has the bait, commitment drops but does not go to zero — and how far it drops scales with the species' aggression. Vibration sayssomething is there; it does not say that is food. A largemouth will eat on feel alone; a walleye, under the same conditions, shadows it and turns off. That difference is the whole argument for rattles in dirty water.
To see the whole chain run end to end, the scenario pages put twelvelure archetypes through all three models under fixed conditions for each species, and show every refusal with its reason.
The sonar model is documented on its own page: the beam geometry, the level assumptions, and what it leaves out. The same model answers two narrower questions: how wide thecone really is at depth, and whether you cantell a fish's size from its arch.
Where this model is wrong
The equations describe mechanisms; many values fed into them are working assumptions, not measurements from your lake or a universal species profile. The species temperatures, prey sizes, preferred action ranges, aggression, reaction distances, water classes, and most non-bass cone profiles have not been calibrated against field observations for this tool. Treat results as comparative hypotheses: change one input and inspect how the model responds, not as a prediction that a real fish will strike.
- 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.
- Only the lip makes action. The Tank derives wobble from lip drag against the righting couple. A lipless rattle bait or a glide bait, whose action comes from body shape or the rod, scores as having no action at all. That is a gap in the model, not a verdict on those lures.
- Contrast ≠ getting bitten. This score measures detectability. The Tank and Fish tools add modelled action, vibration, forage match, temperature, and mood, but those inputs still cannot predict what an individual fish will do.
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.