fix(pose_3d): gizmo visibility (use getHelper for r160) + larger wrist hitbox + diagnostics

This commit is contained in:
Adriano Dal Pastro committed 2026-05-21 16:36:09 +02:00
1 parent 0a3ee61007
commit 25c94d3861
1 file changed
+12 -2
+12 -2
View File
@@ -29,12 +29,13 @@ function makeUCS(size = 0.1) {
function makeWristMarker(color) { function makeWristMarker(color) {
const group = new THREE.Group(); const group = new THREE.Group();
const sphere = new THREE.Mesh( const sphere = new THREE.Mesh(
new THREE.SphereGeometry(0.025, 16, 12), new THREE.SphereGeometry(0.04, 16, 12),
new THREE.MeshStandardMaterial({ color, metalness: 0.2, roughness: 0.5 }), new THREE.MeshStandardMaterial({ color, metalness: 0.2, roughness: 0.5 }),
); );
group.add(sphere); group.add(sphere);
group.add(makeUCS(0.07)); group.add(makeUCS(0.07));
group.userData.sphere = sphere; group.userData.sphere = sphere;
group.userData.sphere.userData.kind = 'wrist';
return group; return group;
} }
@@ -130,9 +131,15 @@ function initScene() {
const transform = new TransformControls(camera, renderer.domElement); const transform = new TransformControls(camera, renderer.domElement);
transform.setMode('translate'); transform.setMode('translate');
transform.size = 0.6;
// Disable orbit while dragging gizmo // Disable orbit while dragging gizmo
transform.addEventListener('dragging-changed', (e) => { orbit.enabled = !e.value; }); transform.addEventListener('dragging-changed', (e) => { orbit.enabled = !e.value; });
scene.add(transform); // In r160 the visual helper is exposed via getHelper(); fall back to the
// transform object itself for older versions.
const transformHelper = typeof transform.getHelper === 'function'
? transform.getHelper()
: transform;
scene.add(transformHelper);
state.three = { scene, camera, renderer, orbit, transform }; state.three = { scene, camera, renderer, orbit, transform };
@@ -288,9 +295,11 @@ function setupSelection() {
const candidates = [state.arms.right.userData.sphere, const candidates = [state.arms.right.userData.sphere,
state.arms.left.userData.sphere]; state.arms.left.userData.sphere];
const hits = raycaster.intersectObjects(candidates, false); const hits = raycaster.intersectObjects(candidates, false);
console.log('[pose_3d] click on canvas, raycast hits:', hits.length);
if (hits.length > 0) { if (hits.length > 0) {
const sphere = hits[0].object; const sphere = hits[0].object;
const side = sphere.parent.userData.side; const side = sphere.parent.userData.side;
console.log('[pose_3d] activating side:', side);
activateSide(side); activateSide(side);
} }
}); });
@@ -306,6 +315,7 @@ function activateSide(side) {
ensureGhostInit(side); ensureGhostInit(side);
const { transform } = state.three; const { transform } = state.three;
transform.attach(state.ghosts[side]); transform.attach(state.ghosts[side]);
console.log('[pose_3d] gizmo attached to ghost', side, 'at', state.ghosts[side].position);
state.ghosts[side].visible = true; state.ghosts[side].visible = true;
updateReadout(); updateReadout();
} }