@ridp/threejs 1.4.7 → 1.5.0

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 CHANGED
@@ -180,18 +180,20 @@ new ThreeIns(selector: string, options: ThreeInsOptions)
180
180
 
181
181
  ##### setView()
182
182
 
183
- 设置模型视角。
183
+ 设置模型视角 - 通过移动相机位置来实现视角切换。
184
184
 
185
185
  ```javascript
186
186
  threeJsIns.setView(
187
187
  model: Object3D,
188
188
  viewType: ViewType,
189
189
  options?: {
190
- scale?: number, // 缩放比例,1=占满画布,0.5=50%,2=0%(默认: 1)
190
+ scale?: number, // 缩放比例,1=占满画布,0.5=50%,2.0=200%(默认: 0.8)
191
+ position?: string | Vector3, // 模型在画布中的位置
191
192
  showBox?: boolean, // 是否显示包围盒(默认: false)
192
- animate?: boolean, // 是否启用动画(默认: false)
193
+ animate?: boolean, // 是否启用动画(默认: true)
193
194
  duration?: number, // 动画时长(毫秒,默认: 1000)
194
- offset?: Vector3 // 中心点偏移
195
+ offset?: Vector3, // 额外的手动偏移量
196
+ boxColor?: number // 包围盒颜色(默认: 0xffff00)
195
197
  }
196
198
  ): void
197
199
  ```
