Commit Graph
15 Commits
Author SHA1 Message Date
lucianoandClaude Fable 5 97376b22c9 Dance library: bundled clips bind to any rigged model + repertoire + manual BPM
- models/dance_library.glb: skeleton-only GLB with the 13 Mixamo dances,
  loaded at startup and bound BY BONE NAME to whatever rigged GLB the
  user loads — new models dance immediately, no baking needed.
- Repertoire UI (Media tab): checkbox chips of the available clips, the
  director only picks the ticked ones (none = all); persisted.
- 'Aggiungi animazioni': extra .glb clips load directly; .fbx are
  converted on the fly by Blender via a new anim:convert IPC and the
  bundled scripts/fbx2animglb.py (asarUnpacked for packaged builds).
- Manual BPM with TAP tempo: 0 = follow the detected beat, otherwise a
  pure metronome drives the dance clock.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 11:15:10 +02:00
lucianoandClaude Fable 5 b45c7078dc Fluid backdrop behind the 3D model
New 'Sfondo Modello 3D' selector (Media tab): gradient or any of the
five fluid modes. The fluid sim paints the canvas first, then the model
renders on top clearing only the depth buffer (overlay mode skips its
own backdrop pass). Palette and speed are shared with the preset;
persisted and re-sent when the output restarts.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 10:59:19 +02:00
lucianoandClaude Fable 5 173d85b681 Half-time clips and beat double-count fix
Expressive choreographies (Thriller, breakdance, flair, spins, moonwalk)
are authored one count per TWO beats: a per-clip pace factor (name
heuristic) halves their count rate. The beat clock also gained a
refractory window (60% of a period) so energetic tracks firing on both
kick and snare no longer double the detected tempo, which made every
clip race.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 10:55:33 +02:00
lucianoandClaude Fable 5 d905146b13 Zero-lag beat lock: feed-forward timeline + latency lead
The pure exponential follower trailed the beat clock by its time
constant (~110ms), which read as the dancer being late on the kick. The
clip timeline now advances by itself at the metronome rate (feed-forward,
zero structural lag) while a gentler follower only corrects drift, with
a 50ms lead compensating beat-detection/display latency and a hard
resync when the error exceeds 1.5 beats.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 10:53:01 +02:00
lucianoandClaude Fable 5 d17cd42958 Fluid beat-lock: linear extrapolated phase + soft timeline chase
The phase-locked playback felt mechanical: the smoothstepped phase made
the clip accelerate/brake every beat, and the hard clamp at phase 1
stalled motion when the next beat ran late. The beat clock now exposes a
linear phase that keeps running past 1, and the director chases the
beat-locked timeline with an exponential follower (~110ms) that absorbs
metronome re-syncs. The procedural sway keeps its eased phase (there the
easing reads as groove).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 10:49:58 +02:00
lucianoandClaude Fable 5 cb2db1550c Phase-lock the dance clips to the beat
Clips used to play at their authored tempo, so the steps drifted against
the music. A shared beat clock (detected beats + free-running metronome
in the gaps) now drives the clip timeline directly: one choreography
count (0.5s of clip, ~120bpm authoring convention) per music beat, with
a smoothed phase inside each beat. Steps land on the kick at any track
BPM; the variant speed doubles the count rate; move switches and the
procedural dance reuse the same clock.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 10:45:16 +02:00
lucianoandClaude Fable 5 616e70a34d Dancers follow the music clock, not the visual-speed slider
The global speed control multiplies the visual time, which froze the
dance clips at low values (only max speed showed motion). Clip playback,
the dance director and the procedural dance now run on a real-time
clock — only the preset variant speed scales the moves. The translation
unit-rescale also samples the peak of the first keyframes (robust when a
clip starts near the origin) and clamps the factor.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 10:41:38 +02:00
lucianoandClaude Fable 5 43a3431532 Dance clips from foreign rigs: unit rescale + dynamic framing
Clips merged from other Mixamo FBX files can carry hip translations in
a different unit (cm vs m): translation channels are auto-rescaled
against the node's rest pose (first-keyframe ratio > 3x). The dancer
also stays framed: the clip's root motion is cancelled horizontally
(hips world position vs rest) keeping 40% of the vertical bounce, so
travelling moves like moonwalks don't slide out of the camera.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 10:33:17 +02:00
lucianoandClaude Fable 5 6529316bd9 Dance director: multi-clip GLBs switch moves in time with the music
GLBs can carry several animation clips (merged from Mixamo FBX files
with scripts/merge via Blender NLA tracks). The director loops the
current move and switches to a random different one every 16 beats (or
~14s without beats) with a 0.45s pose crossfade (per-node quaternion
nlerp + translation lerp).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 10:21:40 +02:00
lucianoandClaude Fable 5 31bfc96f12 Rigged models dance to the music (Modello 3D family)
Two paths for skinned GLBs with no live body driving them:
- animation clips in the GLB (e.g. Mixamo moves) are parsed (rotation/
  translation channels, nlerp sampling) and looped at the effect speed;
