The camera holds still: the ball-follow lean zeroed on Oliver's verdict

The flattened body curve stays (farK 0.25 — 'really good, helped a ton'); the
broadcast lean was 'distracting' and its knobs sit at 0 like the aimCam pair.
The plumbing stays for the T panel. PROJECT.md: farK is now a settled feel
decision.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Fable 5 committed 2026-08-13 16:28:59 +02:00
1 parent e571e46d92
commit 0e01894f4d
3 files changed
+15 -7

No files matched your search

+9 -2
View File
@@ -344,6 +344,12 @@ zombie (now an occasional opponent, `TUNE.racketEvery`, not the every-game fixtu
starts flashing brightness. `assets/_sheet_crowd1.png` is the pre-brightening original.
## Settled feel decisions — do not regress silently
- **Far bodies draw off a flattened scale curve; the camera holds still.** `TUNE.farK` 0.25
(render.js `farB`): the court projects true, bodies grow toward the far baseline (~20% at the
back), anchored so the near player never changes. Oliver: *"new perspective is really good —
helped a ton."* The ball-follow lean built alongside it (`farCamY`/`farCamZ`) was vetoed the
same day — *"the camera movement is distracting"* — and sits at 0 like the aimCam pair: every
camera-motion experiment on this game has now lost to a still camera.
- **Two-stage serve**: touch = reticle, drag = aim, release = fire, drag back under `pullMin` =
cancel. The pull's DIRECTION picks the lane, its LENGTH is power — deliberately decoupled so a
far shambler never costs a longer drag than the screen has.
@@ -408,8 +414,9 @@ zombie (now an occasional opponent, `TUNE.racketEvery`, not the every-game fixtu
## Session log: the far court, without spending the lens (2026-08-13)
Oliver: the far-side opponent is barely visible in portrait, and the lens (camZ/camF, already at its
measured ceiling — see fitViewport) and world height were the only knobs he knew. Two new ones, both
AWAITING HIS PHONE VERDICT — nothing here is settled yet:
measured ceiling — see fitViewport) and world height were the only knobs he knew. Two new ones.
VERDICT (same day): the scale curve is settled-in (*"really good — helped a ton"*), the lean was
vetoed (*"the camera movement is distracting"*) and its knobs sit at 0 — see the settled list:
- **`TUNE.farK` — bodies draw off a flattened scale curve, the court projects true.** The 16-bit
tennis trick: `s' = s·(sNear/s)^farK`, anchored at the player's deepest stance (he is untouched),
+1 -1
View File
@@ -431,6 +431,6 @@ if (location.hostname !== 'splatter-tennis.wuwi.one') {
</div>
</div>
</div>
<script type="module" src="src/main.js?v=210"></script>
<script type="module" src="src/main.js?v=211"></script>
</body>
</html>
+5 -4
View File
@@ -283,10 +283,11 @@ export const TUNE = {
// BALL-FOLLOW LEAN (tennis + match only): while the ball is on the FAR half the camera eases
// toward camY+farCamY / camZ+farCamZ — a broadcast-style lean into the deep court. It pivots
// about the near player's feet (see fOff in render.js), so his stance and the pull room the
// apron math promised never move. Both 0 = the camera holds still. Defaults are deliberately
// shy of visible: the phone (not the desktop pane) is where a moving camera gets its verdict.
farCamY: 0.35, // m of camera rise while the ball is far (steepens the look-down)
farCamZ: -0.6, // m of camera dolly while the ball is far (negative = closer)
// apron math promised never move. Both 0 = the camera holds still, which is where Oliver
// landed ("the camera movement is distracting") — the same verdict the aimCam pair got. The
// flattened body curve above carries the far-court read on its own.
farCamY: 0, // m of camera rise while the ball is far (steepens the look-down)
farCamZ: 0, // m of camera dolly while the ball is far (negative = closer)
backstopZ: -1.8, // z of the far backstop — must sit IN FRONT of the -2 retire line, or balls die before they reach it
backstopKeep: 0.55, // pace a ball keeps after the rebound — still lethal, slower
backstopPop: 1.8, // m/s of lift off the fence, so the rebound travels back instead of dying at the net posts