From 0e01894f4df76eaba41b39c3ec1f99f355134e59 Mon Sep 17 00:00:00 2001 From: Oliver Rieger Date: Thu, 13 Aug 2026 16:28:59 +0200 Subject: [PATCH] The camera holds still: the ball-follow lean zeroed on Oliver's verdict MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- PROJECT.md | 11 +++++++++-- index.html | 2 +- src/config.js | 9 +++++---- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/PROJECT.md b/PROJECT.md index d7c2b8a..04f3832 100644 --- a/PROJECT.md +++ b/PROJECT.md @@ -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), diff --git a/index.html b/index.html index 747d021..978fd0d 100644 --- a/index.html +++ b/index.html @@ -431,6 +431,6 @@ if (location.hostname !== 'splatter-tennis.wuwi.one') { - + diff --git a/src/config.js b/src/config.js index 4fbc3b1..41a4f25 100644 --- a/src/config.js +++ b/src/config.js @@ -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