Hand — tdlidar_hand

Raise one or both hands in front of the rear camera and have fully-rigged finger skeletons drive your scene.

Category: Camera & Vision · Tier: Free · Needs: rear camera (Vision hand pose; no LiDAR required)

What it does

Tracks up to two hands and rebuilds each as a 21-landmark skeleton — wrist, plus four joints per finger out to each fingertip. The op plots those landmarks as points and draws the finger bones, locking each bone to a fixed length so a finger never stretches or warps as the hand moves toward or away from the camera. Use it to puppet geometry, scrub parameters with a fingertip, or spawn particles from the tips.

OSC in

address type range rate
/tdlidar/body/hands/count int number of hands (0–2) per frame
/tdlidar/body/hands/distance float hand distance, metres per frame
/tdlidar/body/hands/frame int heartbeat — increments every frame so TD knows data is live even when the hand is still per frame
/tdlidar/body/hands/<side>/<landmark> x,y,z + rx,ry,rz 21 landmarks × (x,y normalized image, z metres) + unit bone direction per frame

21 landmark order: wrist, thumb_cmc, thumb_mcp, thumb_ip, thumb_tip, index_mcp, index_pip, index_dip, index_tip, middle_mcp, middle_pip, middle_dip, middle_tip, ring_mcp, ring_pip, ring_dip, ring_tip, pinky_mcp, pinky_pip, pinky_dip, pinky_tip. <side> is left / right, classified by the wrist’s screen position.

Outputs

  • out_pop (POP) — up to 2 × 21 points with the finger-bone topology, lengths locked by rigid IK. This is the hand skeleton you render or instance onto.
  • out1 (CHOP) — tdlidar/body/hands/count, …/distance, …/frame, and the per-landmark channels for mapping and triggers.

Parameters

par default what it does
OSC Port 9000 UDP port to listen on (match the app)
Lock Bone Lengths On rigid-IK clamp so fingers keep constant length regardless of noisy Z (off = raw landmarks)
Z Scale 1.0 depth multiplier; 0 = flatten the hand into the screen plane
Aspect auto screen aspect ratio so the hand isn’t stretched
Pos Scale 1.0 overall size of the hand in your scene
Show Bones On draw finger bones (off = landmark points only)

Quick start (beginner)

  1. In the app, enable Hands and point the rear camera at your hand.
  2. Drop the Hand op. Raise a hand — out_pop fills with a 21-point hand skeleton that follows your fingers.
  3. Wire out_pop into a Geometry COMPRender TOP with a Line MAT to draw the finger bones.
  4. Watch tdlidar/body/hands/count on out1: 0, 1 or 2 tells you how many hands are live.

Advanced patterns

  • Particles from fingertips: select the five *_tip landmarks (thumb_tip, index_tip, …) out of out_pop into a Particle GPU / source POP, so sparks stream off each fingertip you move.
  • Per-finger curl: for one finger, take the unit bone directions (rx,ry,rz of its mcp→pip→dip segments) and feed them through a Math CHOP dot-product to measure how bent the finger is — a clean 0→1 curl value per finger, great for triggering states.
  • Heartbeat = liveness gate: because …/frame increments every frame even when the hand is dead still, compare it to its own delayed value (Lag/Logic) to know the stream is alive vs. the app paused — don’t infer “no movement” as “no data”.
  • Smooth: a Lag CHOP on out1 (or lag on the POP positions) softens tracking noise before driving anything visible.

Gotchas

  • Side is by screen position, not chirality. left/right is decided by where the wrist sits on screen, so it’s stable whether you show palm, back or edge — but it is not anatomical handedness. Don’t assume right = the person’s right hand.
  • Z is metric but noisy; X/Y normalized are the trustworthy shape. Rigid IK (Lock Bone Lengths) exists precisely so depth jitter doesn’t warp the fingers — leave it on unless you specifically want raw landmarks.
  • Data arrives every frame, even when motionless. The …/frame heartbeat means channels keep ticking; gate downstream logic on …/count, not on “did a value change”.
  • Shares the /tdlidar/body/… bucket with Body, Pinch and Gesture.