wifi-densepose/examples/three.js
ruv 60d2c8eb82 feat(examples/three.js): cinematic skinned realtime pose demo + ESP32 CSI bridge
Five-stage example progression exploring three.js helpers (ADR-097 surface) as
a viewer for live RuView sensor data:

1. helpers-demo.html              — clean ADR-097 helper reference (GridHelper,
                                    PolarGridHelper, BoxHelper, AxesHelper),
                                    file://-safe, no backend
2. helpers-cinematic.html         — same scene + UnrealBloomPass + pseudo-CSI
                                    sonar pings + tomography sweep + procedural
                                    cyber floor + ambient drift particles
3. helpers-skinned.html           — replaces sphere skeleton with Mixamo X Bot
                                    via GLTFLoader from threejs.org CDN, plays
                                    bundled animations with additive blending
4. helpers-skinned-fbx.html       — same but loads a local Mixamo FBX (needs
                                    serve-demo.py — file:// can't fetch local
                                    siblings). Drop X Bot.fbx alongside.
5. helpers-skinned-realtime.html  — webcam → MediaPipe Pose Heavy →
                                    poseWorldLandmarks → direct quaternion
                                    retargeting onto the Mixamo skeleton.
                                    Real ESP32-S3 CSI streamed over WebSocket
                                    from ruvultra (Tailscale, port 8766).

Supporting:
  - serve-demo.py             threaded HTTP server with no-cache headers
                               (fixes net::ERR_EMPTY_RESPONSE on the FBX path)
  - ruvultra-csi-bridge.py    ESP32 RuView firmware tick → WebSocket bridge,
                               runs as systemd-run unit on ruvultra

Bugs found + fixed along the way (all documented in code comments):
  - FBX exports yield TWO parallel Bone trees with identical names; only the
    SkinnedMesh.skeleton.bones one drives visible deformation. model.traverse
    finds orphans.
  - Mixamo FBX nests a zero-length wrapper bone above the real bone, same name.
    bone.children[0].getWorldPosition == bone.getWorldPosition → restDir is
    (0,0,0) → setFromUnitVectors collapses to identity. Walk past same-named
    same-position wrappers when computing tail.
  - AnimationMixer.update() with a "stopped" action still mutates bones unless
    enabled=false is set.

Retargeting layer in helpers-skinned-realtime.html:
  - 12 bones direct quaternion retarget (arms × 2, legs × 2, spine × 3, neck)
  - Hips root rotation from shoulder/hip line basis (torso twist + lean)
  - Neck aims at ear-midpoint (kp 7+8), not nose (kp 0), to remove the
    forward bias of the protruding-nose anchor
  - One Euro Filter per landmark per axis (Casiez 2012) — adaptive low-pass
  - Visibility-weighted per-bone slerp gain — occluded limbs relax to rest
  - URL toggles: ?mirror= ?yflip= ?zflip= ?cnn=0/1/2 ?csi=ws://...

Live CSI integration:
  - Bridge parses adaptive_ctrl tick lines (motion/presence/rssi/yield)
  - Browser fans single ESP32 reading across 4 UI nodes with phase-shifted
    wobble (0.88–1.00 × sin(t·0.55 + offsetᵢ))
  - EMA α=0.06 (~3 sec time constant), HUD update throttled 3 Hz

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-15 22:22:41 -04:00
..
.gitignore feat(examples/three.js): cinematic skinned realtime pose demo + ESP32 CSI bridge 2026-05-15 22:22:41 -04:00
helpers-cinematic-screenshot.png feat(examples/three.js): cinematic skinned realtime pose demo + ESP32 CSI bridge 2026-05-15 22:22:41 -04:00
helpers-cinematic.html feat(examples/three.js): cinematic skinned realtime pose demo + ESP32 CSI bridge 2026-05-15 22:22:41 -04:00
helpers-demo-screenshot.png feat(examples/three.js): cinematic skinned realtime pose demo + ESP32 CSI bridge 2026-05-15 22:22:41 -04:00
helpers-demo.html feat(examples/three.js): cinematic skinned realtime pose demo + ESP32 CSI bridge 2026-05-15 22:22:41 -04:00
helpers-skinned-fbx-screenshot.png feat(examples/three.js): cinematic skinned realtime pose demo + ESP32 CSI bridge 2026-05-15 22:22:41 -04:00
helpers-skinned-fbx.html feat(examples/three.js): cinematic skinned realtime pose demo + ESP32 CSI bridge 2026-05-15 22:22:41 -04:00
helpers-skinned-realtime-screenshot.png feat(examples/three.js): cinematic skinned realtime pose demo + ESP32 CSI bridge 2026-05-15 22:22:41 -04:00
helpers-skinned-realtime.html feat(examples/three.js): cinematic skinned realtime pose demo + ESP32 CSI bridge 2026-05-15 22:22:41 -04:00
helpers-skinned-screenshot.png feat(examples/three.js): cinematic skinned realtime pose demo + ESP32 CSI bridge 2026-05-15 22:22:41 -04:00
helpers-skinned.html feat(examples/three.js): cinematic skinned realtime pose demo + ESP32 CSI bridge 2026-05-15 22:22:41 -04:00
ruvultra-csi-bridge.py feat(examples/three.js): cinematic skinned realtime pose demo + ESP32 CSI bridge 2026-05-15 22:22:41 -04:00
serve-demo.py feat(examples/three.js): cinematic skinned realtime pose demo + ESP32 CSI bridge 2026-05-15 22:22:41 -04:00