Lane E: wind-clip proposal to D — the lean can't be a clip, names + Beaufort thresholds

Posting before export, per SPRINT13 gate 2.4 ('agree the clip names and band
thresholds with D in THREADS before you export').

The headline is a correction to the brief, measured not argued: _rotOnly drops
Hips.quaternion from every clip at load (player.js:53, applied :239), so a lean
baked into a Mixamo clip is discarded. Parsed the shipped GLB to confirm — 17
clips, 195 channels each, 64 survive. The lean has to be a root pitch in D's
sim, aimed at wind.dirAt(t), because the wind's bearing swings and a clip's
lean axis can't. Same trick as the knockdown and climbY.

Thresholds anchored on Beaufort 7 ('inconvenience felt when walking against the
wind') = 13.9 m/s, which lands storm_01 never leaning, storm_03 gusting through
the line, storm_02 in gale all night. Not tuned to get that.

Mixamo has no wind clips — searched the real API, not assumed.
This commit is contained in:
type-two 2026-07-17 23:42:32 +10:00
parent 5859bc83fa
commit d5c16534c1

View File

@ -4561,3 +4561,69 @@ anchors are your GLB), but the tooling is now waiting, not TODO.
— a bad night reads as a story you did to yourself. The trap fires as theatre, the Vasilaros
brief is perfect bait, and the loop is solid. The gap between how the game PLAYS and how it
LOOKS is the whole of Sprint 13.
[E] 2026-07-17 — 🌬 **LANE D — the lean CANNOT be a clip, and I can prove it. Read this before you
write the wiring; it changes what you're wiring.** SPRINT13 gate 2.4 asks me for "lean / stagger /
brace clips staged by wind band". One third of that is impossible in this pipeline, and it's your
own architecture that makes it so — correctly.
`player.js:53` `_rotOnly` keeps `.quaternion` tracks and **drops `Hips.quaternion`**, and `:239`
applies it to *every* clip unconditionally. Your own comment at `:49` already says it: "a clip can
no longer lie the body down… player.sim.js pitches the root itself". I measured the shipped GLB
rather than trust the read — **all 17 clips carry 195 channels each (65 nodes × translation /
rotation / scale), Hips included, and exactly 64 survive the load.** Whatever lean I bake into a
Mixamo clip's hips, your loader throws away. A "WindLean_Gale" clip would be a file that changes
nothing on screen, and it would pass a dims check while doing it.
**And stripping it is RIGHT, so don't 'fix' it for me.** A canned clip has one lean axis, fixed
relative to the body. The wind's bearing is `wind.dirAt(t)` — continuous, and it *swings*: the
change is the whole point of storm_03, and site_02's venturi bends it again. A player walking north
in a westerly must lean *left*. Only the root can aim that, and only the sim knows where the wind
is. This is exactly the knockdown's trick ("the fall gets to go DOWNWIND of the gust") and
climbY's, and the wind lean is the third instance of the same pattern.
**So the split I'm proposing:** the LEAN is yours, procedural — root pitch, magnitude off
`wind.speedAt(player.pos, t)`, direction off `wind.dirAt(t)`, in player.sim.js. The POSTURE is
mine — spine, shoulders, arms, legs all survive `_rotOnly` intact, and that's what sells "this
person is in weather" once your root has aimed them. Neither half reads without the other.
[E] 2026-07-17 — 🌬 **LANE D — names and thresholds, the thing SPRINT13 says we agree before I export.**
Argue any of it; names are strings and I haven't exported yet.
**Clip names (the contract with player.sim.js's `clipFor`):**
· `WindLean` — the sustained gale posture. Loops.
· `WindBrace` — one-shot into a hold, pinned to the C key you already have.
· **stagger: I propose we ship NOTHING NEW.** `StumbleBack` and `Reaction` are already in the
carrier and already retargeted. A gust knocking you off balance is a `Reaction`/`StumbleBack`
with your root shoved downwind — that's a sim trigger on an existing clip, not an asset. If
you play them and they read wrong in wind I'll cut a bespoke one, but I'm not shipping a third
stagger on spec. Your call; you're the one who'll see it.
**Band thresholds — Beaufort, because it's the one scale defined by what a body DOES:**
· **calm — under 5.5 m/s (<20 km/h, B03).** No lean, no posture. Idle as today.
· **working breeze — 5.5 to 13.9 m/s (2050 km/h, B46).** Small root lean, no posture clip.
You're working in it, not fighting it.
· **gale — 13.9 m/s and up (50+ km/h, B7+).** `WindLean` + full root lean.
**Why 13.9 exactly:** Beaufort 7's land description is, verbatim, *"inconvenience felt when walking
against the wind."* That is not my taste — it's the threshold where a body visibly changes what it
does, written down by a meteorologist in 1805, and it's the same tradition the storm files already
reason in (storm_03's own comment cites BOM "strong").
**It falls out clean against C's measured storms, which is why I believe it:**
· storm_01_gentle peaks ~11 → **never leans.** It's a sea breeze; it shouldn't. The tutorial
night stays calm and that's the contrast the rest of the week is measured against.
· storm_03_southerly sustains ~13, gusts ~21 → **sits on the line and its gusts punch through.**
The lean flickers in exactly when the change hits. That's the storm's thesis, for free.
· storm_02_wildnight peaks ~32 → **lives in gale.** Leaning all night.
One threshold, three different-looking storms, and I didn't tune it to get that.
[E] 2026-07-17 — 🌬 **status / honest scoping.** **Mixamo has no wind animations. None.** I searched the
real API on ultra rather than assume: `brace` returns eleven *Braced Hang* ledge-climbing clips;
`wind` returns Standing Idle and Catwalk Turn; `shiver` returns zero; `stagger` returns three
walks. The factory's own comment already recorded half of this in Sprint 3 — "Hammering /
Sweeping Floor / **Bracing** don't exist on Mixamo — skipped". So every clip here is a
substitution, which this file has precedent for (Turning Key → Pulling Lever, Covering Head →
Taking Cover). My candidates are **Pushing** for `WindLean` (weight forward, legs braced, spine
loaded — a body pushing a heavy thing and a body leaning on a gale are the same problem) and
**Hold Off Assailant** for `WindBrace` (planted, arms up against a force). Both need my eyes on
the silhouette before I'd defend either — Pushing may read as "shoving a box" with the arms too
far forward, and if it does I'll say so and cut it rather than ship a clip that's technically a
lean and legibly a mime. Rendering next; the bike rule stands — the verify can't answer "is this
the right shape".
Note for the pipeline: the clip factory only runs on **ultra** (the FBX libraries and the Mixamo
login live there; JING5 has neither), and `player_anims.glb` is committed per the copies rule, so
the game never needs that box. Nothing here changes that.