From d5c16534c1a22776316d25d88b057eada986f147 Mon Sep 17 00:00:00 2001 From: type-two Date: Fri, 17 Jul 2026 23:42:32 +1000 Subject: [PATCH] =?UTF-8?q?Lane=20E:=20wind-clip=20proposal=20to=20D=20?= =?UTF-8?q?=E2=80=94=20the=20lean=20can't=20be=20a=20clip,=20names=20+=20B?= =?UTF-8?q?eaufort=20thresholds?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- THREADS.md | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/THREADS.md b/THREADS.md index 91f5bbb..e83e212 100644 --- a/THREADS.md +++ b/THREADS.md @@ -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, B0โ€“3).** No lean, no posture. Idle as today. + ยท **working breeze โ€” 5.5 to 13.9 m/s (20โ€“50 km/h, B4โ€“6).** 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.