@chocozhang/three-model-render 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +609 -0
  3. package/dist/camera/index.d.ts +133 -0
  4. package/dist/camera/index.js +291 -0
  5. package/dist/camera/index.js.map +1 -0
  6. package/dist/camera/index.mjs +265 -0
  7. package/dist/camera/index.mjs.map +1 -0
  8. package/dist/core/index.d.ts +102 -0
  9. package/dist/core/index.js +455 -0
  10. package/dist/core/index.js.map +1 -0
  11. package/dist/core/index.mjs +432 -0
  12. package/dist/core/index.mjs.map +1 -0
  13. package/dist/effect/index.d.ts +214 -0
  14. package/dist/effect/index.js +749 -0
  15. package/dist/effect/index.js.map +1 -0
  16. package/dist/effect/index.mjs +728 -0
  17. package/dist/effect/index.mjs.map +1 -0
  18. package/dist/index.d.ts +852 -0
  19. package/dist/index.js +3268 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/index.mjs +3223 -0
  22. package/dist/index.mjs.map +1 -0
  23. package/dist/interaction/index.d.ts +160 -0
  24. package/dist/interaction/index.js +661 -0
  25. package/dist/interaction/index.js.map +1 -0
  26. package/dist/interaction/index.mjs +637 -0
  27. package/dist/interaction/index.mjs.map +1 -0
  28. package/dist/loader/index.d.ts +175 -0
  29. package/dist/loader/index.js +786 -0
  30. package/dist/loader/index.js.map +1 -0
  31. package/dist/loader/index.mjs +758 -0
  32. package/dist/loader/index.mjs.map +1 -0
  33. package/dist/setup/index.d.ts +47 -0
  34. package/dist/setup/index.js +199 -0
  35. package/dist/setup/index.js.map +1 -0
  36. package/dist/setup/index.mjs +178 -0
  37. package/dist/setup/index.mjs.map +1 -0
  38. package/dist/ui/index.d.ts +36 -0
  39. package/dist/ui/index.js +292 -0
  40. package/dist/ui/index.js.map +1 -0
  41. package/dist/ui/index.mjs +271 -0
  42. package/dist/ui/index.mjs.map +1 -0
  43. package/package.json +98 -0
