- 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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>