u-space 0.0.7 → 0.0.9

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 (40) hide show
  1. package/dist/index.cjs +16 -1
  2. package/dist/index.js +1578 -534
  3. package/dist/src/effects/MaterialEffects.d.ts +23 -0
  4. package/dist/src/index.d.ts +1 -0
  5. package/dist/src/interactions/InteractionManager.d.ts +31 -0
  6. package/dist/src/interactions/Selection.d.ts +77 -0
  7. package/dist/src/interactions/index.d.ts +1 -0
  8. package/dist/src/managers/LightManager.d.ts +101 -0
  9. package/dist/src/managers/ObjectManager.d.ts +33 -1
  10. package/dist/src/managers/SceneManager.d.ts +57 -0
  11. package/dist/src/managers/index.d.ts +2 -0
  12. package/dist/src/objects/Model.d.ts +13 -1
  13. package/dist/src/tools/AnnotationManager.d.ts +104 -0
  14. package/dist/src/tools/ClippingTool.d.ts +96 -0
  15. package/dist/src/tools/MeasureTool.d.ts +80 -0
  16. package/dist/src/tools/index.d.ts +3 -0
  17. package/dist/src/viewers/CameraControls.d.ts +23 -0
  18. package/dist/src/viewers/Viewer.d.ts +52 -1
  19. package/docs/api-camera-controls.md +146 -0
  20. package/docs/api-effects.md +47 -5
  21. package/docs/api-interactions.md +107 -7
  22. package/docs/api-managers.md +181 -0
  23. package/docs/api-objects.md +46 -13
  24. package/docs/api-plugin-atmosphere.md +10 -0
  25. package/docs/api-plugin-curve-movement.md +38 -0
  26. package/docs/api-plugin-keyboard-controls.md +40 -0
  27. package/docs/api-plugin-minimap.md +36 -0
  28. package/docs/api-plugin-object-controls.md +67 -0
  29. package/docs/api-plugin-tiles.md +26 -0
  30. package/docs/api-plugin-topology-drawer.md +74 -0
  31. package/docs/api-plugin-tracking-controls.md +23 -0
  32. package/docs/api-plugin-u-manager.md +123 -0
  33. package/docs/api-tools.md +254 -0
  34. package/docs/api-viewer.md +85 -19
  35. package/docs/changelog.md +105 -0
  36. package/docs/examples-guide.md +104 -0
  37. package/docs/getting-started.md +1 -1
  38. package/docs/index.md +14 -12
  39. package/package.json +1 -1
  40. package/docs/api-plugins.md +0 -449
@@ -39,31 +39,31 @@ const myModel = new Model();
39
39
  `loadAsync` 方法负责从 URL 加载资产并将其添加到组中。
40
40
 
41
41
  ```typescript
42
- await myModel.loadAsync(options: ModelLoadOptions)
42
+ await myModel.loadAsync(parameters: ModelParameters)
43
43
  ```
44
44
 
45
- #### `ModelLoadOptions`
45
+ #### `ModelParameters`
46
46
 
47
- | 属性 | 类型 | 说明 |
48
- | :----------- | :-------- | :----------------------------------------------------------------------------------------------------------------- |
49
- | `url` | `string` | `.gltf` 或 `.glb` 文件的 URL。 |
50
- | `cache` | `boolean` | (可选)启用内存缓存。若模型已加载过,则直接从内存中获取。默认 `false`。 |
51
- | `persistent` | `boolean` | (可选)使用浏览器 Cache API 启用持久化磁盘缓存,适合较大的模型。默认 `false`。 |
47
+ | 属性 | 类型 | 默认值 | 说明 |
48
+ | :----------- | :-------- | :----- | :-------------------------------------------------------------------------------------- |
49
+ | `url` | `string` | — | `.gltf` 或 `.glb` 文件的 URL。 |
50
+ | `cache` | `boolean` | `true` | 启用内存缓存。若模型已加载过,则直接从内存中获取并克隆。 |
51
+ | `persistent` | `boolean` | `true` | 使用浏览器 Cache API 启用持久化磁盘缓存,适合较大的模型。 |
52
52
 
53
53
  #### 缓存示例
54
54
 
