From 6b6be7bff261ff81f22dfb7e4823b49e53ee9fb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=27=C3=A9lectron=20rare?= <108685187+electron-rare@users.noreply.github.com> Date: Sat, 27 Jun 2026 18:59:49 +0200 Subject: [PATCH] feat(viz): skeleton joints to SC via pose/skel Add /pose/skel OSC route emitting nose, shoulders, hips, knees and ankles (18 floats) from _emit_person. Add \poseSkel OSCdef in data_feeds.scd storing the 9 joint positions per pid; cleanup on \poseLeave. --- data_only_viz/pose_bridge.py | 11 +++++++++++ sound_algo/control/data_feeds.scd | 10 ++++++++++ 2 files changed, 21 insertions(+) diff --git a/data_only_viz/pose_bridge.py b/data_only_viz/pose_bridge.py index b347714..5691247 100644 --- a/data_only_viz/pose_bridge.py +++ b/data_only_viz/pose_bridge.py @@ -194,6 +194,17 @@ class PoseSoundBridge: try: self._avbody.send_message("/pose/limb_span", [pid, float(span)]) except OSError: pass + if len(body) >= 29: + def _xy(i): + kp = body[i] + return [float(getattr(kp, "x", 0.0)), float(getattr(kp, "y", 0.0))] + skel = [pid] + for idx in (0, 11, 12, 23, 24, 25, 26, 27, 28): # nose, sh L/R, hip L/R, knee L/R, ank L/R + skel += _xy(idx) + cli.send_message("/pose/skel", skel) + try: self._avbody.send_message("/pose/skel", skel) + except OSError: pass + # ------------------------------------------------------------------ def send_face(self, persons_face: Sequence[Sequence[Any]], persons_face_ids: Sequence[int], t_now: float, diff --git a/sound_algo/control/data_feeds.scd b/sound_algo/control/data_feeds.scd index ec4d63f..84a69fe 100644 --- a/sound_algo/control/data_feeds.scd +++ b/sound_algo/control/data_feeds.scd @@ -496,6 +496,7 @@ OSCdef(\poseLeave, { |msg| ~poseKin.removeAt(pid); ~poseCenter.removeAt(pid); ~poseWrist !? { ~poseWrist.removeAt(pid) }; + ~poseSkel !? { ~poseSkel.removeAt(pid) }; }, '/pose/leave'); OSCdef(\poseHands, { |msg| @@ -521,6 +522,15 @@ OSCdef(\poseWrist, { |msg| ~poseWrist[pid] = e; }, '/pose/wrist'); +~poseSkel = ~poseSkel ? Dictionary.new; +OSCdef(\poseSkel, { |msg| + var pid = msg[1].asInteger; + var p = { |i| (x: msg[2 + (i*2)], y: msg[3 + (i*2)]) }; + ~poseSkel[pid] = ( + nose: p.(0), shL: p.(1), shR: p.(2), hipL: p.(3), hipR: p.(4), + kneeL: p.(5), kneeR: p.(6), ankL: p.(7), ankR: p.(8)); +}, '/pose/skel'); + ~poseCenter = ~poseCenter ? Dictionary.new; OSCdef(\poseCenter, { |msg| var pid = msg[1].asInteger;