@chocozhang/three-model-render 1.0.3 → 1.0.4
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.
- package/README.md +93 -96
- package/dist/camera/index.d.ts +59 -36
- package/dist/camera/index.js +77 -57
- package/dist/camera/index.js.map +1 -1
- package/dist/camera/index.mjs +77 -57
- package/dist/camera/index.mjs.map +1 -1
- package/dist/core/index.d.ts +60 -27
- package/dist/core/index.js +124 -95
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs +124 -95
- package/dist/core/index.mjs.map +1 -1
- package/dist/effect/index.d.ts +47 -134
- package/dist/effect/index.js +109 -65
- package/dist/effect/index.js.map +1 -1
- package/dist/effect/index.mjs +109 -65
- package/dist/effect/index.mjs.map +1 -1
- package/dist/index.d.ts +397 -341
- package/dist/index.js +651 -472
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +651 -472
- package/dist/index.mjs.map +1 -1
- package/dist/interaction/index.d.ts +85 -52
- package/dist/interaction/index.js +161 -133
- package/dist/interaction/index.js.map +1 -1
- package/dist/interaction/index.mjs +161 -133
- package/dist/interaction/index.mjs.map +1 -1
- package/dist/loader/index.d.ts +89 -56
- package/dist/loader/index.js +115 -76
- package/dist/loader/index.js.map +1 -1
- package/dist/loader/index.mjs +115 -76
- package/dist/loader/index.mjs.map +1 -1
- package/dist/setup/index.d.ts +28 -18
- package/dist/setup/index.js +33 -24
- package/dist/setup/index.js.map +1 -1
- package/dist/setup/index.mjs +33 -24
- package/dist/setup/index.mjs.map +1 -1
- package/dist/ui/index.d.ts +18 -7
- package/dist/ui/index.js +32 -22
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/index.mjs +32 -22
- package/dist/ui/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/camera/index.js
CHANGED
|
@@ -21,32 +21,42 @@ function _interopNamespaceDefault(e) {
|
|
|
21
21
|
|
|
22
22
|
var THREE__namespace = /*#__PURE__*/_interopNamespaceDefault(THREE);
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
/**
|
|
25
|
+
* @file followModels.ts
|
|
26
|
+
* @description
|
|
27
|
+
* Camera utility to automatically follow and focus on 3D models.
|
|
28
|
+
* It smoothly moves the camera to an optimal viewing position relative to the target object(s).
|
|
29
|
+
*
|
|
30
|
+
* @best-practice
|
|
31
|
+
* - Use `followModels` to focus on a newly selected object.
|
|
32
|
+
* - Call `cancelFollow` before starting a new manual camera interaction if needed.
|
|
33
|
+
* - Adjust `padding` to control how tight the camera framing is.
|
|
34
|
+
*/
|
|
35
|
+
// Use WeakMap to track animations, allowing for cancellation
|
|
26
36
|
const _animationMap = new WeakMap();
|
|
27
37
|
/**
|
|
28
|
-
*
|
|
38
|
+
* Recommended camera angles for quick selection of common views
|
|
29
39
|
*/
|
|
30
40
|
const FOLLOW_ANGLES = {
|
|
31
|
-
/**
|
|
41
|
+
/** Isometric view (default) - suitable for architecture, mechanical equipment */
|
|
32
42
|
ISOMETRIC: { azimuth: Math.PI / 4, elevation: Math.PI / 4 },
|
|
33
|
-
/**
|
|
43
|
+
/** Front view - suitable for frontal display, UI alignment */
|
|
34
44
|
FRONT: { azimuth: 0, elevation: 0 },
|
|
35
|
-
/**
|
|
45
|
+
/** Right view - suitable for mechanical sections, side inspection */
|
|
36
46
|
RIGHT: { azimuth: Math.PI / 2, elevation: 0 },
|
|
37
|
-
/**
|
|
47
|
+
/** Left view */
|
|
38
48
|
LEFT: { azimuth: -Math.PI / 2, elevation: 0 },
|
|
39
|
-
/**
|
|
49
|
+
/** Back view */
|
|
40
50
|
BACK: { azimuth: Math.PI, elevation: 0 },
|
|
41
|
-
/**
|
|
51
|
+
/** Top view - suitable for maps, layout display */
|
|
42
52
|
TOP: { azimuth: 0, elevation: Math.PI / 2 },
|
|
43
|
-
/**
|
|
53
|
+
/** Low angle view - suitable for vehicles, characters near the ground */
|
|
44
54
|
LOW_ANGLE: { azimuth: Math.PI / 4, elevation: Math.PI / 6 },
|
|
45
|
-
/**
|
|
55
|
+
/** High angle view - suitable for bird's eye view, panoramic browsing */
|
|
46
56
|
HIGH_ANGLE: { azimuth: Math.PI / 4, elevation: Math.PI / 3 }
|
|
47
57
|
};
|
|
48
58
|
/**
|
|
49
|
-
*
|
|
59
|
+
* Collection of easing functions
|
|
50
60
|
*/
|
|
51
61
|
const EASING_FUNCTIONS = {
|
|
52
62
|
linear: (t) => t,
|
|
@@ -55,20 +65,21 @@ const EASING_FUNCTIONS = {
|
|
|
55
65
|
easeIn: (t) => t * t * t
|
|
56
66
|
};
|
|
57
67
|
/**
|
|
58
|
-
*
|
|
68
|
+
* Automatically moves the camera to a diagonal position relative to the target,
|
|
69
|
+
* ensuring the target is within the field of view (smooth transition).
|
|
59
70
|
*
|
|
60
|
-
*
|
|
61
|
-
* -
|
|
62
|
-
* -
|
|
63
|
-
* -
|
|
64
|
-
* - WeakMap
|
|
65
|
-
* -
|
|
71
|
+
* Features:
|
|
72
|
+
* - Supports multiple easing functions
|
|
73
|
+
* - Adds progress callback
|
|
74
|
+
* - Supports animation cancellation
|
|
75
|
+
* - Uses WeakMap to track and prevent memory leaks
|
|
76
|
+
* - Robust error handling
|
|
66
77
|
*/
|
|
67
78
|
function followModels(camera, targets, options = {}) {
|
|
68
79
|
var _a, _b, _c, _d, _e, _f;
|
|
69
|
-
//
|
|
80
|
+
// Cancel previous animation
|
|
70
81
|
cancelFollow(camera);
|
|
71
|
-
//
|
|
82
|
+
// Boundary check
|
|
72
83
|
const arr = [];
|
|
73
84
|
if (!targets)
|
|
74
85
|
return Promise.resolve();
|
|
@@ -77,15 +88,15 @@ function followModels(camera, targets, options = {}) {
|
|
|
77
88
|
else
|
|
78
89
|
arr.push(targets);
|
|
79
90
|
if (arr.length === 0) {
|
|
80
|
-
console.warn('followModels:
|
|
91
|
+
console.warn('followModels: Target object is empty');
|
|
81
92
|
return Promise.resolve();
|
|
82
93
|
}
|
|
83
94
|
try {
|
|
84
95
|
const box = new THREE__namespace.Box3();
|
|
85
96
|
arr.forEach((o) => box.expandByObject(o));
|
|
86
|
-
//
|
|
97
|
+
// Check bounding box validity
|
|
87
98
|
if (!isFinite(box.min.x) || !isFinite(box.max.x)) {
|
|
88
|
-
console.warn('followModels:
|
|
99
|
+
console.warn('followModels: Failed to calculate bounding box');
|
|
89
100
|
return Promise.resolve();
|
|
90
101
|
}
|
|
91
102
|
const sphere = new THREE__namespace.Sphere();
|
|
@@ -101,7 +112,7 @@ function followModels(camera, targets, options = {}) {
|
|
|
101
112
|
const elevation = (_e = options.elevation) !== null && _e !== void 0 ? _e : Math.PI / 4;
|
|
102
113
|
const easing = (_f = options.easing) !== null && _f !== void 0 ? _f : 'easeOut';
|
|
103
114
|
const onProgress = options.onProgress;
|
|
104
|
-
//
|
|
115
|
+
// Get easing function
|
|
105
116
|
const easingFn = EASING_FUNCTIONS[easing] || EASING_FUNCTIONS.easeOut;
|
|
106
117
|
let distance = 10;
|
|
107
118
|
if (camera.isPerspectiveCamera) {
|
|
@@ -121,7 +132,7 @@ function followModels(camera, targets, options = {}) {
|
|
|
121
132
|
else {
|
|
122
133
|
distance = camera.position.distanceTo(center);
|
|
123
134
|
}
|
|
124
|
-
//
|
|
135
|
+
// Calculate direction based on azimuth / elevation
|
|
125
136
|
const hx = Math.sin(azimuth);
|
|
126
137
|
const hz = Math.cos(azimuth);
|
|
127
138
|
const dir = new THREE__namespace.Vector3(hx * Math.cos(elevation), Math.sin(elevation), hz * Math.cos(elevation)).normalize();
|
|
@@ -134,7 +145,6 @@ function followModels(camera, targets, options = {}) {
|
|
|
134
145
|
const startTime = performance.now();
|
|
135
146
|
return new Promise((resolve) => {
|
|
136
147
|
const step = (now) => {
|
|
137
|
-
var _a;
|
|
138
148
|
const elapsed = now - startTime;
|
|
139
149
|
const t = Math.min(1, duration > 0 ? elapsed / duration : 1);
|
|
140
150
|
const k = easingFn(t);
|
|
@@ -148,14 +158,16 @@ function followModels(camera, targets, options = {}) {
|
|
|
148
158
|
else {
|
|
149
159
|
camera.lookAt(endTarget);
|
|
150
160
|
}
|
|
151
|
-
(
|
|
152
|
-
|
|
161
|
+
if (camera.updateProjectionMatrix) {
|
|
162
|
+
camera.updateProjectionMatrix();
|
|
163
|
+
}
|
|
164
|
+
// Call progress callback
|
|
153
165
|
if (onProgress) {
|
|
154
166
|
try {
|
|
155
167
|
onProgress(t);
|
|
156
168
|
}
|
|
157
169
|
catch (error) {
|
|
158
|
-
console.error('followModels:
|
|
170
|
+
console.error('followModels: Progress callback error', error);
|
|
159
171
|
}
|
|
160
172
|
}
|
|
161
173
|
if (t < 1) {
|
|
@@ -181,12 +193,12 @@ function followModels(camera, targets, options = {}) {
|
|
|
181
193
|
});
|
|
182
194
|
}
|
|
183
195
|
catch (error) {
|
|
184
|
-
console.error('followModels:
|
|
196
|
+
console.error('followModels: Execution failed', error);
|
|
185
197
|
return Promise.reject(error);
|
|
186
198
|
}
|
|
187
199
|
}
|
|
188
200
|
/**
|
|
189
|
-
*
|
|
201
|
+
* Cancel the camera follow animation
|
|
190
202
|
*/
|
|
191
203
|
function cancelFollow(camera) {
|
|
192
204
|
const rafId = _animationMap.get(camera);
|
|
@@ -196,42 +208,50 @@ function cancelFollow(camera) {
|
|
|
196
208
|
}
|
|
197
209
|
}
|
|
198
210
|
|
|
199
|
-
// src/utils/setView.ts - 优化版
|
|
200
211
|
/**
|
|
201
|
-
*
|
|
212
|
+
* @file setView.ts
|
|
213
|
+
* @description
|
|
214
|
+
* Utility to smoothly transition the camera to preset views (Front, Back, Top, Isometric, etc.).
|
|
215
|
+
*
|
|
216
|
+
* @best-practice
|
|
217
|
+
* - Use `setView` for UI buttons that switch camera angles.
|
|
218
|
+
* - Leverage `ViewPresets` for readable code when using standard views.
|
|
219
|
+
*/
|
|
220
|
+
/**
|
|
221
|
+
* Smoothly switches the camera to the optimal angle for the model.
|
|
202
222
|
*
|
|
203
|
-
*
|
|
204
|
-
* -
|
|
205
|
-
* -
|
|
206
|
-
* -
|
|
207
|
-
* -
|
|
208
|
-
* -
|
|
223
|
+
* Features:
|
|
224
|
+
* - Reuses followModels logic to avoid code duplication
|
|
225
|
+
* - Supports more angles
|
|
226
|
+
* - Enhanced configuration options
|
|
227
|
+
* - Returns Promise to support chaining
|
|
228
|
+
* - Supports animation cancellation
|
|
209
229
|
*
|
|
210
|
-
* @param camera THREE.PerspectiveCamera
|
|
211
|
-
* @param controls OrbitControls
|
|
212
|
-
* @param targetObj THREE.Object3D
|
|
213
|
-
* @param position
|
|
214
|
-
* @param options
|
|
230
|
+
* @param camera THREE.PerspectiveCamera instance
|
|
231
|
+
* @param controls OrbitControls instance
|
|
232
|
+
* @param targetObj THREE.Object3D model object
|
|
233
|
+
* @param position View position
|
|
234
|
+
* @param options Configuration options
|
|
215
235
|
* @returns Promise<void>
|
|
216
236
|
*/
|
|
217
237
|
function setView(camera, controls, targetObj, position = 'front', options = {}) {
|
|
218
238
|
const { distanceFactor = 0.8, duration = 1000, easing = 'easeInOut', onProgress } = options;
|
|
219
|
-
//
|
|
239
|
+
// Boundary check
|
|
220
240
|
if (!targetObj) {
|
|
221
|
-
console.warn('setView:
|
|
241
|
+
console.warn('setView: Target object is empty');
|
|
222
242
|
return Promise.reject(new Error('Target object is required'));
|
|
223
243
|
}
|
|
224
244
|
try {
|
|
225
|
-
//
|
|
245
|
+
// Calculate bounding box
|
|
226
246
|
const box = new THREE__namespace.Box3().setFromObject(targetObj);
|
|
227
247
|
if (!isFinite(box.min.x)) {
|
|
228
|
-
console.warn('setView:
|
|
248
|
+
console.warn('setView: Failed to calculate bounding box');
|
|
229
249
|
return Promise.reject(new Error('Invalid bounding box'));
|
|
230
250
|
}
|
|
231
251
|
const center = box.getCenter(new THREE__namespace.Vector3());
|
|
232
252
|
const size = box.getSize(new THREE__namespace.Vector3());
|
|
233
253
|
const maxSize = Math.max(size.x, size.y, size.z);
|
|
234
|
-
//
|
|
254
|
+
// Use mapping table for creating view angles
|
|
235
255
|
const viewAngles = {
|
|
236
256
|
'front': { azimuth: 0, elevation: 0 },
|
|
237
257
|
'back': { azimuth: Math.PI, elevation: 0 },
|
|
@@ -242,7 +262,7 @@ function setView(camera, controls, targetObj, position = 'front', options = {})
|
|
|
242
262
|
'iso': { azimuth: Math.PI / 4, elevation: Math.PI / 4 }
|
|
243
263
|
};
|
|
244
264
|
const angle = viewAngles[position] || viewAngles.front;
|
|
245
|
-
//
|
|
265
|
+
// Reuse followModels to avoid code duplication
|
|
246
266
|
return followModels(camera, targetObj, {
|
|
247
267
|
duration,
|
|
248
268
|
padding: distanceFactor,
|
|
@@ -254,30 +274,30 @@ function setView(camera, controls, targetObj, position = 'front', options = {})
|
|
|
254
274
|
});
|
|
255
275
|
}
|
|
256
276
|
catch (error) {
|
|
257
|
-
console.error('setView:
|
|
277
|
+
console.error('setView: Execution failed', error);
|
|
258
278
|
return Promise.reject(error);
|
|
259
279
|
}
|
|
260
280
|
}
|
|
261
281
|
/**
|
|
262
|
-
*
|
|
282
|
+
* Cancel view switch animation
|
|
263
283
|
*/
|
|
264
284
|
function cancelSetView(camera) {
|
|
265
285
|
cancelFollow(camera);
|
|
266
286
|
}
|
|
267
287
|
/**
|
|
268
|
-
*
|
|
288
|
+
* Preset view shortcut methods
|
|
269
289
|
*/
|
|
270
290
|
const ViewPresets = {
|
|
271
291
|
/**
|
|
272
|
-
*
|
|
292
|
+
* Front View
|
|
273
293
|
*/
|
|
274
294
|
front: (camera, controls, target, options) => setView(camera, controls, target, 'front', options),
|
|
275
295
|
/**
|
|
276
|
-
*
|
|
296
|
+
* Isometric View
|
|
277
297
|
*/
|
|
278
298
|
isometric: (camera, controls, target, options) => setView(camera, controls, target, 'iso', options),
|
|
279
299
|
/**
|
|
280
|
-
*
|
|
300
|
+
* Top View
|
|
281
301
|
*/
|
|
282
302
|
top: (camera, controls, target, options) => setView(camera, controls, target, 'top', options)
|
|
283
303
|
};
|
package/dist/camera/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/camera/followModels.ts","../../src/camera/setView.ts"],"sourcesContent":[null,null],"names":["THREE"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/camera/followModels.ts","../../src/camera/setView.ts"],"sourcesContent":[null,null],"names":["THREE"],"mappings":"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"}
|
package/dist/camera/index.mjs
CHANGED
|
@@ -1,31 +1,41 @@
|
|
|
1
1
|
import * as THREE from 'three';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
/**
|
|
4
|
+
* @file followModels.ts
|
|
5
|
+
* @description
|
|
6
|
+
* Camera utility to automatically follow and focus on 3D models.
|
|
7
|
+
* It smoothly moves the camera to an optimal viewing position relative to the target object(s).
|
|
8
|
+
*
|
|
9
|
+
* @best-practice
|
|
10
|
+
* - Use `followModels` to focus on a newly selected object.
|
|
11
|
+
* - Call `cancelFollow` before starting a new manual camera interaction if needed.
|
|
12
|
+
* - Adjust `padding` to control how tight the camera framing is.
|
|
13
|
+
*/
|
|
14
|
+
// Use WeakMap to track animations, allowing for cancellation
|
|
5
15
|
const _animationMap = new WeakMap();
|
|
6
16
|
/**
|
|
7
|
-
*
|
|
17
|
+
* Recommended camera angles for quick selection of common views
|
|
8
18
|
*/
|
|
9
19
|
const FOLLOW_ANGLES = {
|
|
10
|
-
/**
|
|
20
|
+
/** Isometric view (default) - suitable for architecture, mechanical equipment */
|
|
11
21
|
ISOMETRIC: { azimuth: Math.PI / 4, elevation: Math.PI / 4 },
|
|
12
|
-
/**
|
|
22
|
+
/** Front view - suitable for frontal display, UI alignment */
|
|
13
23
|
FRONT: { azimuth: 0, elevation: 0 },
|
|
14
|
-
/**
|
|
24
|
+
/** Right view - suitable for mechanical sections, side inspection */
|
|
15
25
|
RIGHT: { azimuth: Math.PI / 2, elevation: 0 },
|
|
16
|
-
/**
|
|
26
|
+
/** Left view */
|
|
17
27
|
LEFT: { azimuth: -Math.PI / 2, elevation: 0 },
|
|
18
|
-
/**
|
|
28
|
+
/** Back view */
|
|
19
29
|
BACK: { azimuth: Math.PI, elevation: 0 },
|
|
20
|
-
/**
|
|
30
|
+
/** Top view - suitable for maps, layout display */
|
|
21
31
|
TOP: { azimuth: 0, elevation: Math.PI / 2 },
|
|
22
|
-
/**
|
|
32
|
+
/** Low angle view - suitable for vehicles, characters near the ground */
|
|
23
33
|
LOW_ANGLE: { azimuth: Math.PI / 4, elevation: Math.PI / 6 },
|
|
24
|
-
/**
|
|
34
|
+
/** High angle view - suitable for bird's eye view, panoramic browsing */
|
|
25
35
|
HIGH_ANGLE: { azimuth: Math.PI / 4, elevation: Math.PI / 3 }
|
|
26
36
|
};
|
|
27
37
|
/**
|
|
28
|
-
*
|
|
38
|
+
* Collection of easing functions
|
|
29
39
|
*/
|
|
30
40
|
const EASING_FUNCTIONS = {
|
|
31
41
|
linear: (t) => t,
|
|
@@ -34,20 +44,21 @@ const EASING_FUNCTIONS = {
|
|
|
34
44
|
easeIn: (t) => t * t * t
|
|
35
45
|
};
|
|
36
46
|
/**
|
|
37
|
-
*
|
|
47
|
+
* Automatically moves the camera to a diagonal position relative to the target,
|
|
48
|
+
* ensuring the target is within the field of view (smooth transition).
|
|
38
49
|
*
|
|
39
|
-
*
|
|
40
|
-
* -
|
|
41
|
-
* -
|
|
42
|
-
* -
|
|
43
|
-
* - WeakMap
|
|
44
|
-
* -
|
|
50
|
+
* Features:
|
|
51
|
+
* - Supports multiple easing functions
|
|
52
|
+
* - Adds progress callback
|
|
53
|
+
* - Supports animation cancellation
|
|
54
|
+
* - Uses WeakMap to track and prevent memory leaks
|
|
55
|
+
* - Robust error handling
|
|
45
56
|
*/
|
|
46
57
|
function followModels(camera, targets, options = {}) {
|
|
47
58
|
var _a, _b, _c, _d, _e, _f;
|
|
48
|
-
//
|
|
59
|
+
// Cancel previous animation
|
|
49
60
|
cancelFollow(camera);
|
|
50
|
-
//
|
|
61
|
+
// Boundary check
|
|
51
62
|
const arr = [];
|
|
52
63
|
if (!targets)
|
|
53
64
|
return Promise.resolve();
|
|
@@ -56,15 +67,15 @@ function followModels(camera, targets, options = {}) {
|
|
|
56
67
|
else
|
|
57
68
|
arr.push(targets);
|
|
58
69
|
if (arr.length === 0) {
|
|
59
|
-
console.warn('followModels:
|
|
70
|
+
console.warn('followModels: Target object is empty');
|
|
60
71
|
return Promise.resolve();
|
|
61
72
|
}
|
|
62
73
|
try {
|
|
63
74
|
const box = new THREE.Box3();
|
|
64
75
|
arr.forEach((o) => box.expandByObject(o));
|
|
65
|
-
//
|
|
76
|
+
// Check bounding box validity
|
|
66
77
|
if (!isFinite(box.min.x) || !isFinite(box.max.x)) {
|
|
67
|
-
console.warn('followModels:
|
|
78
|
+
console.warn('followModels: Failed to calculate bounding box');
|
|
68
79
|
return Promise.resolve();
|
|
69
80
|
}
|
|
70
81
|
const sphere = new THREE.Sphere();
|
|
@@ -80,7 +91,7 @@ function followModels(camera, targets, options = {}) {
|
|
|
80
91
|
const elevation = (_e = options.elevation) !== null && _e !== void 0 ? _e : Math.PI / 4;
|
|
81
92
|
const easing = (_f = options.easing) !== null && _f !== void 0 ? _f : 'easeOut';
|
|
82
93
|
const onProgress = options.onProgress;
|
|
83
|
-
//
|
|
94
|
+
// Get easing function
|
|
84
95
|
const easingFn = EASING_FUNCTIONS[easing] || EASING_FUNCTIONS.easeOut;
|
|
85
96
|
let distance = 10;
|
|
86
97
|
if (camera.isPerspectiveCamera) {
|
|
@@ -100,7 +111,7 @@ function followModels(camera, targets, options = {}) {
|
|
|
100
111
|
else {
|
|
101
112
|
distance = camera.position.distanceTo(center);
|
|
102
113
|
}
|
|
103
|
-
//
|
|
114
|
+
// Calculate direction based on azimuth / elevation
|
|
104
115
|
const hx = Math.sin(azimuth);
|
|
105
116
|
const hz = Math.cos(azimuth);
|
|
106
117
|
const dir = new THREE.Vector3(hx * Math.cos(elevation), Math.sin(elevation), hz * Math.cos(elevation)).normalize();
|
|
@@ -113,7 +124,6 @@ function followModels(camera, targets, options = {}) {
|
|
|
113
124
|
const startTime = performance.now();
|
|
114
125
|
return new Promise((resolve) => {
|
|
115
126
|
const step = (now) => {
|
|
116
|
-
var _a;
|
|
117
127
|
const elapsed = now - startTime;
|
|
118
128
|
const t = Math.min(1, duration > 0 ? elapsed / duration : 1);
|
|
119
129
|
const k = easingFn(t);
|
|
@@ -127,14 +137,16 @@ function followModels(camera, targets, options = {}) {
|
|
|
127
137
|
else {
|
|
128
138
|
camera.lookAt(endTarget);
|
|
129
139
|
}
|
|
130
|
-
(
|
|
131
|
-
|
|
140
|
+
if (camera.updateProjectionMatrix) {
|
|
141
|
+
camera.updateProjectionMatrix();
|
|
142
|
+
}
|
|
143
|
+
// Call progress callback
|
|
132
144
|
if (onProgress) {
|
|
133
145
|
try {
|
|
134
146
|
onProgress(t);
|
|
135
147
|
}
|
|
136
148
|
catch (error) {
|
|
137
|
-
console.error('followModels:
|
|
149
|
+
console.error('followModels: Progress callback error', error);
|
|
138
150
|
}
|
|
139
151
|
}
|
|
140
152
|
if (t < 1) {
|
|
@@ -160,12 +172,12 @@ function followModels(camera, targets, options = {}) {
|
|
|
160
172
|
});
|
|
161
173
|
}
|
|
162
174
|
catch (error) {
|
|
163
|
-
console.error('followModels:
|
|
175
|
+
console.error('followModels: Execution failed', error);
|
|
164
176
|
return Promise.reject(error);
|
|
165
177
|
}
|
|
166
178
|
}
|
|
167
179
|
/**
|
|
168
|
-
*
|
|
180
|
+
* Cancel the camera follow animation
|
|
169
181
|
*/
|
|
170
182
|
function cancelFollow(camera) {
|
|
171
183
|
const rafId = _animationMap.get(camera);
|
|
@@ -175,42 +187,50 @@ function cancelFollow(camera) {
|
|
|
175
187
|
}
|
|
176
188
|
}
|
|
177
189
|
|
|
178
|
-
// src/utils/setView.ts - 优化版
|
|
179
190
|
/**
|
|
180
|
-
*
|
|
191
|
+
* @file setView.ts
|
|
192
|
+
* @description
|
|
193
|
+
* Utility to smoothly transition the camera to preset views (Front, Back, Top, Isometric, etc.).
|
|
194
|
+
*
|
|
195
|
+
* @best-practice
|
|
196
|
+
* - Use `setView` for UI buttons that switch camera angles.
|
|
197
|
+
* - Leverage `ViewPresets` for readable code when using standard views.
|
|
198
|
+
*/
|
|
199
|
+
/**
|
|
200
|
+
* Smoothly switches the camera to the optimal angle for the model.
|
|
181
201
|
*
|
|
182
|
-
*
|
|
183
|
-
* -
|
|
184
|
-
* -
|
|
185
|
-
* -
|
|
186
|
-
* -
|
|
187
|
-
* -
|
|
202
|
+
* Features:
|
|
203
|
+
* - Reuses followModels logic to avoid code duplication
|
|
204
|
+
* - Supports more angles
|
|
205
|
+
* - Enhanced configuration options
|
|
206
|
+
* - Returns Promise to support chaining
|
|
207
|
+
* - Supports animation cancellation
|
|
188
208
|
*
|
|
189
|
-
* @param camera THREE.PerspectiveCamera
|
|
190
|
-
* @param controls OrbitControls
|
|
191
|
-
* @param targetObj THREE.Object3D
|
|
192
|
-
* @param position
|
|
193
|
-
* @param options
|
|
209
|
+
* @param camera THREE.PerspectiveCamera instance
|
|
210
|
+
* @param controls OrbitControls instance
|
|
211
|
+
* @param targetObj THREE.Object3D model object
|
|
212
|
+
* @param position View position
|
|
213
|
+
* @param options Configuration options
|
|
194
214
|
* @returns Promise<void>
|
|
195
215
|
*/
|
|
196
216
|
function setView(camera, controls, targetObj, position = 'front', options = {}) {
|
|
197
217
|
const { distanceFactor = 0.8, duration = 1000, easing = 'easeInOut', onProgress } = options;
|
|
198
|
-
//
|
|
218
|
+
// Boundary check
|
|
199
219
|
if (!targetObj) {
|
|
200
|
-
console.warn('setView:
|
|
220
|
+
console.warn('setView: Target object is empty');
|
|
201
221
|
return Promise.reject(new Error('Target object is required'));
|
|
202
222
|
}
|
|
203
223
|
try {
|
|
204
|
-
//
|
|
224
|
+
// Calculate bounding box
|
|
205
225
|
const box = new THREE.Box3().setFromObject(targetObj);
|
|
206
226
|
if (!isFinite(box.min.x)) {
|
|
207
|
-
console.warn('setView:
|
|
227
|
+
console.warn('setView: Failed to calculate bounding box');
|
|
208
228
|
return Promise.reject(new Error('Invalid bounding box'));
|
|
209
229
|
}
|
|
210
230
|
const center = box.getCenter(new THREE.Vector3());
|
|
211
231
|
const size = box.getSize(new THREE.Vector3());
|
|
212
232
|
const maxSize = Math.max(size.x, size.y, size.z);
|
|
213
|
-
//
|
|
233
|
+
// Use mapping table for creating view angles
|
|
214
234
|
const viewAngles = {
|
|
215
235
|
'front': { azimuth: 0, elevation: 0 },
|
|
216
236
|
'back': { azimuth: Math.PI, elevation: 0 },
|
|
@@ -221,7 +241,7 @@ function setView(camera, controls, targetObj, position = 'front', options = {})
|
|
|
221
241
|
'iso': { azimuth: Math.PI / 4, elevation: Math.PI / 4 }
|
|
222
242
|
};
|
|
223
243
|
const angle = viewAngles[position] || viewAngles.front;
|
|
224
|
-
//
|
|
244
|
+
// Reuse followModels to avoid code duplication
|
|
225
245
|
return followModels(camera, targetObj, {
|
|
226
246
|
duration,
|
|
227
247
|
padding: distanceFactor,
|
|
@@ -233,30 +253,30 @@ function setView(camera, controls, targetObj, position = 'front', options = {})
|
|
|
233
253
|
});
|
|
234
254
|
}
|
|
235
255
|
catch (error) {
|
|
236
|
-
console.error('setView:
|
|
256
|
+
console.error('setView: Execution failed', error);
|
|
237
257
|
return Promise.reject(error);
|
|
238
258
|
}
|
|
239
259
|
}
|
|
240
260
|
/**
|
|
241
|
-
*
|
|
261
|
+
* Cancel view switch animation
|
|
242
262
|
*/
|
|
243
263
|
function cancelSetView(camera) {
|
|
244
264
|
cancelFollow(camera);
|
|
245
265
|
}
|
|
246
266
|
/**
|
|
247
|
-
*
|
|
267
|
+
* Preset view shortcut methods
|
|
248
268
|
*/
|
|
249
269
|
const ViewPresets = {
|
|
250
270
|
/**
|
|
251
|
-
*
|
|
271
|
+
* Front View
|
|
252
272
|
*/
|
|
253
273
|
front: (camera, controls, target, options) => setView(camera, controls, target, 'front', options),
|
|
254
274
|
/**
|
|
255
|
-
*
|
|
275
|
+
* Isometric View
|
|
256
276
|
*/
|
|
257
277
|
isometric: (camera, controls, target, options) => setView(camera, controls, target, 'iso', options),
|
|
258
278
|
/**
|
|
259
|
-
*
|
|
279
|
+
* Top View
|
|
260
280
|
*/
|
|
261
281
|
top: (camera, controls, target, options) => setView(camera, controls, target, 'top', options)
|
|
262
282
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../src/camera/followModels.ts","../../src/camera/setView.ts"],"sourcesContent":[null,null],"names":[],"mappings":";;AAAA;
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/camera/followModels.ts","../../src/camera/setView.ts"],"sourcesContent":[null,null],"names":[],"mappings":"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"}
|