import { Object3D, Raycaster, Face3, Vector3, Vector2, Mesh } from "three"; import { Viewer } from "."; interface Intersect { distance: number; face: Face3; faceIndex: number; object: Object3D; point: Vector3; uv: Vector2; } /** * 点选 * * @export * @param {Viewer} view * @param {number} ptx * @param {number} pty * @returns {(Mesh | undefined)} */ export function PointPick(view: Viewer, ptx: number, pty: number): Mesh | undefined { let raycaster = new Raycaster(); raycaster.setFromCamera({ x: (ptx / view._Width) * 2 - 1, //-1 到 1 所以 (x-(w/2))/(w/2) => y: - (pty / view._Height) * 2 + 1 //y轴相反 }, view.m_Camera.Camera); //https://github.com/mrdoob/three.js/issues/14128 raycaster.ray.origin.set((ptx / view._Width) * 2 - 1, - (pty / view._Height) * 2 + 1, -1).unproject(view.m_Camera.Camera); let minDis = Infinity; let minObj = undefined; view.m_Scene.children.forEach(obj => { if (obj instanceof Mesh) { let intersects: Intersect[] = []; obj.raycast(raycaster, intersects); for (let i of intersects) { if (i.distance < minDis) { minObj = obj; minDis = i.distance; } } } }); return minObj; }