@@ -202,9 +204,13 @@ threeJsIns.setView(
202
204
  - `ViewType.LEFT` - 左侧视(从左往右)
203
205
  - `ViewType.ISO` - 等轴测视角(对角线上方俯视)
204
206
 
207
+ **position 参数选项:**
208
+ - 字符串选项:`'center'`(居中)、`'top-left'`(左上)、`'top-right'`(右上)、`'bottom-left'`(左下)、`'bottom-right'`(右下)
209
+ - Vector3:自定义偏移向量
210
+
205
211
  **示例:**
206
212
  ```javascript
207
- // 设置等轴测视角,模型占满画布
213
+ // 基础用法 - 设置等轴测视角,模型占满画布
208
214
  threeJsIns.setView(model, ViewType.ISO, {
209
215
  scale: 1.0,
210
216
  showBox: true,
@@ -217,8 +223,73 @@ threeJsIns.setView(model, ViewType.TOP, {
217
223
  scale: 0.5,
218
224
  animate: true
219
225
  });
226
+
227
+ // 使用位置控制 - 左上角显示
228
+ threeJsIns.setView(model, ViewType.ISO, {
229
+ position: 'top-left',
230
+ scale: 0.8
231
+ });
232
+
233
+ // 组合使用 position 和 offset
234
+ threeJsIns.setView(model, ViewType.TOP, {
235
+ position: 'top-left', // 先自动定位到左上
236
+ offset: new THREE.Vector3(50, 0, 0), // 再额外向右偏移 50
237
+ scale: 0.8
238
+ });
239
+ ```
240
+
241
+ ##### setViewByRotation()
242
+
243
+ 通过旋转物体切换视角 - 保持相机固定,通过旋转物体来实现视角切换。
244
+
245
+ ```javascript
246
+ threeJsIns.setViewByRotation(
247
+ model: Object3D,
248
+ viewType: ViewType,
249
+ options?: {
250
+ animate?: boolean, // 是否启用动画(默认: true)
251
+ duration?: number, // 动画时长(毫秒,默认: 1000)
252
+ resetRotation?: boolean // 旋转前是否重置物体旋转(默认: true)
253
+ }
254
+ ): { rotation: object, viewType: string, degrees: object }
255
+ ```
256
+
257
+ **旋转角度配置:**
258
+ - `ViewType.LEFT` - 物体绕 X 轴旋转 45°,Y 轴旋转 45°
259
+ - `ViewType.RIGHT` - 物体绕 Y 轴旋转 90°
260
+ - `ViewType.TOP` - 物体绕 X 轴旋转 90°
261
+ - `ViewType.ISO` - 物体绕 X 轴旋转 45°,Y 轴旋转 45°
262
+
263
+ **示例:**
264
+ ```javascript
265
+ // 左侧视:物体绕 X 轴 45°,Y 轴 45°
266
+ const result = threeJsIns.setViewByRotation(model, ViewType.LEFT);
267
+
268
+ // 俯视:物体绕 X 轴 90°,无动画
269
+ threeJsIns.setViewByRotation(model, ViewType.TOP, {
270
+ animate: false
271
+ });
272
+
273
+ // 自定义动画时间
274
+ threeJsIns.setViewByRotation(model, ViewType.ISO, {
275
+ duration: 1500
276
+ });
277
+
278
+ // 不重置旋转,在当前基础上累加
279
+ threeJsIns.setViewByRotation(model, ViewType.LEFT, {
280
+ resetRotation: false
281
+ });
220
282
  ```
221
283
 
284
+ **两种视角切换方式对比:**
285
+
286
+ | 特性 | setView() | setViewByRotation() |
287
+ |------|-----------|---------------------|
288
+ | 实现方式 | 移动相机位置 | 旋转物体 |
289
+ | 相机位置 | 改变 | 固定 |
290
+ | 物体姿态 | 保持不变 | 改变 |
291
+ | 适用场景 | 通用视角切换 | 特殊视觉效果 |
292
+
222
293
  ##### frameArea()
223
294
 
224
295
  > **⚠️ 已弃用** - 此方法仅为兼容旧版本保留,请使用 `setView()` 方法代替。
@@ -401,6 +472,10 @@ const {
401
472
  getMemoryCacheInfo, // 获取内存缓存统计
402
473
  deleteMemoryCache, // 删除指定模型的内存缓存
403
474
 
475
+ // 缓存迁移和验证 (v1.5.0+)
476
+ cleanLegacyCache, // 清理旧版本格式的缓存数据
477
+ validateCache, // 验证并修复缓存
478
+
404
479
  // 性能监控
405
480
  cacheMonitor // 缓存监控器实例
406
481
  } = loader;
@@ -631,6 +706,92 @@ const model3 = await loader.asyncFetch('/models/car.glb', '1.0.0');
631
706
  // [ asyncFetch ] ====> IndexedDB 缓存命中
632
707
  ```
633
708
 
709
+ ##### 缓存迁移和验证 API (v1.5.0+)
710
+
711
+ **cleanLegacyCache()**
712
+
713
+ 清理旧版本格式的缓存数据,手动触发清理不需要等待数据库版本升级。
714
+
715
+ ```javascript
716
+ const result = await loader.cleanLegacyCache();
717
+
718
+ // 返回值:
719
+ {
720
+ total: 10, // 总记录数
721
+ deleted: 3, // 删除的记录数
722
+ kept: 7, // 保留的记录数
723
+ deletedPaths: [ // 被删除的路径列表
724
+ '/models/old1.glb',
725
+ '/models/old2.glb',
726
+ '/models/old3.glb'
727
+ ]
728
+ }
729
+ ```
730
+
731
+ **validateCache()**
732
+
733
+ 验证并修复缓存完整性。
734
+
735
+ ```javascript
736
+ const result = await loader.validateCache();
737
+
738
+ // 返回值:
739
+ {
740
+ total: 10, // 总记录数
741
+ valid: 8, // 有效记录数
742
+ invalid: 2, // 无效记录数
743
+ repairs: 1 // 修复的操作数
744
+ }
745
+ ```
746
+
747
+ **使用场景:**
748
+
749
+ ```javascript
750
+ // 场景 1: 应用启动时验证缓存
751
+ async function initApp() {
752
+ const { validateCache, asyncFetch } = useGLTFLoader();
753
+
754
+ // 验证并修复缓存
755
+ const result = await validateCache();
756
+ if (result.invalid > 0) {
757
+ console.warn(`发现 ${result.invalid} 条无效缓存,已自动清理`);
758
+ }
759
+
760
+ // 继续加载模型
761
+ const model = await asyncFetch('/models/car.glb', '1.0.0');
762
+ }
763
+
764
+ // 场景 2: 手动清理旧版本格式
765
+ async function cleanupOldCache() {
766
+ const { cleanLegacyCache } = useGLTFLoader();
767
+
768
+ const result = await cleanLegacyCache();
769
+ console.log(`清理完成: 删除 ${result.deleted} 条,保留 ${result.kept} 条`);
770
+ }
771
+
772
+ // 场景 3: 用户遇到缓存问题时一键修复
773
+ async function repairCache() {
774
+ const { validateCache, cleanLegacyCache } = useGLTFLoader();
775
+
776
+ // 先验证
777
+ const validation = await validateCache();
778
+ console.log('验证结果:', validation);
779
+
780
+ // 如果仍有问题,强制清理旧版本
781
+ if (validation.invalid > 0) {
782
+ const cleaned = await cleanLegacyCache();
783
+ console.log('清理结果:', cleaned);
784
+ }
785
+ }
786
+ ```
787
+
788
+ **缓存版本说明:**
789
+
790
+ - **v1-v3 (旧版本)**: 使用序列化对象格式 (`object3DToData`)
791
+ - **v4+ (新版本)**: 直接存储 ArrayBuffer 原始数据
792
+ - **自动迁移**: 数据库会自动从旧版本升级,清理旧格式数据
793
+ - **手动清理**: 可使用 `cleanLegacyCache()` 手动清理
794
+
634
795
  ### useRaycaster()
635
796
 
636
797
  射线拾取工具,用于鼠标交互和物体选择。
@@ -1332,9 +1493,8 @@ otherObjects.castShadow = false;
1332
1493
  A: 使用 `asyncFetch` 的重试机制:
1333
1494
 
1334
1495
  ```javascript
1335
- const [err, model] = await asyncFetch(url, version, {
1336
- retryCount: 5,
1337
- timeout: 60000
1496
+ const [err, model] = await asyncFetch(url, version, null, {
1497
+ maxRetries: 5
1338
1498
  });
1339
1499
 
1340
1500
  if (err || !model) {
@@ -1343,7 +1503,50 @@ if (err || !model) {
1343
1503
  }
1344
1504
  ```
1345
1505
 
1346
- ### Q: 如何清理模型缓存?
1506
+ ### Q: 如何清理旧版本缓存数据?
1507
+
1508
+ A: 使用 `cleanLegacyCache` 方法手动清理旧版本格式:
1509
+
1510
+ ```javascript
1511
+ import { useGLTFLoader } from '@ridp/threejs';
1512
+
1513
+ const { cleanLegacyCache } = useGLTFLoader();
1514
+
1515
+ // 清理旧版本序列化格式
1516
+ const result = await cleanLegacyCache();
1517
+ console.log('清理结果:', result);
1518
+ // 输出: { total: 10, deleted: 3, kept: 7, deletedPaths: [...] }
1519
+ ```
1520
+
1521
+ **自动迁移**: 当用户首次使用新版本时,数据库会自动从 v4 升级到 v5,自动清理旧版本格式数据。
1522
+
1523
+ ### Q: 如何验证缓存完整性?
1524
+
1525
+ A: 使用 `validateCache` 方法:
1526
+
1527
+ ```javascript
1528
+ import { useGLTFLoader } from '@ridp/threejs';
1529
+
1530
+ const { validateCache } = useGLTFLoader();
1531
+
1532
+ // 验证并修复缓存
1533
+ const result = await validateCache();
1534
+ console.log('验证结果:', result);
1535
+ // 输出: { total: 10, valid: 8, invalid: 2, repairs: 1 }
1536
+
1537
+ if (result.invalid > 0) {
1538
+ console.warn(`发现 ${result.invalid} 条无效缓存,已自动清理`);
1539
+ }
1540
+ ```
1541
+
1542
+ ### Q: 升级后原有缓存会被删除吗?
1543
+
1544
+ A: 只有旧版本序列化格式的数据会被删除。ArrayBuffer 格式的数据会被保留。自动迁移过程会:
1545
+ - ✅ 保留所有 ArrayBuffer 格式的数据
1546
+ - ❌ 删除所有旧版本序列化格式的数据
1547
+ - 📊 在控制台输出迁移日志
1548
+
1549
+ ### Q: 如何清空所有缓存?
1347
1550
 
1348
1551
  A: 使用 `clearCache` 方法:
1349
1552
 
@@ -1405,6 +1608,71 @@ function captureScreenshot() {
1405
1608
 
1406
1609
  ## 更新日志
1407
1610
 
1611
+ ### v1.5.0 (2026-01-12)
1612
+
1613
+ **🎉 重大更新:**
1614
+
1615
+ - ✨ **新增 setViewByRotation() 方法**: 通过旋转物体切换视角
1616
+ - 提供另一种视角切换方式(与 setView 互补)
1617
+ - 左视图:物体绕 X 轴 45°,Y 轴旋转 45°
1618
+ - 支持动画过渡和旋转重置选项
1619
+ - 适用于特殊视觉效果需求
1620
+
1621
+ - ✨ **新增 setView() position 参数**: 控制模型在画布中的位置
1622
+ - 支持 5 种预设位置:`center`、`top-left`、`top-right`、`bottom-left`、`bottom-right`
1623
+ - 支持自定义 Vector3 偏移
1624
+ - 可与 offset 参数组合使用
1625
+
1626
+ - ✨ **新增缓存迁移和验证工具**:
1627
+ - 数据库版本升级:v4 → v5
1628
+ - 自动清理旧版本序列化格式数据
1629
+ - 新增 `cleanLegacyCache()` - 手动清理旧版本缓存
1630
+ - 新增 `validateCache()` - 验证并修复缓存完整性
1631
+ - 新增 `cleanLegacyFormats()` - IDBCache 实例方法
1632
+ - 新增 `validateAndRepair()` - IDBCache 实例方法
1633
+
1634
+ - 🔧 **增强 setView() 方法**:
1635
+ - 新增 `position` 参数控制模型在画布中的位置
1636
+ - 新增 `boxColor` 参数自定义包围盒颜色
1637
+ - 优化视角偏移计算逻辑
1638
+ - 完善文档和 JSDoc 注释
1639
+
1640
+ - 🐛 **修复缓存版本兼容性问题**:
1641
+ - 旧版本(v1-v3)使用序列化对象格式
1642
+ - 新版本(v4+)使用 ArrayBuffer 格式
1643
+ - 自动识别并删除旧格式数据
1644
+ - 添加完整的格式验证逻辑
1645
+
1646
+ **API 变更:**
1647
+
1648
+ ```javascript
1649
+ // 新增 setViewByRotation
1650
+ threeJsIns.setViewByRotation(model, ViewType.LEFT, {
1651
+ animate: true,
1652
+ duration: 1000,
1653
+ resetRotation: true
1654
+ });
1655
+
1656
+ // setView 新增 position 参数
1657
+ threeJsIns.setView(model, ViewType.ISO, {
1658
+ position: 'top-left', // 新增:位置控制
1659
+ scale: 0.8,
1660
+ offset: new THREE.Vector3(50, 0, 0)
1661
+ });
1662
+
1663
+ // 缓存迁移和验证
1664
+ const { cleanLegacyCache, validateCache } = useGLTFLoader();
1665
+ await cleanLegacyCache(); // 清理旧版本缓存
1666
+ await validateCache(); // 验证和修复缓存
1667
+ ```
1668
+
1669
+ **迁移说明:**
1670
+
1671
+ - 数据库会自动从 v4 升级到 v5
1672
+ - 旧版本序列化格式数据会被自动删除
1673
+ - ArrayBuffer 格式数据会被保留
1674
+ - 提供手动清理工具供用户使用
1675
+
1408
1676
  ### v1.4.2 (2026-01-07)
1409
1677
 
1410
1678
  **🎉 重大更新:**