cube-parameters
Version:
A sophisticated 3D model viewer built with React, TypeScript, and Three.js, featuring advanced visualization tools, measurement capabilities, and lighting controls.
78 lines (63 loc) • 2.37 kB
text/typescript
import * as THREE from 'three';
import { ObjectPool } from './ObjectPool';
const objectPool = ObjectPool.getInstance();
export const createRaycaster = () => {
const raycaster = objectPool.getRaycaster();
const mouse = objectPool.getVector2();
return {
raycaster,
mouse,
dispose: () => {
objectPool.releaseRaycaster(raycaster);
objectPool.releaseVector2(mouse);
}
};
};
export const getIntersectionPoint = (
clientX: number,
clientY: number,
renderer: THREE.WebGLRenderer,
camera: THREE.PerspectiveCamera,
scene: THREE.Scene
): THREE.Vector3 | null => {
const { raycaster, mouse, dispose } = createRaycaster();
const rect = renderer.domElement.getBoundingClientRect();
mouse.x = ((clientX - rect.left) / rect.width) * 2 - 1;
mouse.y = -((clientY - rect.top) / rect.height) * 2 + 1;
raycaster.setFromCamera(mouse, camera);
const intersectableObjects: THREE.Object3D[] = [];
scene.traverse((object) => {
if (object instanceof THREE.Mesh && object.visible) {
intersectableObjects.push(object);
}
});
const intersects = raycaster.intersectObjects(intersectableObjects, true);
const result = intersects.length > 0 ? intersects[0].point.clone() : null;
dispose();
return result;
};
// Cache intersectable objects to avoid repeated traversal
let cachedIntersectableObjects: THREE.Object3D[] = [];
let cacheVersion = 0;
export const getIntersectableObjects = (scene: THREE.Scene, forceRefresh = false) => {
const currentVersion = scene.children.length; // Simple version check
if (forceRefresh || currentVersion !== cacheVersion || cachedIntersectableObjects.length === 0) {
cachedIntersectableObjects = [];
scene.traverse((object) => {
// Include meshes, points, and measurement groups for intersection
if (object instanceof THREE.Mesh && object.visible && !object.userData.isHelper) {
cachedIntersectableObjects.push(object);
}
if ((object.userData.isPoint || object.userData.isMeasurementGroup) && object.visible) {
cachedIntersectableObjects.push(object);
}
});
cacheVersion = currentVersion;
}
return cachedIntersectableObjects;
};
// Function to invalidate cache when scene changes
export const invalidateIntersectableCache = () => {
cachedIntersectableObjects = [];
cacheVersion = 0;
};