// HELPERS _getCameraPosition() { if (!this.viewProjectionMatrix) { return new THREE.Vector3(); } const cam = new THREE.Camera(); const rootInverse = new THREE.Matrix4().getInverse(this.rootTransform); cam.projectionMatrix.elements = this.viewProjectionMatrix; cam.projectionMatrixInverse = new THREE.Matrix4().getInverse(cam.projectionMatrix); // add since three@0.103.0 const campos = new THREE.Vector3(0, 0, 0).unproject(cam).applyMatrix4(rootInverse); return campos; }
useCallback((event, fn) => { prepareRay(event); // If the interaction is captured, take the last known hit instead of raycasting again const hits = state.current.captured && event.type !== 'click' && event.type !== 'wheel' ? state.current.captured : intersect(event, false); if (hits.length) { const unprojectedPoint = new Vector3(mouse.x, mouse.y, 0).unproject(state.current.camera); for (let hit of hits) { let stopped = { current: false }; fn(_extends({}, event, hit, { stopped, unprojectedPoint, ray: defaultRaycaster.ray, // Hijack stopPropagation, which just sets a flag stopPropagation: () => stopped.current = true, sourceEvent: event })); if (stopped.current === true) break; } } return hits; }, [])