@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,455 @@
1
+ 'use strict';
2
+
3
+ var THREE = require('three');
4
+ var EffectComposer = require('three/examples/jsm/postprocessing/EffectComposer');
5
+ var RenderPass = require('three/examples/jsm/postprocessing/RenderPass');
6
+ var OutlinePass = require('three/examples/jsm/postprocessing/OutlinePass');
7
+ var GammaCorrectionShader = require('three/examples/jsm/shaders/GammaCorrectionShader');
8
+ var ShaderPass = require('three/examples/jsm/postprocessing/ShaderPass');
9
+
10
+ function _interopNamespaceDefault(e) {
11
+ var n = Object.create(null);
12
+ if (e) {
13
+ Object.keys(e).forEach(function (k) {
14
+ if (k !== 'default') {
15
+ var d = Object.getOwnPropertyDescriptor(e, k);
16
+ Object.defineProperty(n, k, d.get ? d : {
17
+ enumerable: true,
18
+ get: function () { return e[k]; }
19
+ });
20
+ }
21
+ });
22
+ }
23
+ n.default = e;
24
+ return Object.freeze(n);
25
+ }
26
+
27
+ var THREE__namespace = /*#__PURE__*/_interopNamespaceDefault(THREE);
28
+
29
+ /**
30
+ * 给子模型添加头顶标签(支持 Mesh 和 Group)- 优化版
31
+ *
32
+ * ✨ 性能优化:
33
+ * - 缓存包围盒,避免每帧重复计算
34
+ * - 支持暂停/恢复更新
35
+ * - 可配置更新间隔,降低 CPU 占用
36
+ * - 只在可见时更新,隐藏时自动暂停
37
+ *
38
+ * @param camera THREE.Camera - 场景摄像机
39
+ * @param renderer THREE.WebGLRenderer - 渲染器,用于屏幕尺寸
40
+ * @param parentModel THREE.Object3D - FBX 根节点或 Group
41
+ * @param modelLabelsMap Record<string,string> - 模型 name → 标签文字 映射表
42
+ * @param options LabelOptions - 可选标签样式配置
43
+ * @returns LabelManager - 包含 pause/resume/dispose 的管理接口
44
+ */
45
+ function addChildModelLabels(camera, renderer, parentModel, modelLabelsMap, options) {
46
+ // 防御性检查:确保 parentModel 已加载
47
+ if (!parentModel || typeof parentModel.traverse !== 'function') {
48
+ console.error('parentModel 无效,请确保 FBX 模型已加载完成');
49
+ return {
50
+ pause: () => { },
51
+ resume: () => { },
52
+ dispose: () => { },
53
+ isRunning: () => false
54
+ };
55
+ }
56
+ // 配置项
57
+ const enableCache = (options === null || options === void 0 ? void 0 : options.enableCache) !== false;
58
+ const updateInterval = (options === null || options === void 0 ? void 0 : options.updateInterval) || 0;
59
+ // 创建标签容器,绝对定位,放在 body 中
60
+ const container = document.createElement('div');
61
+ container.style.position = 'absolute';
62
+ container.style.top = '0';
63
+ container.style.left = '0';
64
+ container.style.pointerEvents = 'none'; // 避免阻挡鼠标事件
65
+ container.style.zIndex = '1000';
66
+ document.body.appendChild(container);
67
+ const labels = [];
68
+ // 状态管理
69
+ let rafId = null;
70
+ let isPaused = false;
71
+ let lastUpdateTime = 0;
72
+ // 遍历所有子模型
73
+ parentModel.traverse((child) => {
74
+ var _a;
75
+ // 只处理 Mesh 或 Group
76
+ if ((child.isMesh || child.type === 'Group')) {
77
+ // 动态匹配 name,防止 undefined
78
+ const labelText = (_a = Object.entries(modelLabelsMap).find(([key]) => child.name.includes(key))) === null || _a === void 0 ? void 0 : _a[1];
79
+ if (!labelText)
80
+ return; // 没有匹配标签则跳过
81
+ // 创建 DOM 标签
82
+ const el = document.createElement('div');
83
+ el.innerText = labelText;
84
+ // 样式直接在 JS 中定义,可通过 options 覆盖
85
+ el.style.position = 'absolute';
86
+ el.style.color = (options === null || options === void 0 ? void 0 : options.color) || '#fff';
87
+ el.style.background = (options === null || options === void 0 ? void 0 : options.background) || 'rgba(0,0,0,0.6)';
88
+ el.style.padding = (options === null || options === void 0 ? void 0 : options.padding) || '4px 8px';
89
+ el.style.borderRadius = (options === null || options === void 0 ? void 0 : options.borderRadius) || '4px';
90
+ el.style.fontSize = (options === null || options === void 0 ? void 0 : options.fontSize) || '14px';
91
+ el.style.transform = 'translate(-50%, -100%)'; // 让标签在模型正上方
92
+ el.style.whiteSpace = 'nowrap';
93
+ el.style.pointerEvents = 'none';
94
+ el.style.transition = 'opacity 0.2s ease';
95
+ // 加入容器
96
+ container.appendChild(el);
97
+ // 初始化缓存
98
+ const cachedBox = new THREE__namespace.Box3().setFromObject(child);
99
+ const center = new THREE__namespace.Vector3();
100
+ cachedBox.getCenter(center);
101
+ const cachedTopPos = new THREE__namespace.Vector3(center.x, cachedBox.max.y, center.z);
102
+ labels.push({
103
+ object: child,
104
+ el,
105
+ cachedBox,
106
+ cachedTopPos,
107
+ needsUpdate: true
108
+ });
109
+ }
110
+ });
111
+ /**
112
+ * 更新缓存的包围盒(仅在模型变换时调用)
113
+ */
114
+ const updateCache = (labelData) => {
115
+ labelData.cachedBox.setFromObject(labelData.object);
116
+ const center = new THREE__namespace.Vector3();
117
+ labelData.cachedBox.getCenter(center);
118
+ labelData.cachedTopPos.set(center.x, labelData.cachedBox.max.y, center.z);
119
+ labelData.needsUpdate = false;
120
+ };
121
+ /**
122
+ * 获取对象顶部世界坐标(使用缓存)
123
+ */
124
+ const getObjectTopPosition = (labelData) => {
125
+ if (enableCache) {
126
+ // 检查对象是否发生变换
127
+ if (labelData.needsUpdate || labelData.object.matrixWorldNeedsUpdate) {
128
+ updateCache(labelData);
129
+ }
130
+ return labelData.cachedTopPos;
131
+ }
132
+ else {
133
+ // 不使用缓存,每次都重新计算
134
+ const box = new THREE__namespace.Box3().setFromObject(labelData.object);
135
+ const center = new THREE__namespace.Vector3();
136
+ box.getCenter(center);
137
+ return new THREE__namespace.Vector3(center.x, box.max.y, center.z);
138
+ }
139
+ };
140
+ /**
141
+ * 更新标签位置函数
142
+ */
143
+ function updateLabels(timestamp = 0) {
144
+ // 检查是否暂停
145
+ if (isPaused) {
146
+ rafId = null;
147
+ return;
148
+ }
149
+ // 检查更新间隔
150
+ if (updateInterval > 0 && timestamp - lastUpdateTime < updateInterval) {
151
+ rafId = requestAnimationFrame(updateLabels);
152
+ return;
153
+ }
154
+ lastUpdateTime = timestamp;
155
+ const width = renderer.domElement.clientWidth;
156
+ const height = renderer.domElement.clientHeight;
157
+ labels.forEach((labelData) => {
158
+ const { el } = labelData;
159
+ const pos = getObjectTopPosition(labelData); // 使用缓存的顶部坐标
160
+ pos.project(camera); // 转到屏幕坐标
161
+ const x = (pos.x * 0.5 + 0.5) * width; // 屏幕 X
162
+ const y = (-(pos.y * 0.5) + 0.5) * height; // 屏幕 Y
163
+ // 控制标签显示/隐藏(摄像机后方隐藏)
164
+ const isVisible = pos.z < 1;
165
+ el.style.opacity = isVisible ? '1' : '0';
166
+ el.style.display = isVisible ? 'block' : 'none';
167
+ el.style.transform = `translate(-50%, -100%) translate(${x}px, ${y}px)`; // 屏幕位置
168
+ });
169
+ rafId = requestAnimationFrame(updateLabels); // 循环更新
170
+ }
171
+ // 启动更新
172
+ updateLabels();
173
+ /**
174
+ * 暂停更新
175
+ */
176
+ const pause = () => {
177
+ isPaused = true;
178
+ if (rafId !== null) {
179
+ cancelAnimationFrame(rafId);
180
+ rafId = null;
181
+ }
182
+ };
183
+ /**
184
+ * 恢复更新
185
+ */
186
+ const resume = () => {
187
+ if (!isPaused)
188
+ return;
189
+ isPaused = false;
190
+ updateLabels();
191
+ };
192
+ /**
193
+ * 检查是否正在运行
194
+ */
195
+ const isRunning = () => !isPaused;
196
+ /**
197
+ * 清理函数:卸载所有 DOM 标签,取消动画,避免内存泄漏
198
+ */
199
+ const dispose = () => {
200
+ pause();
201
+ labels.forEach(({ el }) => {
202
+ if (container.contains(el)) {
203
+ container.removeChild(el);
204
+ }
205
+ });
206
+ if (document.body.contains(container)) {
207
+ document.body.removeChild(container);
208
+ }
209
+ labels.length = 0;
210
+ };
211
+ return {
212
+ pause,
213
+ resume,
214
+ dispose,
215
+ isRunning
216
+ };
217
+ }
218
+
219
+ // src/utils/hoverBreathEffectByNameSingleton.ts
220
+ /**
221
+ * 创建单例高亮器 —— 推荐在 mounted 时创建一次
222
+ * 返回 { updateHighlightNames, dispose, getHoveredName } 接口
223
+ *
224
+ * ✨ 性能优化:
225
+ * - 无 hover 对象时自动暂停动画
226
+ * - mousemove 节流处理,避免过度计算
227
+ * - 使用 passive 事件监听器提升滚动性能
228
+ */
229
+ function enableHoverBreath(opts) {
230
+ const { camera, scene, renderer, outlinePass, highlightNames = null, minStrength = 2, maxStrength = 5, speed = 4, throttleDelay = 16, // 默认约 60fps
231
+ } = opts;
232
+ const raycaster = new THREE__namespace.Raycaster();
233
+ const mouse = new THREE__namespace.Vector2();
234
+ let hovered = null;
235
+ let time = 0;
236
+ let animationId = null;
237
+ // highlightSet: null 表示 all; empty Set 表示 none
238
+ let highlightSet = highlightNames === null ? null : new Set(highlightNames);
239
+ // 节流相关
240
+ let lastMoveTime = 0;
241
+ let rafPending = false;
242
+ function setHighlightNames(names) {
243
+ highlightSet = names === null ? null : new Set(names);
244
+ // 如果当前 hovered 不在新名单中,及时清理 selection
245
+ if (hovered && highlightSet && !highlightSet.has(hovered.name)) {
246
+ hovered = null;
247
+ outlinePass.selectedObjects = [];
248
+ // 暂停动画
249
+ if (animationId !== null) {
250
+ cancelAnimationFrame(animationId);
251
+ animationId = null;
252
+ }
253
+ }
254
+ }
255
+ /**
256
+ * 节流版本的 mousemove 处理
257
+ */
258
+ function onMouseMove(ev) {
259
+ const now = performance.now();
260
+ // 节流:如果距上次处理时间小于阈值,跳过
261
+ if (now - lastMoveTime < throttleDelay) {
262
+ // 使用 RAF 延迟处理,避免丢失最后一次事件
263
+ if (!rafPending) {
264
+ rafPending = true;
265
+ requestAnimationFrame(() => {
266
+ rafPending = false;
267
+ processMouseMove(ev);
268
+ });
269
+ }
270
+ return;
271
+ }
272
+ lastMoveTime = now;
273
+ processMouseMove(ev);
274
+ }
275
+ /**
276
+ * 实际的 mousemove 逻辑
277
+ */
278
+ function processMouseMove(ev) {
279
+ const rect = renderer.domElement.getBoundingClientRect();
280
+ mouse.x = ((ev.clientX - rect.left) / rect.width) * 2 - 1;
281
+ mouse.y = -((ev.clientY - rect.top) / rect.height) * 2 + 1;
282
+ raycaster.setFromCamera(mouse, camera);
283
+ // 深度检测 scene 的所有子对象(true)
284
+ const intersects = raycaster.intersectObjects(scene.children, true);
285
+ if (intersects.length > 0) {
286
+ const obj = intersects[0].object;
287
+ // 判断是否允许被高亮
288
+ const allowed = highlightSet === null ? true : highlightSet.has(obj.name);
289
+ if (allowed) {
290
+ if (hovered !== obj) {
291
+ hovered = obj;
292
+ outlinePass.selectedObjects = [obj];
293
+ // 启动动画(如果未运行)
294
+ if (animationId === null) {
295
+ animate();
296
+ }
297
+ }
298
+ }
299
+ else {
300
+ if (hovered !== null) {
301
+ hovered = null;
302
+ outlinePass.selectedObjects = [];
303
+ // 停止动画
304
+ if (animationId !== null) {
305
+ cancelAnimationFrame(animationId);
306
+ animationId = null;
307
+ }
308
+ }
309
+ }
310
+ }
311
+ else {
312
+ if (hovered !== null) {
313
+ hovered = null;
314
+ outlinePass.selectedObjects = [];
315
+ // 停止动画
316
+ if (animationId !== null) {
317
+ cancelAnimationFrame(animationId);
318
+ animationId = null;
319
+ }
320
+ }
321
+ }
322
+ }
323
+ /**
324
+ * 动画循环 - 只在有 hovered 对象时运行
325
+ */
326
+ function animate() {
327
+ // 如果没有 hovered 对象,停止动画
328
+ if (!hovered) {
329
+ animationId = null;
330
+ return;
331
+ }
332
+ animationId = requestAnimationFrame(animate);
333
+ time += speed * 0.02;
334
+ const strength = minStrength + ((Math.sin(time) + 1) / 2) * (maxStrength - minStrength);
335
+ outlinePass.edgeStrength = strength;
336
+ }
337
+ // 启动(只调用一次)
338
+ // 使用 passive 提升滚动性能
339
+ renderer.domElement.addEventListener('mousemove', onMouseMove, { passive: true });
340
+ // 注意:不在这里启动 animate,等有 hover 对象时再启动
341
+ // refresh: 如果你在某些情况下需要强制清理 selectedObjects
342
+ function refreshSelection() {
343
+ if (hovered && highlightSet && !highlightSet.has(hovered.name)) {
344
+ hovered = null;
345
+ outlinePass.selectedObjects = [];
346
+ if (animationId !== null) {
347
+ cancelAnimationFrame(animationId);
348
+ animationId = null;
349
+ }
350
+ }
351
+ }
352
+ function getHoveredName() {
353
+ return hovered ? hovered.name : null;
354
+ }
355
+ function dispose() {
356
+ renderer.domElement.removeEventListener('mousemove', onMouseMove);
357
+ if (animationId) {
358
+ cancelAnimationFrame(animationId);
359
+ animationId = null;
360
+ }
361
+ outlinePass.selectedObjects = [];
362
+ // 清空引用
363
+ hovered = null;
364
+ highlightSet = null;
365
+ }
366
+ return {
367
+ updateHighlightNames: setHighlightNames,
368
+ dispose,
369
+ refreshSelection,
370
+ getHoveredName,
371
+ };
372
+ }
373
+
374
+ /**
375
+ * 初始化描边相关信息(包含 OutlinePass)- 优化版
376
+ *
377
+ * ✨ 功能增强:
378
+ * - 支持窗口 resize 自动更新
379
+ * - 可配置分辨率缩放提升性能
380
+ * - 完善的资源释放管理
381
+ *
382
+ * @param renderer THREE.WebGLRenderer
383
+ * @param scene THREE.Scene
384
+ * @param camera THREE.Camera
385
+ * @param options PostProcessingOptions - 可选配置
386
+ * @returns PostProcessingManager - 包含 composer/outlinePass/resize/dispose 的管理接口
387
+ */
388
+ function initPostProcessing(renderer, scene, camera, options = {}) {
389
+ // 默认配置
390
+ const { edgeStrength = 4, edgeGlow = 1, edgeThickness = 2, visibleEdgeColor = '#ffee00', hiddenEdgeColor = '#000000', resolutionScale = 1.0 } = options;
391
+ // 获取渲染器实际尺寸
392
+ const getSize = () => {
393
+ const width = renderer.domElement.clientWidth;
394
+ const height = renderer.domElement.clientHeight;
395
+ return {
396
+ width: Math.floor(width * resolutionScale),
397
+ height: Math.floor(height * resolutionScale)
398
+ };
399
+ };
400
+ const size = getSize();
401
+ // 创建 EffectComposer
402
+ const composer = new EffectComposer.EffectComposer(renderer);
403
+ // 基础 RenderPass
404
+ const renderPass = new RenderPass.RenderPass(scene, camera);
405
+ composer.addPass(renderPass);
406
+ // OutlinePass 用于模型描边
407
+ const outlinePass = new OutlinePass.OutlinePass(new THREE__namespace.Vector2(size.width, size.height), scene, camera);
408
+ outlinePass.edgeStrength = edgeStrength;
409
+ outlinePass.edgeGlow = edgeGlow;
410
+ outlinePass.edgeThickness = edgeThickness;
411
+ outlinePass.visibleEdgeColor.set(visibleEdgeColor);
412
+ outlinePass.hiddenEdgeColor.set(hiddenEdgeColor);
413
+ composer.addPass(outlinePass);
414
+ // Gamma 校正
415
+ const gammaPass = new ShaderPass.ShaderPass(GammaCorrectionShader.GammaCorrectionShader);
416
+ composer.addPass(gammaPass);
417
+ /**
418
+ * resize 处理函数
419
+ * @param width 可选宽度,不传则使用 renderer.domElement 的实际宽度
420
+ * @param height 可选高度,不传则使用 renderer.domElement 的实际高度
421
+ */
422
+ const resize = (width, height) => {
423
+ const actualSize = width !== undefined && height !== undefined
424
+ ? { width: Math.floor(width * resolutionScale), height: Math.floor(height * resolutionScale) }
425
+ : getSize();
426
+ // 更新 composer 尺寸
427
+ composer.setSize(actualSize.width, actualSize.height);
428
+ // 更新 outlinePass 分辨率
429
+ outlinePass.resolution.set(actualSize.width, actualSize.height);
430
+ };
431
+ /**
432
+ * 释放资源
433
+ */
434
+ const dispose = () => {
435
+ // 释放所有 passes
436
+ composer.passes.forEach(pass => {
437
+ if (pass.dispose) {
438
+ pass.dispose();
439
+ }
440
+ });
441
+ // 清空 passes 数组
442
+ composer.passes.length = 0;
443
+ };
444
+ return {
445
+ composer,
446
+ outlinePass,
447
+ resize,
448
+ dispose
449
+ };
450
+ }
451
+
452
+ exports.addChildModelLabels = addChildModelLabels;
453
+ exports.enableHoverBreath = enableHoverBreath;
454
+ exports.initPostProcessing = initPostProcessing;
455
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/core/labelManager.ts","../../src/core/hoverEffect.ts","../../src/core/postProcessing.ts"],"sourcesContent":[null,null,null],"names":["THREE","EffectComposer","RenderPass","OutlinePass","ShaderPass","GammaCorrectionShader"],"mappings":"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"}