From 882f3cc71b2a89f4a40db4fc9700d3a7c3d05511 Mon Sep 17 00:00:00 2001 From: Tom Boullay Date: Wed, 29 Apr 2026 10:52:35 +0200 Subject: [PATCH] feat: improve fist grab depth tracking --- backend/hand_tracker.py | 10 ++++++---- src/components/three/GrabbableObject.tsx | 9 ++++++++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/backend/hand_tracker.py b/backend/hand_tracker.py index 67182e9..71fac5a 100644 --- a/backend/hand_tracker.py +++ b/backend/hand_tracker.py @@ -76,15 +76,17 @@ class HandTracker: result.hand_landmarks, result.handedness, ): - index_tip = landmarks[8] + palm_center = self._average_points( + [landmarks[0], landmarks[5], landmarks[9], landmarks[13], landmarks[17]], + ) is_fist = self._is_fist(landmarks) handedness = handedness_categories[0] hands.append( HandData( - x=index_tip.x, - y=index_tip.y, - z=index_tip.z, + x=palm_center["x"], + y=palm_center["y"], + z=palm_center["z"], landmarks=[ {"x": point.x, "y": point.y, "z": point.z} for point in landmarks diff --git a/src/components/three/GrabbableObject.tsx b/src/components/three/GrabbableObject.tsx index d72c645..9d6d4e3 100644 --- a/src/components/three/GrabbableObject.tsx +++ b/src/components/three/GrabbableObject.tsx @@ -64,6 +64,7 @@ export function GrabbableObject({ const rbRef = useRef(null); const isHolding = useRef(false); const isHandHolding = useRef(false); + const handHoldDistance = useRef(null); useDebugFolder("GrabbableObject", (folder) => { folder @@ -123,17 +124,23 @@ export function GrabbableObject({ : []; isHandHolding.current = isObjectInRange && hits.length > 0; + handHoldDistance.current = isHandHolding.current + ? hits[0].distance + : null; } } else { isHandHolding.current = false; + handHoldDistance.current = null; } if (!isHolding.current && !isHandHolding.current) return; if (fistHand && isHandHolding.current) { + const holdDistance = handHoldDistance.current ?? params.holdDistance; + _holdTarget .copy(_cameraPos) - .addScaledVector(_handDirection, params.holdDistance); + .addScaledVector(_handDirection, holdDistance); } else { camera.getWorldDirection(_holdTarget); _holdTarget.multiplyScalar(params.holdDistance).add(camera.position);