diff --git a/web/pose_3d.js b/web/pose_3d.js index 370c98a..4691bd1 100644 --- a/web/pose_3d.js +++ b/web/pose_3d.js @@ -29,12 +29,13 @@ function makeUCS(size = 0.1) { function makeWristMarker(color) { const group = new THREE.Group(); 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 }), ); group.add(sphere); group.add(makeUCS(0.07)); group.userData.sphere = sphere; + group.userData.sphere.userData.kind = 'wrist'; return group; } @@ -130,9 +131,15 @@ function initScene() { const transform = new TransformControls(camera, renderer.domElement); transform.setMode('translate'); + transform.size = 0.6; // Disable orbit while dragging gizmo 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 }; @@ -288,9 +295,11 @@ function setupSelection() { const candidates = [state.arms.right.userData.sphere, state.arms.left.userData.sphere]; const hits = raycaster.intersectObjects(candidates, false); + console.log('[pose_3d] click on canvas, raycast hits:', hits.length); if (hits.length > 0) { const sphere = hits[0].object; const side = sphere.parent.userData.side; + console.log('[pose_3d] activating side:', side); activateSide(side); } }); @@ -306,6 +315,7 @@ function activateSide(side) { ensureGhostInit(side); const { transform } = state.three; transform.attach(state.ghosts[side]); + console.log('[pose_3d] gizmo attached to ghost', side, 'at', state.ghosts[side].position); state.ghosts[side].visible = true; updateReadout(); }