55
55
  ```javascript
56
- // 从网络加载并持久化
56
+ // 默认开启双层缓存,直接加载即可
57
57
  const model1 = new Model();
58
- model1.loadAsync({ url: 'model.glb', persistent: true });
58
+ model1.loadAsync({ url: 'model.glb' });
59
59
 
60
- // 稍后,将从 Cache API 加载
60
+ // 禁用内存缓存(每次都从网络或持久化缓存重新加载)
61
61
  const model2 = new Model();
62
- model2.loadAsync({ url: 'model.glb', persistent: true });
62
+ model2.loadAsync({ url: 'model.glb', cache: false });
63
63
 
64
- // 从内存缓存快速加载
64
+ // 完全禁用缓存
65
65
  const model3 = new Model();
66
- model3.loadAsync({ url: 'model.glb', cache: true, persistent: true });
66
+ model3.loadAsync({ url: 'model.glb', cache: false, persistent: false });
67
67
  ```
68
68
 
69
69
  ### 动画
@@ -124,6 +124,39 @@ viewer.addEventListener('beforeRender', (e) => {
124
124
  });
125
125
  ```
126
126
 
127
+ ### 空间查询
128
+
129
+ #### `getBoundingBox()`
130
+
131
+ 获取模型的轴对齐包围盒(AABB)。
132
+
133
+ ```typescript
134
+ const box = myModel.getBoundingBox();
135
+ const size = box.getSize(new Vector3());
136
+ console.log('模型尺寸:', size);
137
+ ```
138
+
139
+ #### `getCenter()`
140
+
141
+ 获取模型包围盒的中心点。
142
+
143
+ ```typescript
144
+ const center = myModel.getCenter();
145
+ console.log('模型中心:', center);
146
+ ```
147
+
148
+ ### 材质操作
149
+
150
+ #### `setMaterial(material)`
151
+
152
+ 将模型内所有 Mesh 的材质统一替换为指定材质。
153
+
154
+ ```typescript
155
+ import { MeshStandardMaterial } from 'three/webgpu';
156
+
157
+ myModel.setMaterial(new MeshStandardMaterial({ color: 0xff0000 }));
158
+ ```
159
+
127
160
  ### 清除缓存
128
161
 
129
162
  可通过 `Model` 类的静态方法手动清除内部缓存:
@@ -0,0 +1,10 @@
1
+ # atmosphere
2
+
3
+ 天空和大气渲染插件。目前为占位实现,`enable()` / `disable()` / `dispose()` 方法可用,但尚未实现具体功能。
4
+
5
+ ```typescript
6
+ import { Atmosphere } from 'u-space/plugins/atmosphere';
7
+
8
+ const atmosphere = new Atmosphere(viewer);
9
+ atmosphere.enable();
10
+ ```
@@ -0,0 +1,38 @@
1
+ # curve-movement
2
+
3
+ 沿样条路径对相机或对象进行动画。提供两个具体子类:`CurveMovementCamera` 和 `CurveMovementObject`。
4
+
5
+ ```typescript
6
+ import { CurveMovementObject } from 'u-space/plugins/curve-movement';
7
+ import { Vector3 } from 'three/webgpu';
8
+
9
+ const movement = new CurveMovementObject(viewer, myModel);
10
+ movement.setFromPoints([
11
+ new Vector3(0, 0, 0),
12
+ new Vector3(10, 2, 0),
13
+ new Vector3(20, 0, 10),
14
+ ]);
15
+ movement.speed = 0.05; // 每秒进度
16
+ movement.loop = 'repeat'; // 'once' | 'repeat' | 'pingpong'
17
+ movement.autoLookAt = true;
18
+
19
+ movement.play();
20
+ // movement.pause() / movement.resume() / movement.stop()
21
+
22
+ // 监听事件
23
+ movement.addEventListener('update', ({ progress }) => console.log(progress));
24
+ movement.addEventListener('complete', () => console.log('完成'));
25
+ ```
26
+
27
+ **`CurveMovement` 属性:**
28
+
29
+ | 属性 | 类型 | 默认值 | 说明 |
30
+ | :-------------- | :--------------------------------- | :-------- | :----------------------------------- |
31
+ | `path` | `Curve<Vector3> \| null` | `null` | 样条路径。 |
32
+ | `progress` | `number` | `0` | 当前归一化进度(0–1)。 |
33
+ | `speed` | `number` | `0.1` | 每秒进度单位。 |
34
+ | `loop` | `'once' \| 'repeat' \| 'pingpong'` | `'once'` | 循环行为。 |
35
+ | `autoLookAt` | `boolean` | `true` | 朝向路径切线方向。 |
36
+ | `lookAtOffset` | `number` | `0` | Y 轴旋转偏移量(弧度)。 |
37
+ | `positionOffset`| `Vector3` | `(0,0,0)` | 叠加到每个位置上的世界坐标偏移量。 |
38
+ | `direction` | `1 \| -1` | `1` | 当前行进方向。 |
@@ -0,0 +1,40 @@
1
+ # keyboard-controls
2
+
3
+ 为激活相机提供 WASD 或方向键的平移和旋转控制。
4
+
5
+ ```typescript
6
+ import { KeyboardControls, ACTION } from 'u-space/plugins/keyboard-controls';
7
+
8
+ const keyboardControls = new KeyboardControls(viewer);
9
+
10
+ // 可选:自定义移动速度
11
+ keyboardControls.moveDistanceDelta = 0.5;
12
+ keyboardControls.rotateAngleDelta = (Math.PI / 180) * 2;
13
+
14
+ // 激活监听
15
+ keyboardControls.enable();
16
+ // 之后:
17
+ keyboardControls.disable();
18
+ ```
19
+
20
+ **默认按键绑定**(`keyboardControls.keys`):
21
+
22
+ | 按键 | 动作 |
23
+ | :----------- | :------- |
24
+ | `W` | 向前移动 |
25
+ | `S` | 向后移动 |
26
+ | `A` | 向左移动 |
27
+ | `D` | 向右移动 |
28
+ | `Q` | 向上移动 |
29
+ | `E` | 向下移动 |
30
+ | `ArrowLeft` | 向左旋转 |
31
+ | `ArrowRight` | 向右旋转 |
32
+ | `ArrowUp` | 向上旋转 |
33
+ | `ArrowDown` | 向下旋转 |
34
+
35
+ 通过 `ACTION` 常量重新绑定任意按键:
36
+
37
+ ```typescript
38
+ import { ACTION } from 'u-space/plugins/keyboard-controls';
39
+ keyboardControls.keys['Space'] = ACTION.MOVE_UP;
40
+ ```
@@ -0,0 +1,36 @@
1
+ # minimap
2
+
3
+ 生成一个 2D 小地图叠加层,在 3D 场景中跟踪目标对象。渲染到注入 `viewer.el` 的 `<canvas>` 元素中。
4
+
5
+ ```typescript
6
+ import { Minimap } from 'u-space/plugins/minimap';
7
+
8
+ const minimap = new Minimap(viewer);
9
+ minimap.target = myCharacterModel; // 要跟踪并显示的 Object3D
10
+ minimap.setSize(300, 300); // 宽高(像素)
11
+
12
+ // 可选:设置小地图场景样式
13
+ minimap.scene.background = new THREE.Color(0x111111);
14
+
15
+ minimap.enable();
16
+ // 之后:
17
+ minimap.disable();
18
+ minimap.dispose();
19
+ ```
20
+
21
+ **属性:**
22
+
23
+ | 属性 | 类型 | 说明 |
24
+ | :------------ | :-------------------- | :--------------------------------------- |
25
+ | `target` | `Object3D \| null` | 小地图居中显示的对象。 |
26
+ | `scene` | `Scene` | 小地图内部的 Three.js 场景。 |
27
+ | `camera` | `OrthographicCamera` | 正交俯视相机。 |
28
+ | `marker` | `Object3D` | 显示主相机位置/朝向的箭头网格。 |
29
+ | `needsUpdate` | `boolean` | 设置为 `true` 可强制重新渲染小地图。 |
30
+
31
+ **方法:**
32
+
33
+ - `setSize(width, height)` — 调整小地图画布和相机视锥大小。
34
+ - `enable()` — 将画布附加到 `viewer.el` 并开始渲染。
35
+ - `disable()` — 移除画布并停止渲染。
36
+ - `dispose()` — 禁用并清理所有资源。
@@ -0,0 +1,67 @@
1
+ # object-controls
2
+
3
+ 对场景中的 3D 对象进行交互式移动、旋转、缩放操作。继承自 Three.js `TransformControls`,集成了 u-space `Viewer` 生命周期管理。
4
+
5
+ ```typescript
6
+ import { ObjectControls } from 'u-space/plugins/object-controls';
7
+
8
+ const controls = new ObjectControls(viewer, {
9
+ mode: 'translate', // 'translate' | 'rotate' | 'scale',默认 'translate'
10
+ space: 'world', // 'world' | 'local',默认 'world'
11
+ size: 1, // 控件显示大小,默认 1
12
+ });
13
+
14
+ controls.enable();
15
+ controls.attach(myMesh); // 将控件附加到目标对象
16
+
17
+ // 切换模式(直接赋值,继承自 TransformControls)
18
+ controls.mode = 'rotate';
19
+ controls.space = 'local';
20
+
21
+ // 监听变换事件
22
+ controls.addEventListener('objectChange', () => {
23
+ console.log(myMesh.position);
24
+ });
25
+
26
+ controls.addEventListener('dragging-changed', ({ value }) => {
27
+ console.log('拖拽中:', value); // true = 开始,false = 结束
28
+ });
29
+ ```
30
+
31
+ **说明:**
32
+
33
+ - `enable()` 时将 gizmo 加入场景并切换 `frameloop` 为 `'always'`,确保拖拽时连续渲染。
34
+ - 拖拽期间自动挂起 `viewer.controls`(CameraControls)以避免冲突;`disable()` 时无论如何都强制还原相机控制,防止 mid-drag 调用 disable 导致相机卡死。
35
+ - 监听 `viewer` 的 `cameraChange` 事件,`viewer.setCamera()` 切换相机后 gizmo 自动同步,无需手动更新。
36
+
37
+ **构造选项(`ObjectControlsOptions`):**
38
+
39
+ | 选项 | 类型 | 默认值 | 说明 |
40
+ | :------- | :--------------------------------- | :------------ | :--------------- |
41
+ | `mode` | `'translate' \| 'rotate' \| 'scale'` | `'translate'` | 初始变换模式。 |
42
+ | `space` | `'world' \| 'local'` | `'world'` | 初始变换空间。 |
43
+ | `size` | `number` | `1` | gizmo 大小。 |
44
+ | `showX` | `boolean` | `true` | 显示 X 轴手柄。 |
45
+ | `showY` | `boolean` | `true` | 显示 Y 轴手柄。 |
46
+ | `showZ` | `boolean` | `true` | 显示 Z 轴手柄。 |
47
+
48
+ **方法:**
49
+
50
+ | 方法 | 说明 |
51
+ | :---------- | :----------------------------------------------------------- |
52
+ | `enable()` | 将 gizmo 加入场景,切换 frameloop 为 `'always'`。 |
53
+ | `disable()` | 移除 gizmo,还原 frameloop 和 CameraControls。 |
54
+ | `attach(object)` | 将控件附加到指定 Object3D。 |
55
+ | `detach()` | 解除当前附加对象。 |
56
+ | `dispose()` | 完全释放所有资源。 |
57
+
58
+ **属性:**
59
+
60
+ | 属性 | 类型 | 说明 |
61
+ | :--------- | :-------- | :------------------------------------ |
62
+ | `isActive` | `boolean` | 当前是否已调用 `enable()`(只读)。 |
63
+ | `object` | `Object3D \| undefined` | 当前附加的对象(继承自 TransformControls)。 |
64
+ | `mode` | `string` | 当前变换模式,可直接赋值切换。 |
65
+ | `space` | `string` | 当前变换空间,可直接赋值切换。 |
66
+
67
+ > 由于 `ObjectControls` 直接继承 `TransformControls`,所有原生属性(`translationSnap`、`rotationSnap`、`scaleSnap`、`showX/Y/Z` 等)和事件均可直接使用,参考 [Three.js TransformControls 文档](https://threejs.org/docs/#examples/en/controls/TransformControls)。
@@ -0,0 +1,26 @@
1
+ # tiles
2
+
3
+ 提供与 `3d-tiles-renderer` 和地理空间数据的集成。主要导出 `ArcgisTilesRenderer`,可流式加载 ArcGIS Online 3D 瓦片并将地球重新定向到指定地理位置。
4
+
5
+ ```typescript
6
+ import { ArcgisTilesRenderer } from 'u-space/plugins/tiles';
7
+
8
+ const arcgisTilesRenderer = new ArcgisTilesRenderer(viewer);
9
+
10
+ // 设置原点为经度、纬度、高度
11
+ arcgisTilesRenderer.invalidate(120.002269, 30.284849, 4);
12
+
13
+ // 瓦片持续流式加载,使用 always 模式
14
+ viewer.frameloop = 'always';
15
+
16
+ arcgisTilesRenderer.enable();
17
+ ```
18
+
19
+ **方法:**
20
+
21
+ | 方法 | 说明 |
22
+ | :-------------------------- | :--------------------------------------------------------------------------------------------- |
23
+ | `invalidate(lon, lat, alt)` | 将瓦片原点设置为指定的 WGS84 坐标(度)。可多次调用。返回一个取消订阅的函数。 |
24
+ | `enable()` | 将瓦片添加到场景并启动更新循环。 |
25
+ | `disable()` | 从场景中移除瓦片并暂停更新循环。 |
26
+ | `dispose()` | 禁用并完全释放瓦片渲染器。 |
@@ -0,0 +1,74 @@
1
+ # topology-drawer
2
+
3
+ 在 3D 场景中交互式绘制拓扑路径图。点击场景中的任意对象表面放置节点,自动连接成路径;点击空白处则落回不可见的地面平面。事件检测通过 `viewer.interactionManager` 实现(`scene.addEventListener` 冒泡)。
4
+
5
+ ```typescript
6
+ import { TopologyDrawer } from 'u-space/plugins/topology-drawer';
7
+
8
+ const drawer = new TopologyDrawer(viewer, {
9
+ groundY: 0, // 空白区域兜底地面的 Y 坐标,默认 0
10
+ snapRadius: 1.0, // 自动吸附已有节点的世界单位半径,默认 1.0
11
+ nodeRadius: 0.3,
12
+ nodeColor: 0x0088ff,
13
+ edgeRadius: 0.1,
14
+ edgeColor: 0x00ddff,
15
+ previewColor: 0xffff00, // 预览线颜色
16
+ });
17
+
18
+ drawer.enable();
19
+ ```
20
+
21
+ **操作说明:**
22
+
23
+ | 操作 | 效果 |
24
+ | :--- | :--- |
25
+ | 左键点击空白 / 模型表面 | 放置新节点,与上一节点自动连边 |
26
+ | 左键点击已有节点(`snapRadius` 范围内) | 吸附并连接到该节点,不新增节点 |
27
+ | 左键点击已有边 | 切断该边,在点击处插入新节点并重连两端 |
28
+ | 右键 / `Escape` | 结束当前路径链,下次点击开始新路径 |
29
+ | `Ctrl / Cmd + Z` | 撤销最后一步(节点、边或结束路径) |
30
+
31
+ **方法:**
32
+
33
+ | 方法 | 说明 |
34
+ | :--- | :--- |
35
+ | `enable()` | 进入绘制模式,将拓扑与地面平面加入场景。同时自动将 `viewer.interactionManager.pointerMoveEventsEnabled` 置为 `true`(用于预览线跟随光标),并在 `disable()` 时恢复为原值。 |
36
+ | `disable()` | 退出绘制模式,已绘内容仍保留在场景中。恢复 `pointerMoveEventsEnabled` 为调用 `enable()` 前的值。 |
37
+ | `finishPath()` | 结束当前路径链(等同于右键 / Escape)。 |
38
+ | `undo()` | 撤销最后一步操作。 |
39
+ | `clear()` | 清空所有已绘节点、边和路径。 |
40
+ | `exportData()` | 以 JSON 可序列化格式导出当前拓扑数据。 |
41
+ | `importData(data)` | 加载 `exportData()` 返回的数据,替换当前内容。 |
42
+ | `dispose()` | 完全释放所有资源并从场景移除拓扑。 |
43
+
44
+ **属性:**
45
+
46
+ | 属性 | 类型 | 说明 |
47
+ | :--- | :--- | :--- |
48
+ | `topology` | `Topology` | 底层 `Topology` 对象,可进一步访问节点、边和路径方法。 |
49
+
50
+ **导出 / 导入:**
51
+
52
+ ```typescript
53
+ // 导出
54
+ const data = drawer.exportData();
55
+ // data: { nodes: Record<string, {x,y,z}>, edges: Array<{from,to,weight}> }
56
+
57
+ // 导入
58
+ drawer.importData(data);
59
+ ```
60
+
61
+ **结合 `SceneLoader` 在模型表面绘制:**
62
+
63
+ ```typescript
64
+ import { SceneLoader } from 'u-space/plugins/u-manager';
65
+ import { TopologyDrawer } from 'u-space/plugins/topology-drawer';
66
+
67
+ const sceneLoader = new SceneLoader(viewer);
68
+ sceneLoader.setPath('./scenes/my-scene');
69
+ const group = await sceneLoader.loadAsync();
70
+ viewer.scene.add(group);
71
+
72
+ const drawer = new TopologyDrawer(viewer, { snapRadius: 1.0 });
73
+ drawer.enable(); // 可直接在加载的模型表面点击绘制
74
+ ```
@@ -0,0 +1,23 @@
1
+ # tracking-controls
2
+
3
+ 使相机平滑跟随移动的 `Object3D` 目标。
4
+
5
+ ```typescript
6
+ import { TrackingControls } from 'u-space/plugins/tracking-controls';
7
+
8
+ const tracking = new TrackingControls(viewer);
9
+ tracking.target = myMovingObject;
10
+ tracking.type = 'box3'; // 'position'(世界原点)或 'box3'(包围盒中心)
11
+ tracking.offset.set(0, 5, 0); // 相机目标偏移量
12
+
13
+ tracking.enable();
14
+ // tracking.disable();
15
+ ```
16
+
17
+ **属性:**
18
+
19
+ | 属性 | 类型 | 默认值 | 说明 |
20
+ | :------- | :---------------------- | :----------- | :-------------------------------------------------------- |
21
+ | `target` | `Object3D \| null` | `null` | 要跟踪的对象。 |
22
+ | `type` | `'position' \| 'box3'` | `'position'` | 跟踪世界位置还是包围盒中心。 |
23
+ | `offset` | `Vector3` | `(0,0,0)` | 在移动相机前叠加到跟踪位置上的偏移量。 |
@@ -0,0 +1,123 @@
1
+ # u-manager
2
+
3
+ `u-manager` 是一套全面的加载器和解析器,用于从服务器路径流式传输、解密并显示结构化场景数据。支持场景、拓扑、动画、属性和相机视点。
4
+
5
+ 所有加载器均继承自 Three.js 的 `Loader`,并提供 `setPath(path)` 方法,在调用 `loadAsync()` 前配置基础数据目录。
6
+
7
+ ## `SceneLoader`
8
+
9
+ 从服务端场景包加载完整场景树(模型、组、形状、拉伸区域),并自动将所有已加载对象按 `id` 和 `sid` 注册到 `viewer.objectManager`。
10
+
11
+ ```typescript
12
+ import { SceneLoader } from 'u-space/plugins/u-manager';
13
+
14
+ const sceneLoader = new SceneLoader(viewer);
15
+ sceneLoader.setPath('./scenes/my-scene');
16
+ sceneLoader.setKey('YOUR_LICENSE_KEY'); // 官方授权场景必需
17
+ const group = await sceneLoader.loadAsync();
18
+ viewer.scene.add(group);
19
+ ```
20
+
21
+ **方法:**
22
+
23
+ | 方法 | 说明 |
24
+ | :--------------- | :------------------------------------------------------------ |
25
+ | `setKey(key)` | 设置授权场景的 RSA 解密密钥。 |
26
+ | `loadAsync()` | 加载并解析场景,返回包含完整层级的 `Group`。 |
27
+ | `clearCache()` | 从 `objectManager` 中移除此加载器注册的所有 ID。 |
28
+ | `dispose()` | 清除缓存并释放水印叠加层。 |
29
+
30
+ ## `TopologiesLoader` / `TopologyParser`
31
+
32
+ 加载拓扑图数据并将其转换为 `Topology` 对象。
33
+
34
+ ```typescript
35
+ import { TopologiesLoader } from 'u-space/plugins/u-manager';
36
+
37
+ const loader = new TopologiesLoader();
38
+ loader.setPath('./scenes/my-scene');
39
+ const topologies = await loader.loadAsync(); // Topology[]
40
+ viewer.scene.add(...topologies);
41
+ ```
42
+
43
+ ## `VisionsLoader` / `VisionsParser`
44
+
45
+ 加载命名相机视点,并将相机飞行到指定视点。
46
+
47
+ ```typescript
48
+ import { VisionsLoader, VisionsParser } from 'u-space/plugins/u-manager';
49
+
50
+ const visionsLoader = new VisionsLoader();
51
+ visionsLoader.setPath('./scenes/my-scene');
52
+ const visionsData = await visionsLoader.loadAsync();
53
+ // visionsData 是 Record<string, IVisions[]>
54
+
55
+ const visionsParser = new VisionsParser(viewer);
56
+
57
+ // 飞行到指定视点
58
+ await visionsParser.flyTo(visionsData['HOME'][0]);
59
+
60
+ // 飞行到主(默认)视点
61
+ await visionsParser.flyToPrimary(visionsData['HOME']);
62
+ ```
63
+
64
+ **`IVisions` 字段:**
65
+
66
+ | 字段 | 类型 | 说明 |
67
+ | :--------- | :------------ | :------------------------------ |
68
+ | `camera` | `'P' \| 'O'` | 相机类型:透视或正交。 |
69
+ | `position` | `IVector3` | 相机世界位置。 |
70
+ | `target` | `IVector3` | 相机朝向目标点。 |
71
+ | `zoom` | `number` | 相机缩放级别。 |
72
+ | `primary` | `boolean` | 是否为默认视点。 |
73
+
74
+ ## `AnimationsLoader` / `AnimationsParser`
75
+
76
+ 加载关键帧动画数据,并通过 `tweenAnimation` 驱动 `Object3D` 的变换。
77
+
78
+ ```typescript
79
+ import { AnimationsLoader, AnimationsParser } from 'u-space/plugins/u-manager';
80
+
81
+ const animLoader = new AnimationsLoader();
82
+ animLoader.setPath('./scenes/my-scene');
83
+ const animationsData = await animLoader.loadAsync(); // IAnimations[]
84
+
85
+ // 查找特定对象的动画
86
+ const data = animationsData.find((a) => a.modelId === myModel.userData.id);
87
+
88
+ const parser = new AnimationsParser(viewer, myModel);
89
+ parser.initTransform(); // 保存初始位置/旋转/缩放
90
+
91
+ await parser.play(data.keyframes); // 播放动画序列
92
+
93
+ // 中途停止
94
+ parser.stop();
95
+
96
+ // 重置到初始变换
97
+ parser.reset();
98
+ ```
99
+
100
+ ## `PropertiesLoader`
101
+
102
+ 加载与模型关联的结构化属性元数据(如 BIM 属性)。
103
+
104
+ ```typescript
105
+ import { PropertiesLoader } from 'u-space/plugins/u-manager';
106
+
107
+ const propsLoader = new PropertiesLoader();
108
+ propsLoader.setPath('./scenes/my-scene');
109
+ const properties = await propsLoader.loadAsync(); // IProperties[]
110
+
111
+ // 查找模型的属性
112
+ const modelProps = properties.filter(p => p.modelId === myModel.userData.id);
113
+ ```
114
+
115
+ **`IProperties` 字段:**
116
+
117
+ | 字段 | 类型 | 说明 |
118
+ | :-------- | :--------------- | :----------------------- |
119
+ | `modelId` | `string` | 关联模型的 ID。 |
120
+ | `group` | `string` | 属性分组/类别名称。 |
121
+ | `key` | `string` | 属性键名。 |
122
+ | `value` | `string \| null` | 属性值。 |
123
+ | `label` | `string \| null` | 属性的显示标签。 |