@@ -0,0 +1,852 @@
1
+ import * as THREE from 'three';
2
+ import { OutlinePass } from 'three/examples/jsm/postprocessing/OutlinePass';
3
+ import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer';
4
+ import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
5
+
6
+ interface LabelOptions$1 {
7
+ fontSize?: string;
8
+ color?: string;
9
+ background?: string;
10
+ padding?: string;
11
+ borderRadius?: string;
12
+ updateInterval?: number;
13
+ enableCache?: boolean;
14
+ }
15
+ interface LabelManager$1 {
16
+ pause: () => void;
17
+ resume: () => void;
18
+ dispose: () => void;
19
+ isRunning: () => boolean;
20
+ }
21
+ /**
22
+ * 给子模型添加头顶标签(支持 Mesh 和 Group)- 优化版
23
+ *
24
+ * ✨ 性能优化:
25
+ * - 缓存包围盒,避免每帧重复计算
26
+ * - 支持暂停/恢复更新
27
+ * - 可配置更新间隔,降低 CPU 占用
28
+ * - 只在可见时更新,隐藏时自动暂停
29
+ *
30
+ * @param camera THREE.Camera - 场景摄像机
31
+ * @param renderer THREE.WebGLRenderer - 渲染器,用于屏幕尺寸
32
+ * @param parentModel THREE.Object3D - FBX 根节点或 Group
33
+ * @param modelLabelsMap Record<string,string> - 模型 name → 标签文字 映射表
34
+ * @param options LabelOptions - 可选标签样式配置
35
+ * @returns LabelManager - 包含 pause/resume/dispose 的管理接口
36
+ */
37
+ declare function addChildModelLabels(camera: THREE.Camera, renderer: THREE.WebGLRenderer, parentModel: THREE.Object3D, modelLabelsMap: Record<string, string>, options?: LabelOptions$1): LabelManager$1;
38
+
39
+ type HoverBreathOptions = {
40
+ camera: THREE.Camera;
41
+ scene: THREE.Scene;
42
+ renderer: THREE.WebGLRenderer;
43
+ outlinePass: OutlinePass;
44
+ highlightNames?: string[] | null;
45
+ minStrength?: number;
46
+ maxStrength?: number;
47
+ speed?: number;
48
+ throttleDelay?: number;
49
+ };
50
+ /**
51
+ * 创建单例高亮器 —— 推荐在 mounted 时创建一次
52
+ * 返回 { updateHighlightNames, dispose, getHoveredName } 接口
53
+ *
54
+ * ✨ 性能优化:
55
+ * - 无 hover 对象时自动暂停动画
56
+ * - mousemove 节流处理,避免过度计算
57
+ * - 使用 passive 事件监听器提升滚动性能
58
+ */
59
+ declare function enableHoverBreath(opts: HoverBreathOptions): {
60
+ updateHighlightNames: (names: string[] | null) => void;
61
+ dispose: () => void;
62
+ refreshSelection: () => void;
63
+ getHoveredName: () => string | null;
64
+ };
65
+
66
+ /**
67
+ * 后期处理配置选项
68
+ */
69
+ interface PostProcessingOptions {
70
+ edgeStrength?: number;
71
+ edgeGlow?: number;
72
+ edgeThickness?: number;
73
+ visibleEdgeColor?: string;
74
+ hiddenEdgeColor?: string;
75
+ resolutionScale?: number;
76
+ }
77
+ /**
78
+ * 后期处理管理接口
79
+ */
80
+ interface PostProcessingManager {
81
+ composer: EffectComposer;
82
+ outlinePass: OutlinePass;
83
+ resize: (width?: number, height?: number) => void;
84
+ dispose: () => void;
85
+ }
86
+ /**
87
+ * 初始化描边相关信息(包含 OutlinePass)- 优化版
88
+ *
89
+ * ✨ 功能增强:
90
+ * - 支持窗口 resize 自动更新
91
+ * - 可配置分辨率缩放提升性能
92
+ * - 完善的资源释放管理
93
+ *
94
+ * @param renderer THREE.WebGLRenderer
95
+ * @param scene THREE.Scene
96
+ * @param camera THREE.Camera
97
+ * @param options PostProcessingOptions - 可选配置
98
+ * @returns PostProcessingManager - 包含 composer/outlinePass/resize/dispose 的管理接口
99
+ */
100
+ declare function initPostProcessing(renderer: THREE.WebGLRenderer, scene: THREE.Scene, camera: THREE.Camera, options?: PostProcessingOptions): PostProcessingManager;
101
+
102
+ /**
103
+ * 点击处理器配置选项
104
+ */
105
+ interface ClickHandlerOptions {
106
+ clickThreshold?: number;
107
+ debounceDelay?: number;
108
+ raycasterParams?: {
109
+ near?: number;
110
+ far?: number;
111
+ pointsPrecision?: number;
112
+ };
113
+ enableDynamicThickness?: boolean;
114
+ minThickness?: number;
115
+ maxThickness?: number;
116
+ }
117
+ /**
118
+ * 创建模型点击高亮工具(OutlinePass 版)- 优化版
119
+ *
120
+ * ✨ 功能增强:
121
+ * - 使用 AbortController 统一管理事件生命周期
122
+ * - 支持防抖处理避免频繁触发
123
+ * - 可自定义 Raycaster 参数
124
+ * - 根据相机距离动态调整描边厚度
125
+ *
126
+ * @param camera 相机
127
+ * @param scene 场景
128
+ * @param renderer 渲染器
129
+ * @param outlinePass 已初始化的 OutlinePass
130
+ * @param onClick 点击回调
131
+ * @param options 可选配置
132
+ * @returns dispose 函数,用于清理事件和资源
133
+ */
134
+ declare function createModelClickHandler(camera: THREE.Camera, scene: THREE.Scene, renderer: THREE.WebGLRenderer, outlinePass: OutlinePass, onClick: (object: THREE.Object3D | null, info?: {
135
+ name?: string;
136
+ position?: THREE.Vector3;
137
+ uuid?: string;
138
+ }) => void, options?: ClickHandlerOptions): () => void;
139
+
140
+ type FilterFn = (obj: THREE.Object3D) => boolean;
141
+ /**
142
+ * ArrowGuide - 优化版
143
+ * 箭头引导效果工具,支持高亮模型并淡化其他对象
144
+ *
145
+ * ✨ 优化内容:
146
+ * - 使用 WeakMap 自动回收材质,避免内存泄漏
147
+ * - 使用 AbortController 管理事件生命周期
148
+ * - 添加材质复用机制,减少重复创建
149
+ * - 改进 dispose 逻辑,确保完全释放资源
150
+ * - 添加错误处理和边界检查
151
+ */
152
+ declare class ArrowGuide {
153
+ private renderer;
154
+ private camera;
155
+ private scene;
156
+ private lxMesh;
157
+ private flowActive;
158
+ private modelBrightArr;
159
+ private pointerDownPos;
160
+ private clickThreshold;
161
+ private raycaster;
162
+ private mouse;
163
+ private originalMaterials;
164
+ private fadedMaterials;
165
+ private abortController;
166
+ private ignoreRaycastNames;
167
+ private fadeOpacity;
168
+ private fadeBrightness;
169
+ constructor(renderer: THREE.WebGLRenderer, camera: THREE.Camera, scene: THREE.Scene, options?: {
170
+ clickThreshold?: number;
171
+ ignoreRaycastNames?: string[];
172
+ fadeOpacity?: number;
173
+ fadeBrightness?: number;
174
+ });
175
+ private cacheOriginalMaterial;
176
+ private makeFadedClone;
177
+ private createFadedMaterialFrom;
178
+ /**
179
+ * 设置箭头 Mesh
180
+ */
181
+ setArrowMesh(mesh: THREE.Mesh): void;
182
+ /**
183
+ * 高亮指定模型
184
+ */
185
+ highlight(models: THREE.Object3D[]): void;
186
+ private applyHighlight;
187
+ restore(): void;
188
+ /**
189
+ * 动画更新(每帧调用)
190
+ */
191
+ animate(): void;
192
+ /**
193
+ * 初始化事件监听器
194
+ */
195
+ private initEvents;
196
+ /**
197
+ * 释放所有资源
198
+ */
199
+ dispose(): void;
200
+ }
201
+
202
+ interface LiquidFillerOptions {
203
+ color?: number;
204
+ opacity?: number;
205
+ speed?: number;
206
+ }
207
+ /**
208
+ * LiquidFillerGroup - 优化版
209
+ * 支持单模型或多模型液位动画、独立颜色控制
210
+ *
211
+ * ✨ 优化内容:
212
+ * - 使用 renderer.domElement 替代 window 事件
213
+ * - 使用 AbortController 管理事件生命周期
214
+ * - 添加错误处理和边界检查
215
+ * - 优化动画管理,避免内存泄漏
216
+ * - 完善资源释放逻辑
217
+ */
218
+ declare class LiquidFillerGroup {
219
+ private items;
220
+ private scene;
221
+ private camera;
222
+ private renderer;
223
+ private raycaster;
224
+ private pointerDownPos;
225
+ private clickThreshold;
226
+ private abortController;
227
+ /**
228
+ * 构造函数
229
+ * @param models 单个或多个 THREE.Object3D
230
+ * @param scene 场景
231
+ * @param camera 相机
232
+ * @param renderer 渲染器
233
+ * @param defaultOptions 默认液体选项
234
+ * @param clickThreshold 点击阈值,单位像素
235
+ */
236
+ constructor(models: THREE.Object3D | THREE.Object3D[], scene: THREE.Scene, camera: THREE.Camera, renderer: THREE.WebGLRenderer, defaultOptions?: LiquidFillerOptions, clickThreshold?: number);
237
+ /** pointerdown 记录位置 */
238
+ private handlePointerDown;
239
+ /** pointerup 判断点击空白,恢复原始材质 */
240
+ private handlePointerUp;
241
+ /**
242
+ * 设置液位
243
+ * @param models 单个模型或模型数组
244
+ * @param percent 液位百分比 0~1
245
+ */
246
+ fillTo(models: THREE.Object3D | THREE.Object3D[], percent: number): void;
247
+ /** 设置多个模型液位,percentList 与 items 顺序对应 */
248
+ fillToAll(percentList: number[]): void;
249
+ /** 恢复单个模型原始材质并移除液体 */
250
+ restore(model: THREE.Object3D): void;
251
+ /** 恢复所有模型 */
252
+ restoreAll(): void;
253
+ /** 销毁方法,释放事件和资源 */
254
+ dispose(): void;
255
+ }
256
+
257
+ interface FollowOptions {
258
+ duration?: number;
259
+ padding?: number;
260
+ minDistance?: number;
261
+ maxDistance?: number;
262
+ controls?: {
263
+ target?: THREE.Vector3;
264
+ update?: () => void;
265
+ } | null;
266
+ azimuth?: number;
267
+ elevation?: number;
268
+ easing?: 'linear' | 'easeInOut' | 'easeOut' | 'easeIn';
269
+ onProgress?: (progress: number) => void;
270
+ }
271
+ /**
272
+ * 推荐角度枚举,便于快速选取常见视角
273
+ */
274
+ declare const FOLLOW_ANGLES: {
275
+ /** 等距斜视(默认视角)- 适合建筑、机械设备展示 */
276
+ readonly ISOMETRIC: {
277
+ readonly azimuth: number;
278
+ readonly elevation: number;
279
+ };
280
+ /** 正前视角 - 适合正面展示、UI 对齐 */
281
+ readonly FRONT: {
282
+ readonly azimuth: 0;
283
+ readonly elevation: 0;
284
+ };
285
+ /** 右侧视角 - 适合机械剖面、侧视检查 */
286
+ readonly RIGHT: {
287
+ readonly azimuth: number;
288
+ readonly elevation: 0;
289
+ };
290
+ /** 左侧视角 */
291
+ readonly LEFT: {
292
+ readonly azimuth: number;
293
+ readonly elevation: 0;
294
+ };
295
+ /** 后视角 */
296
+ readonly BACK: {
297
+ readonly azimuth: number;
298
+ readonly elevation: 0;
299
+ };
300
+ /** 顶视图 - 适合地图、平面布局展示 */
301
+ readonly TOP: {
302
+ readonly azimuth: 0;
303
+ readonly elevation: number;
304
+ };
305
+ /** 低角度俯视 - 适合车辆、人物等近地物体 */
306
+ readonly LOW_ANGLE: {
307
+ readonly azimuth: number;
308
+ readonly elevation: number;
309
+ };
310
+ /** 高角度俯视 - 适合鸟瞰、全景浏览 */
311
+ readonly HIGH_ANGLE: {
312
+ readonly azimuth: number;
313
+ readonly elevation: number;
314
+ };
315
+ };
316
+ /**
317
+ * 自动将相机移到目标的斜上角位置,并保证目标在可视范围内(平滑过渡)- 优化版
318
+ *
319
+ * ✨ 优化内容:
320
+ * - 支持多种缓动函数
321
+ * - 添加进度回调
322
+ * - 支持取消动画
323
+ * - WeakMap 跟踪防止泄漏
324
+ * - 完善错误处理
325
+ */
326
+ declare function followModels(camera: THREE.Camera, targets: THREE.Object3D | THREE.Object3D[] | null | undefined, options?: FollowOptions): Promise<void>;
327
+ /**
328
+ * ✨ 取消相机的跟随动画
329
+ */
330
+ declare function cancelFollow(camera: THREE.Camera): void;
331
+
332
+ /**
333
+ * 视角类型
334
+ */
335
+ type ViewPosition = 'front' | 'back' | 'left' | 'right' | 'top' | 'bottom' | 'iso';
336
+ /**
337
+ * 视角配置选项
338
+ */
339
+ interface SetViewOptions {
340
+ distanceFactor?: number;
341
+ duration?: number;
342
+ easing?: 'linear' | 'easeInOut' | 'easeOut' | 'easeIn';
343
+ onProgress?: (progress: number) => void;
344
+ }
345
+ /**
346
+ * 平滑切换相机到模型的最佳视角 - 优化版
347
+ *
348
+ * ✨ 优化内容:
349
+ * - 复用 followModels 逻辑,避免代码重复
350
+ * - 支持更多视角
351
+ * - 配置选项增强
352
+ * - 返回 Promise 支持链式调用
353
+ * - 支持取消动画
354
+ *
355
+ * @param camera THREE.PerspectiveCamera 相机实例
356
+ * @param controls OrbitControls 控制器实例
357
+ * @param targetObj THREE.Object3D 模型对象
358
+ * @param position 视角位置
359
+ * @param options 配置选项
360
+ * @returns Promise<void>
361
+ */
362
+ declare function setView(camera: THREE.PerspectiveCamera, controls: OrbitControls, targetObj: THREE.Object3D, position?: ViewPosition, options?: SetViewOptions): Promise<void>;
363
+ /**
364
+ * ✨ 取消视角切换动画
365
+ */
366
+ declare function cancelSetView(camera: THREE.PerspectiveCamera): void;
367
+ /**
368
+ * ✨ 预设视角快捷方法
369
+ */
370
+ declare const ViewPresets: {
371
+ /**
372
+ * 前视图
373
+ */
374
+ front: (camera: THREE.PerspectiveCamera, controls: OrbitControls, target: THREE.Object3D, options?: SetViewOptions) => Promise<void>;
375
+ /**
376
+ * 等距视图
377
+ */
378
+ isometric: (camera: THREE.PerspectiveCamera, controls: OrbitControls, target: THREE.Object3D, options?: SetViewOptions) => Promise<void>;
379
+ /**
380
+ * 顶视图
381
+ */
382
+ top: (camera: THREE.PerspectiveCamera, controls: OrbitControls, target: THREE.Object3D, options?: SetViewOptions) => Promise<void>;
383
+ };
384
+
385
+ /** 加载参数:现在有默认值 */
386
+ interface LoadOptions {
387
+ manager?: THREE.LoadingManager;
388
+ dracoDecoderPath?: string | null;
389
+ ktx2TranscoderPath?: string | null;
390
+ useKTX2?: boolean;
391
+ mergeGeometries?: boolean;
392
+ maxTextureSize?: number | null;
393
+ useSimpleMaterials?: boolean;
394
+ skipSkinned?: boolean;
395
+ }
396
+ declare function loadModelByUrl(url: string, options?: LoadOptions): Promise<THREE.Object3D>;
397
+ /** 彻底释放对象:几何体,材质和其贴图(危险:共享资源会被释放) */
398
+ declare function disposeObject(obj: THREE.Object3D | null): void;
399
+ /** 释放材质及其贴图 */
400
+ declare function disposeMaterial(mat: any): void;
401
+
402
+ /**
403
+ * Skybox 加载工具
404
+ *
405
+ * 支持:
406
+ * - 立方体贴图:paths: [px, nx, py, ny, pz, nz]
407
+ * - 等距 / HDR 全景:url: 'path/to/scene.hdr' 或 jpg
408
+ *
409
+ * 返回一个 SkyboxHandle,包含对 scene 的修改记录和 dispose() 方法。
410
+ */
411
+ /** 统一返回句柄 */
412
+ type SkyboxHandle = {
413
+ key: string;
414
+ backgroundTexture: THREE.Texture | null;
415
+ envRenderTarget: THREE.WebGLRenderTarget | null;
416
+ pmremGenerator: THREE.PMREMGenerator | null;
417
+ setAsBackground: boolean;
418
+ setAsEnvironment: boolean;
419
+ /** 卸载并释放资源(如果是缓存共享,需要 refCount 逻辑) */
420
+ dispose: () => void;
421
+ };
422
+ /** 加载选项与默认值 */
423
+ interface SkyboxOptions {
424
+ setAsBackground?: boolean;
425
+ setAsEnvironment?: boolean;
426
+ pmremGenerator?: THREE.PMREMGenerator | null;
427
+ useSRGBEncoding?: boolean;
428
+ cache?: boolean;
429
+ }
430
+ /**
431
+ * 加载立方体贴图(6张)
432
+ * @param renderer THREE.WebGLRenderer - 用于 PMREM 生成环境贴图
433
+ * @param scene THREE.Scene
434
+ * @param paths string[] 6 张图片地址,顺序:[px, nx, py, ny, pz, nz]
435
+ * @param opts SkyboxOptions
436
+ */
437
+ declare function loadCubeSkybox(renderer: THREE.WebGLRenderer, scene: THREE.Scene, paths: string[], opts?: SkyboxOptions): Promise<SkyboxHandle>;
438
+ /**
439
+ * 加载等距/单图(支持 HDR via RGBELoader)
440
+ * @param renderer THREE.WebGLRenderer
441
+ * @param scene THREE.Scene
442
+ * @param url string - *.hdr, *.exr, *.jpg, *.png
443
+ * @param opts SkyboxOptions
444
+ */
445
+ declare function loadEquirectSkybox(renderer: THREE.WebGLRenderer, scene: THREE.Scene, url: string, opts?: SkyboxOptions): Promise<SkyboxHandle>;
446
+ type LoadSkyboxParams = {
447
+ type: 'cube';
448
+ paths: string[];
449
+ } | {
450
+ type: 'equirect';
451
+ url: string;
452
+ };
453
+ declare function loadSkybox(renderer: THREE.WebGLRenderer, scene: THREE.Scene, params: LoadSkyboxParams, opts?: SkyboxOptions): Promise<SkyboxHandle>;
454
+ /** 释放一个缓存的 skybox(会减少 refCount,refCount=0 时才真正 dispose) */
455
+ declare function releaseSkybox(handle: SkyboxHandle): void;
456
+
457
+ /**
458
+ * 加载进度回调类型
459
+ */
460
+ type LoadProgressCallback = (progress: number) => void;
461
+ /**
462
+ * 加载选项
463
+ */
464
+ interface LoadSkyOptions {
465
+ background?: boolean;
466
+ onProgress?: LoadProgressCallback;
467
+ onComplete?: () => void;
468
+ onError?: (error: any) => void;
469
+ }
470
+ /**
471
+ * BlueSkyManager - 优化版
472
+ * ---------------------------------------------------------
473
+ * 一个全局单例管理器,用于加载和管理基于 HDR/EXR 的蓝天白云环境贴图。
474
+ *
475
+ * ✨ 优化内容:
476
+ * - 添加加载进度回调
477
+ * - 支持加载取消
478
+ * - 完善错误处理
479
+ * - 返回 Promise 支持异步
480
+ * - 添加加载状态管理
481
+ */
482
+ declare class BlueSkyManager {
483
+ /** three.js 渲染器实例 */
484
+ private renderer;
485
+ /** three.js 场景实例 */
486
+ private scene;
487
+ /** PMREM 生成器,用于将 HDR/EXR 转换为高效的反射贴图 */
488
+ private pmremGen;
489
+ /** 当前环境贴图的 RenderTarget,用于后续释放 */
490
+ private skyRT;
491
+ /** 是否已经初始化 */
492
+ private isInitialized;
493
+ /** ✨ 当前加载器,用于取消加载 */
494
+ private currentLoader;
495
+ /** ✨ 加载状态 */
496
+ private loadingState;
497
+ /**
498
+ * 初始化
499
+ * ---------------------------------------------------------
500
+ * 必须在使用 BlueSkyManager 之前调用一次。
501
+ * @param renderer WebGLRenderer 实例
502
+ * @param scene Three.js 场景
503
+ * @param exposure 曝光度 (默认 1.0)
504
+ */
505
+ init(renderer: THREE.WebGLRenderer, scene: THREE.Scene, exposure?: number): void;
506
+ /**
507
+ * ✨ 加载蓝天 HDR/EXR 贴图并应用到场景(Promise 版本)
508
+ * ---------------------------------------------------------
509
+ * @param exrPath HDR/EXR 文件路径
510
+ * @param options 加载选项
511
+ * @returns Promise<void>
512
+ */
513
+ loadAsync(exrPath: string, options?: LoadSkyOptions): Promise<void>;
514
+ /**
515
+ * 加载蓝天 HDR/EXR 贴图并应用到场景(同步 API,保持向后兼容)
516
+ * ---------------------------------------------------------
517
+ * @param exrPath HDR/EXR 文件路径
518
+ * @param background 是否应用为场景背景 (默认 true)
519
+ */
520
+ load(exrPath: string, background?: boolean): void;
521
+ /**
522
+ * ✨ 取消当前加载
523
+ */
524
+ cancelLoad(): void;
525
+ /**
526
+ * ✨ 获取加载状态
527
+ */
528
+ getLoadingState(): 'idle' | 'loading' | 'loaded' | 'error';
529
+ /**
530
+ * ✨ 是否正在加载
531
+ */
532
+ isLoading(): boolean;
533
+ /**
534
+ * 释放当前的天空贴图资源
535
+ * ---------------------------------------------------------
536
+ * 仅清理 skyRT,不销毁 PMREM
537
+ * 适用于切换 HDR/EXR 文件时调用
538
+ */
539
+ dispose(): void;
540
+ /**
541
+ * 完全销毁 BlueSkyManager
542
+ * ---------------------------------------------------------
543
+ * 包括 PMREMGenerator 的销毁
544
+ * 通常在场景彻底销毁或应用退出时调用
545
+ */
546
+ destroy(): void;
547
+ }
548
+ /**
549
+ * 🌐 全局单例
550
+ * ---------------------------------------------------------
551
+ * 直接导出一个全局唯一的 BlueSkyManager 实例,
552
+ * 保证整个应用中只用一个 PMREMGenerator,性能最佳。
553
+ */
554
+ declare const BlueSky: BlueSkyManager;
555
+
556
+ interface LabelOptions {
557
+ fontSize?: string;
558
+ color?: string;
559
+ background?: string;
560
+ padding?: string;
561
+ borderRadius?: string;
562
+ lift?: number;
563
+ dotSize?: number;
564
+ dotSpacing?: number;
565
+ lineColor?: string;
566
+ lineWidth?: number;
567
+ updateInterval?: number;
568
+ fadeInDuration?: number;
569
+ }
570
+ interface LabelManager {
571
+ updateModel: (model: THREE.Object3D) => void;
572
+ updateLabelsMap: (map: Record<string, string>) => void;
573
+ pause: () => void;
574
+ resume: () => void;
575
+ dispose: () => void;
576
+ }
577
+ /**
578
+ * 创建模型标签(带连线和脉冲圆点)- 优化版
579
+ *
580
+ * ✨ 优化内容:
581
+ * - 支持暂停/恢复更新
582
+ * - 可配置更新间隔
583
+ * - 淡入淡出效果
584
+ * - 缓存包围盒计算
585
+ * - RAF 管理优化
586
+ */
587
+ declare function createModelsLabel(camera: THREE.Camera, renderer: THREE.WebGLRenderer, parentModel: THREE.Object3D, modelLabelsMap: Record<string, string>, options?: LabelOptions): LabelManager;
588
+
589
+ /**
590
+ * GroupExploder - 基于 Three.js 的模型爆炸效果工具(支持 Vue3 + TS)
591
+ * ----------------------------------------------------------------------
592
+ * 该工具用于对指定 Mesh 的集合进行“爆炸 / 还原”动画:
593
+ * - 仅初始化一次(onMounted)
594
+ * - 支持动态切换模型并自动还原上一个模型的爆炸状态
595
+ * - 支持多种排列模式(ring / spiral / grid / radial)
596
+ * - 支持非爆炸对象自动透明化(dimOthers)
597
+ * - 支持摄像机自动前置定位到最佳观察点
598
+ * - 所有动画均采用原生 requestAnimationFrame 实现
599
+ *
600
+ * ----------------------------------------------------------------------
601
+ * 🔧 构造参数
602
+ * ----------------------------------------------------------------------
603
+ * @param scene Three.js 场景实例
604
+ * @param camera Three.js 相机(一般为 PerspectiveCamera)
605
+ * @param controls OrbitControls 控件实例(必须绑定 camera)
606
+ *
607
+ * ----------------------------------------------------------------------
608
+ * 🔥 爆炸参数 ExplodeOptions
609
+ * ----------------------------------------------------------------------
610
+ * 所有参数均可在 explode() 调用时指定,也可设置默认值。
611
+ *
612
+ * type ArrangeMode = 'ring' | 'spiral' | 'grid' | 'radial'
613
+ *
614
+ * @param mode?: ArrangeMode
615
+ * 爆炸排列方式:
616
+ * - 'ring' 环形排列(默认)
617
+ * - 'spiral' 螺旋上升排列
618
+ * - 'grid' 平面网格排列(规则整齐)
619
+ * - 'radial' 从中心点向外扩散
620
+ *
621
+ * @param spacing?: number
622
+ * 相邻爆炸对象之间的间距(默认:2.5)
623
+ *
624
+ * @param duration?: number
625
+ * 爆炸动画时长(ms),原生 rAF 完成(默认:1000)
626
+ *
627
+ * @param lift?: number
628
+ * 爆炸对象整体抬升的高度因子,用于让爆炸看起来更立体(默认:0.6)
629
+ *
630
+ * @param cameraPadding?: number
631
+ * 摄像机贴合爆炸后包围球时的额外安全距离(默认:1.2)
632
+ *
633
+ * @param autoRestorePrev?: boolean
634
+ * 当切换模型时,是否自动 restore 上一个模型的爆炸元素(默认:true)
635
+ *
636
+ * @param dimOthers?: { enabled: boolean; opacity?: number }
637
+ * 非爆炸对象透明化配置:
638
+ * - enabled: true 开启
639
+ * - opacity: number 指定非爆炸对象透明度(默认:0.15)
640
+ *
641
+ * @param debug?: boolean
642
+ * 是否开启调试日志,输出所有内部状态(默认 false)
643
+ *
644
+ *
645
+ * ----------------------------------------------------------------------
646
+ * 📌 方法说明
647
+ * ----------------------------------------------------------------------
648
+ *
649
+ * ◆ setMeshes(meshSet: Set<Mesh>, contextId?: string)
650
+ * 设置当前模型的爆炸 Mesh 集合:
651
+ * - 会记录 Mesh 的初始 transform
652
+ * - 根据 autoRestorePrev 自动还原上次爆炸
653
+ * - 第二个参数 contextId 可选,用于区分业务场景
654
+ *
655
+ *
656
+ * ◆ explode(options?: ExplodeOptions)
657
+ * 对当前 meshSet 执行爆炸动画:
658
+ * - 根据 mode 生成爆炸布局
659
+ * - 相机先自动飞向最佳观察点
660
+ * - 执行 mesh 位移动画
661
+ * - 按需将非爆炸模型透明化
662
+ *
663
+ *
664
+ * ◆ restore(duration?: number)
665
+ * 还原所有爆炸 Mesh 到爆炸前的 transform:
666
+ * - 支持平滑动画
667
+ * - 自动取消透明化
668
+ *
669
+ *
670
+ * ◆ dispose()
671
+ * 移除事件监听、取消动画、清理引用(在组件销毁时调用)
672
+ *
673
+ *
674
+ * ----------------------------------------------------------------------
675
+ * 🎨 排列模式说明
676
+ * ----------------------------------------------------------------------
677
+ *
678
+ * 1. Ring(环形)
679
+ * - 按圆均匀分布
680
+ * - spacing 控制半径
681
+ * - lift 控制整体抬起高度
682
+ *
683
+ * 2. Spiral(螺旋)
684
+ * - 在环形基础上添加高度递增(y++)
685
+ * - 数量大时视觉效果最强
686
+ *
687
+ * 3. Grid(网格)
688
+ * - 类似棋盘布局
689
+ * - spacing 控制网格大小
690
+ * - z 不变或小幅度变化
691
+ *
692
+ * 4. Radial(径向扩散)
693
+ * - 从中心向外 “爆炸式” 发散
694
+ * - 对于大型组件分解展示非常适合
695
+ *
696
+ *
697
+ * ----------------------------------------------------------------------
698
+ * 📌 使用示例(业务层 Vue)
699
+ * ----------------------------------------------------------------------
700
+ *
701
+ * const exploder = new GroupExploder(scene, camera, controls);
702
+ *
703
+ * onMounted(() => {
704
+ * exploder.setMeshes(new Set([meshA, meshB, meshC]));
705
+ * });
706
+ *
707
+ * const triggerExplode = () => {
708
+ * exploder.explode({
709
+ * mode: 'ring',
710
+ * spacing: 3,
711
+ * duration: 1200,
712
+ * lift: 0.8,
713
+ * cameraPadding: 1.3,
714
+ * dimOthers: { enabled: true, opacity: 0.2 },
715
+ * });
716
+ * };
717
+ *
718
+ * const triggerRestore = () => {
719
+ * exploder.restore(600);
720
+ * };
721
+ *
722
+ */
723
+
724
+ type ArrangeMode = 'ring' | 'spiral' | 'grid' | 'radial';
725
+ type ExplodeOptions = {
726
+ mode?: ArrangeMode;
727
+ spacing?: number;
728
+ duration?: number;
729
+ lift?: number;
730
+ cameraPadding?: number;
731
+ autoRestorePrev?: boolean;
732
+ dimOthers?: {
733
+ enabled: boolean;
734
+ opacity?: number;
735
+ };
736
+ debug?: boolean;
737
+ };
738
+ declare class GroupExploder {
739
+ private scene;
740
+ private camera;
741
+ private controls?;
742
+ private currentSet;
743
+ private stateMap;
744
+ private prevSet;
745
+ private prevStateMap;
746
+ private materialContexts;
747
+ private materialSnaps;
748
+ private contextMaterials;
749
+ private animId;
750
+ private cameraAnimId;
751
+ private isExploded;
752
+ private isInitialized;
753
+ onLog?: (s: string) => void;
754
+ constructor(scene: THREE.Scene, camera: THREE.PerspectiveCamera | THREE.Camera, controls?: {
755
+ target?: THREE.Vector3;
756
+ update?: () => void;
757
+ });
758
+ private log;
759
+ init(): void;
760
+ /**
761
+ * setMeshes(newSet):
762
+ * - Detects content-level changes even if same Set reference is used.
763
+ * - Preserves prevSet/stateMap to allow async restore when needed.
764
+ * - Ensures stateMap contains snapshots for *all meshes in the new set*.
765
+ */
766
+ setMeshes(newSet: Set<THREE.Mesh> | null, options?: {
767
+ autoRestorePrev?: boolean;
768
+ restoreDuration?: number;
769
+ }): Promise<void>;
770
+ /**
771
+ * ensureSnapshotsForSet: for each mesh in set, ensure stateMap has an entry.
772
+ * If missing, record current matrixWorld as originalMatrixWorld (best-effort).
773
+ */
774
+ private ensureSnapshotsForSet;
775
+ /**
776
+ * explode: compute targets first, compute targetBound using targets + mesh radii,
777
+ * animate camera to that targetBound, then animate meshes to targets.
778
+ */
779
+ explode(opts?: ExplodeOptions): Promise<void>;
780
+ restore(duration?: number): Promise<void>;
781
+ /**
782
+ * restoreSet: reparent and restore transforms using provided stateMap.
783
+ * If missing stateMap entry for a mesh, use fallbacks:
784
+ * 1) mesh.userData.__originalMatrixWorld (if present)
785
+ * 2) mesh.matrixWorld (current) -> smooth lerp to itself (no-op visually)
786
+ */
787
+ private restoreSet;
788
+ private applyDimToOthers;
789
+ private cleanContextsForMeshes;
790
+ private computeBoundingSphereForMeshes;
791
+ private computeBoundingSphereForPositionsAndMeshes;
792
+ private computeTargetsByMode;
793
+ private animateCameraToFit;
794
+ private getCameraLookAtPoint;
795
+ private cancelAnimations;
796
+ dispose(restoreBefore?: boolean): Promise<void>;
797
+ }
798
+
799
+ interface AutoSetupOptions {
800
+ /** 相机在包围球基础上的额外填充倍数(>1 扩大可视范围) */
801
+ padding?: number;
802
+ /** 相机仰角偏移(弧度),默认小俯视(0.2 rad ≈ 11°) */
803
+ elevation?: number;
804
+ /** 是否启用阴影(shadow) - 性能开销大,默认 false */
805
+ enableShadows?: boolean;
806
+ /** 阴影贴图尺寸,越高越清晰越耗性能,默认 1024 */
807
+ shadowMapSize?: number;
808
+ /** DirectionalLights 的数量(均匀分布在四面) */
809
+ directionalCount?: number;
810
+ /** 是否自动把 mesh.castShadow / mesh.receiveShadow 设置为 true(默认 true) */
811
+ setMeshShadowProps?: boolean;
812
+ /** 如果传入 renderer,则工具会自动启用 renderer.shadowMap(如果 enableShadows 为 true) */
813
+ renderer?: THREE.WebGLRenderer | null;
814
+ }
815
+ /**
816
+ * 返回值句柄,包含 created lights group、computed center/radius、以及 dispose 方法
817
+ */
818
+ type AutoSetupHandle = {
819
+ lightsGroup: THREE.Group;
820
+ center: THREE.Vector3;
821
+ radius: number;
822
+ dispose: () => void;
823
+ updateLightIntensity: (factor: number) => void;
824
+ };
825
+ /**
826
+ * 自动设置相机与基础灯光 - 优化版
827
+ *
828
+ * ✨ 优化内容:
829
+ * - 添加灯光强度调整方法
830
+ * - 完善错误处理
831
+ * - 优化dispose逻辑
832
+ *
833
+ * - camera: THREE.PerspectiveCamera(会被移动并指向模型中心)
834
+ * - scene: THREE.Scene(会把新创建的 light group 加入 scene)
835
+ * - model: THREE.Object3D 已加载的模型(任意 transform/坐标)
836
+ * - options: 可选配置(见 AutoSetupOptions)
837
+ *
838
+ * 返回 AutoSetupHandle,调用方在组件卸载/切换时请调用 handle.dispose()
839
+ */
840
+ declare function autoSetupCameraAndLight(camera: THREE.PerspectiveCamera, scene: THREE.Scene, model: THREE.Object3D, options?: AutoSetupOptions): AutoSetupHandle;
841
+
842
+ /**
843
+ * three-model-render
844
+ * Professional Three.js Model Visualization and Interaction Toolkit
845
+ *
846
+ * @packageDocumentation
847
+ */
848
+
849
+ declare const VERSION = "1.0.0";
850
+
851
+ export { ArrowGuide, BlueSky, FOLLOW_ANGLES, GroupExploder, LiquidFillerGroup, VERSION, ViewPresets, addChildModelLabels, autoSetupCameraAndLight, cancelFollow, cancelSetView, createModelClickHandler, createModelsLabel, disposeMaterial, disposeObject, enableHoverBreath, followModels, initPostProcessing, loadCubeSkybox, loadEquirectSkybox, loadModelByUrl, loadSkybox, releaseSkybox, setView };
852
+ export type { AutoSetupHandle, AutoSetupOptions, ClickHandlerOptions, ExplodeOptions, FilterFn, FollowOptions, HoverBreathOptions, LiquidFillerOptions, LoadOptions, LoadProgressCallback, LoadSkyOptions, LoadSkyboxParams, PostProcessingManager, PostProcessingOptions, SetViewOptions, SkyboxHandle, SkyboxOptions, ViewPosition };