import type * as THREE from 'three'; import { Vector2 } from 'three'; import { InteractiveObject } from './node'; export type InteractionManagerOptions = { bindEventsOnBodyElement?: boolean; }; /** * InteractionManager 类 * 用于管理 3D 场景中的用户交互(鼠标和触摸事件)。 * 它负责监听 DOM 事件,通过射线检测(Raycasting)将 2D 屏幕坐标映射到 3D 空间, * 并向相应的 3D 对象分发自定义交互事件。 */ export declare class InteractionManager { renderer: THREE.WebGLRenderer; camera: THREE.Camera; domElement: HTMLElement; bindEventsOnBodyElement: boolean; mouse: Vector2; supportsPointerEvents: boolean; interactiveObjects: InteractiveObject[]; closestObject: InteractiveObject | null; raycaster: THREE.Raycaster; treatTouchEventsAsMouseEvents: boolean; private activeEventTypes; private needsContinuousUpdate; private needsIntersectionUpdate; private lastMousePosition; private intersectionDirty; private _downPosition; private discreteEventCallback; setDiscreteEventCallback: (callback: () => void) => void; /** * 构造函数 * @param renderer Three.js 渲染器 * @param camera Three.js 相机 * @param domElement 监听事件的 DOM 元素 * @param options 配置选项 */ constructor(renderer: THREE.WebGLRenderer, camera: THREE.Camera, domElement: HTMLElement, options?: InteractionManagerOptions); /** * 初始化事件监听 * 绑定鼠标、触摸和指针事件到 DOM 元素或文档。 */ private initHandleEvent; /** * 销毁实例 * 移除所有事件监听器,清理资源。 */ dispose: () => void; /** * 添加交互对象 * 将 3D 对象注册到交互管理器中,使其能接收交互事件。 * @param object 目标 3D 对象 * @param eventTypes 可选,指定该对象需要监听的事件类型,用于性能优化 */ add: (object: THREE.Object3D, eventTypes?: string[]) => void; private updateOptimizationFlags; /** * 移除交互对象 * 从交互管理器中注销 3D 对象。 * @param object 目标 3D 对象 * @param childNames 可选,如果指定,仅移除特定名称的子对象 */ remove: (object: THREE.Object3D, childNames?: string[]) => void; private onDocumentMouseMove; private onDocumentPointerMove; private onTouchMove; private onMouseEvent; private onMouseDown; private onPointerDown; private onTouchStart; private onMouseUp; private onPointerUp; private onTouchEnd; private mapPositionToPoint; /** * 分发事件 * 将交互事件分发给目标 3D 对象。 * @param object 交互对象 * @param event 交互事件 */ private dispatch; /** * 检测射线相交 * 使用射线投射器检测鼠标/触摸位置与 3D 对象的相交情况。 * 计算最近的交点,并更新对象的相交状态。 * @param object 待检测的交互对象 */ private checkIntersection; /** * 基础更新函数 * 执行射线检测,处理 hover (enter/leave/over/out) 等状态变化。 * 根据 activeEventTypes 判断是否需要执行检测。 */ private baseUpdateFn; private throttleUpdateFn; private throttleUpdate; getActiveEventTypes: () => Set; hasActiveEvents: () => boolean; needsContinuousUpdates: () => boolean; registerEventType: (eventType: string) => void; unregisterEventType: (eventType: string) => void; /** * 更新循环 * 通常在渲染循环中调用。 * 根据优化标志决定是执行节流更新还是立即更新。 */ update: () => void; }