- without clips, a beat-locked procedural dance drives the FK targets:
  arms pump on alternate beats, hips sway, head nods, knees bounce, with
  a free-running metronome keeping the groove between detected beats and
  bass scaling the amplitude.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 00:47:41 +02:00
lucianoandClaude Fable 5 748d036ff6 GLB skinning + Mixamo retargeting: rigged models mirror the tracked body
The GLB loader now reads skins (JOINTS_0/WEIGHTS_0, inverseBindMatrices,
node hierarchy kept instead of baked); a skinned shader variant blends 4
joint matrices per vertex (up to 80 bones). _computeJoints solves FK
retargeting: for each mapped bone (mixamorig arms/forearms/up-legs/legs/
neck/spine) an extra local rotation aligns its chain child with the
world direction measured between the tracked landmarks — the user's
right side drives the character's Left bones (mirror). Interattivo
Avatar: when the loaded GLB has a skeleton it drives the rig (bounding
box from CPU-skinned samples, pelvis-follow track), else the procedural
armoured robot. Validated with a Mixamo Y-Bot: synthetic raised-arm pose
reproduced exactly.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 20:59:37 +02:00
lucianoandClaude Fable 5 88838792e1 Avatar redesign: armoured robot instead of primitive boxes
New primitives (tapered capsule with rounded caps, superellipsoid
rounded box) and a full body redesign: three-segment torso (chest plate,
dark abdomen, pelvis plate) with glowing core and belt light, helmet
with visor/jaw/ears/antenna, shoulder pads, tapered capsule limbs with
elbow/knee joints, hand plates with wrist lights, boots with toe lights.
Two-tone armour tinted by the palette, emissive details in colorB.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 20:44:43 +02:00
lucianoandClaude Fable 5 08414070a9 Interattivo Avatar: a robot whose limbs mirror your tracked body 1:1
Raise your arm and the robot raises its arm. ModelSim gains primitive
meshes (cube/sphere) and renderAvatar(): parts placed by limb matrices
(basis aligned to each bone segment) with the same lighting as the GLB
renderer. interactive.js keeps the mirrored raw landmarks (with depth,
smoothed) and builds the robot every frame: torso sized from the
shoulders, head with accent visor and antenna, articulated arms/legs
with joint spheres, glowing hands, feet. Falls back to the motion mist
when no body is tracked.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 18:39:24 +02:00
lucianoandClaude Fable 5 7f0e8b94a7 Interattivo Modello: camera-driven 3D model puppet
New interactive mode 'model': the webcam motion drives the GLB model as
a physical puppet — a hand swipe spins it with inertia, it leans toward
the motion centroid, strong agitation makes it hop with squash & stretch
and a touch-glow rim. ModelSim.render accepts an optional pose (yaw,
leanX, hopY, squash, rim) and slows its auto-spin when driven live.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 18:18:11 +02:00
lucianoandClaude Fable 5 65fb6ae895 Modello 3D family: audio-reactive GLB model renderer
New model3d.js: minimal GLB loader (JSON+BIN chunks, accessors with
byteStride, node hierarchy baked into vertices, embedded PNG/JPEG base
colour textures) and a WebGL2 renderer on the shared canvas — palette
fill light, beat-pulsing fresnel rim, treble speculars, bass breathing
via normal displacement, orbiting camera auto-fitted to the bounding
box, gradient backdrop with a bass glow. A generated torus knot shows
before any GLB is loaded. 'Carica un modello .glb' button in the SVG
section; the path persists and is re-sent when the output restarts.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 18:12:28 +02:00