← back to Dead Agentabrams
Sync ROOM 01: articulated dancing bears
5f6518a7fd0e2999690ac9a5e2b82c7cd23ddbc9 · 2026-09-01 19:32:53 -0700 · Steve Abrams
Files touched
Diff
commit 5f6518a7fd0e2999690ac9a5e2b82c7cd23ddbc9
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Tue Sep 1 19:32:53 2026 -0700
Sync ROOM 01: articulated dancing bears
---
room/index.html | 47 ++++++++++++++++++++++++++++-------------------
1 file changed, 28 insertions(+), 19 deletions(-)
diff --git a/room/index.html b/room/index.html
index ccf38a4..479325f 100644
--- a/room/index.html
+++ b/room/index.html
@@ -885,29 +885,38 @@ function bearAndFireflies(x,y,s,t,accent){
}
// two bear cubs dancing beside the conductor — bob + rock, bouncing harder on the beat when reactive
+// articulated "puppet-style" dancing bear — jointed limbs swing, hips sway, head bobs; bigger on the beat
function bearCub(x,y,s,t,ph){
- const beat=(S.pulse||0), amp=(S.amp||0);
- const bounce=Math.abs(Math.sin(t*2.4+ph))*(2+beat*4+amp*2.5); // a grounded bop — feet stay near the shore
- const rock=Math.sin(t*2.4+ph)*0.2;
- ctx.save(); ctx.translate(x,y-bounce); ctx.rotate(rock); ctx.scale(s,s);
- cut('rgba(88,42,40,0.98)',2);
- ctx.beginPath(); ctx.ellipse(0,-8,7,9,0,0,7); fillOutline(); // body
- ctx.beginPath(); ctx.arc(0,-20,6,0,7); fillOutline(); // head
- ctx.beginPath(); ctx.arc(-5,-25,2.5,0,7); fillOutline(); // ears
- ctx.beginPath(); ctx.arc(5,-25,2.5,0,7); fillOutline();
- ctx.strokeStyle=OUTLINE; ctx.lineWidth=3; ctx.lineCap='round';
- const sw=Math.sin(t*4.8+ph)*3; // arms wave in the dance
- ctx.beginPath();
- ctx.moveTo(-5,-11); ctx.lineTo(-10+sw,-17);
- ctx.moveTo(5,-11); ctx.lineTo(10+sw,-17);
- ctx.moveTo(-3,0); ctx.lineTo(-3,4);
- ctx.moveTo(3,0); ctx.lineTo(3,4);
- ctx.stroke();
+ const beat=(S.pulse||0), amp=(S.amp||0), e=1+beat*0.9+amp*0.5;
+ const sway=Math.sin(t*2.3+ph)*0.14*e; // hip sway
+ const bob=Math.abs(Math.sin(t*4.6+ph))*(2+beat*3+amp*2); // small grounded bob
+ const step=Math.sin(t*2.3+ph); // alternating legs
+ const arm=Math.sin(t*2.3+ph+0.4); // waving arms
+ const FUR='rgba(84,40,38,0.98)';
+ ctx.save(); ctx.translate(x,y-bob); ctx.scale(s*1.2,s*1.2); ctx.rotate(sway);
+ function limb(px,py,ang,len,w,foot){ // a jointed, outlined limb
+ ctx.save(); ctx.translate(px,py); ctx.rotate(ang); ctx.lineCap='round';
+ ctx.strokeStyle=OUTLINE; ctx.lineWidth=w+2.4; ctx.beginPath(); ctx.moveTo(0,0); ctx.lineTo(0,len); ctx.stroke();
+ ctx.strokeStyle=FUR; ctx.lineWidth=w; ctx.beginPath(); ctx.moveTo(0,0); ctx.lineTo(0,len); ctx.stroke();
+ if(foot){ cut(FUR,1.8); ctx.beginPath(); ctx.ellipse(0,len,3.2,2,0,0,7); fillOutline(); }
+ ctx.restore();
+ }
+ limb(-3.5,-3, 0.15+step*0.45, 12, 6.5, true); // legs (behind body)
+ limb(3.5,-3, 0.15-step*0.45, 12, 6.5, true);
+ cut(FUR,2.6); ctx.beginPath(); ctx.ellipse(0,-12,8.5,11,0,0,7); fillOutline(); // body
+ ctx.fillStyle='rgba(122,68,58,0.9)'; ctx.beginPath(); ctx.ellipse(0,-10,4.5,6,0,0,7); ctx.fill(); // belly
+ limb(-7,-18, -0.7+arm*0.55, 11, 5, true); // arms raised, waving
+ limb(7,-18, 0.7-arm*0.55, 11, 5, true);
+ cut(FUR,2.4); ctx.beginPath(); ctx.arc(0,-30,7,0,7); fillOutline(); // head
+ ctx.beginPath(); ctx.arc(-6,-36,3,0,7); fillOutline(); // ears
+ ctx.beginPath(); ctx.arc(6,-36,3,0,7); fillOutline();
+ cut('rgba(150,96,74,0.98)',1.5); ctx.beginPath(); ctx.ellipse(0,-27,3.6,2.7,0,0,7); fillOutline(); // muzzle
+ ctx.fillStyle=OUTLINE; ctx.beginPath(); ctx.arc(0,-29,1.1,0,7); ctx.fill(); // nose
ctx.restore();
}
function drawBearCubs(bx,by,t,scaleA){
- bearCub(bx-46, by, 1.0*scaleA, t, 0.0);
- bearCub(bx+42, by, 0.9*scaleA, t, 1.7);
+ bearCub(bx-60, by, 1.0*scaleA, t, 0.0);
+ bearCub(bx+54, by, 0.95*scaleA, t, 1.7);
}
// shoreline songbirds that "sing" the music — note-bubbles pop on the beat (♪♫♬, never lyrics)
← 5aaf321 Sync ROOM 01: museum label documents all controls + full cas
·
back to Dead Agentabrams
·
Sync ROOM 01: colorful dancing-bear troupe synced to music c315f1a →