easy-threesdk 1.0.1 → 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.
Files changed (29) hide show
  1. package/README.md +579 -67
  2. package/index.js +187 -59
  3. package/loader/WaterMaterial/index.js +35 -36
  4. package/loader/WaterMaterial/resource/textures/waternormals.jpg +0 -0
  5. package/package.json +1 -1
  6. package/plugins/LabelControl.js +708 -198
  7. package/plugins/ModelControl.js +59 -11
  8. package/tools/index.js +26 -0
  9. package/loader/WaterMaterial/WaterEffect.js +0 -255
  10. package/loader/WaterMaterial/resource/shaders/caustics/fragment.glsl +0 -24
  11. package/loader/WaterMaterial/resource/shaders/caustics/vertex.glsl +0 -34
  12. package/loader/WaterMaterial/resource/shaders/debug/fragment.glsl +0 -12
  13. package/loader/WaterMaterial/resource/shaders/debug/vertex.glsl +0 -10
  14. package/loader/WaterMaterial/resource/shaders/pool/fragment.glsl +0 -17
  15. package/loader/WaterMaterial/resource/shaders/pool/vertex.glsl +0 -16
  16. package/loader/WaterMaterial/resource/shaders/simulation/drop_fragment.glsl +0 -22
  17. package/loader/WaterMaterial/resource/shaders/simulation/normal_fragment.glsl +0 -19
  18. package/loader/WaterMaterial/resource/shaders/simulation/update_fragment.glsl +0 -33
  19. package/loader/WaterMaterial/resource/shaders/simulation/vertex.glsl +0 -9
  20. package/loader/WaterMaterial/resource/shaders/utils.glsl +0 -60
  21. package/loader/WaterMaterial/resource/shaders/water/fragment.glsl +0 -69
  22. package/loader/WaterMaterial/resource/shaders/water/vertex.glsl +0 -24
  23. package/loader/WaterMaterial/resource/tiles.jpg +0 -0
  24. package/loader/WaterMaterial/resource/vite.svg +0 -1
  25. package/loader/WaterMaterial/resource/xneg.jpg +0 -0
  26. package/loader/WaterMaterial/resource/xpos.jpg +0 -0
  27. package/loader/WaterMaterial/resource/ypos.jpg +0 -0
  28. package/loader/WaterMaterial/resource/zneg.jpg +0 -0
  29. package/loader/WaterMaterial/resource/zpos.jpg +0 -0
package/README.md CHANGED
@@ -1,48 +1,74 @@
1
1
  # ThreeSDK 使用文档
2
2
 
3
3
  ## 1. 简介
4
+
4
5
  ThreeSDK 是一个基于 Three.js 的封装库,旨在简化 3D 场景的搭建、模型加载、交互控制以及标签系统的开发。通过封装常用的 Three.js 功能,开发者可以更快速地构建具有漫游、交互和标注功能的 3D 应用。
5
6
 
6
- ## 2. 核心功能
7
+ **当前版本:** 1.0.3
8
+
9
+ ## 2. 安装
10
+
11
+ ```bash
12
+ npm install easy-threesdk
13
+ ```
14
+
15
+ 或直接通过 Gitee 仓库使用:
16
+
17
+ ```bash
18
+ git clone https://gitee.com/xieqianstudent/visual-learning.git
19
+ ```
20
+
21
+ ## 3. 核心功能
7
22
 
8
23
  ThreeSDK 封装了以下核心能力:
9
24
 
10
- ### 2.1 场景基础建设
11
- - **自动化初始化**:一键初始化 Scene、Camera、Renderer、OrbitControls 和 Lights。
12
- - **响应式适配**:自动处理窗口大小调整 (Resize)。
13
- - **光照系统**:内置环境光、方向光和边缘光 (Rim Light) 配置。
25
+ ### 3.1 场景基础建设
14
26
 
15
- ### 2.2 摄像机与视角控制
16
- - **轨道控制器 (OrbitControls)**:默认支持旋转、缩放、平移。
27
+ - **自动化初始化**:一键初始化 Scene、Camera、Renderer、OrbitControls 和 Lights
28
+ - **响应式适配**:自动处理窗口大小调整 (Resize)
29
+ - **光照系统**:内置环境光、方向光和边缘光 (Rim Light) 配置
30
+ - **背景系统**:支持全景球体背景和立方体贴图背景
31
+
32
+ ### 3.2 摄像机与视角控制
33
+
34
+ - **轨道控制器 (OrbitControls)**:默认支持旋转、缩放、平移
17
35
  - **第一人称模式 (First Person Mode)**:
18
- - 固定相机位置,仅允许围绕自身旋转查看。
19
- - 适用于全景查看。
36
+ - 固定相机位置,仅允许围绕自身旋转查看
37
+ - 适用于全景查看
20
38
  - **漫游模式 (Roam Mode)**:
21
- - 类似游戏的操作方式 (WASD / 方向键移动)
22
- - 鼠标拖拽改变视角朝向。
23
- - 地面点击跳转 (Teleport)
24
- - **视角动画 (flyTo)**:平滑过渡到指定位置和视角的动画功能。
39
+ - 类似游戏的操作方式 (WASD / 方向键移动)
40
+ - 鼠标拖拽改变视角朝向
41
+ - 地面点击跳转 (Teleport)
42
+ - 实时显示地面指示圆圈
43
+ - **视角动画 (flyTo)**:平滑过渡到指定位置和视角的动画功能,支持 Promise
44
+
45
+ ### 3.3 插件系统
25
46
 
26
- ### 2.3 插件系统
27
47
  采用插件化架构,通过 `plugins()` 方法注册功能模块。目前内置插件包括:
28
- - **LabelControl**:基于 CSS3DRenderer 的 3D HTML 标签系统。
29
- - **ModelControl**:GLTF 模型加载、模型点击/悬停交互管理。
30
48
 
31
- ### 2.4 其他工具
32
- - **全景球体 (Panorama Sphere)**:快速创建全景背景。
33
- - **场景组管理 (ThreeGroup)**:方便管理场景中的对象分组。
49
+ - **LabelControl**:基于 CSS3DRenderer 的 3D HTML 标签系统,支持多种标签样式
50
+ - **ModelControl**:GLTF 模型加载、模型点击/悬停交互管理、网格变换控制器
51
+
52
+ ### 3.4 其他工具
53
+
54
+ - **全景球体 (Panorama Sphere)**:快速创建全景背景
55
+ - **立方体贴图背景**:支持六面体背景纹理
56
+ - **场景组管理 (ThreeGroup)**:方便管理场景中的对象分组
57
+ - **地面平面管理**:支持设置地面平面用于漫游模式检测
34
58
 
35
59
  ---
36
60
 
37
- ## 3. 快速上手 Demo
61
+ ## 4. 快速上手
62
+
63
+ ### 4.1 基础示例
38
64
 
39
65
  以下代码展示了如何使用 ThreeSDK 初始化场景、加载模型、添加标签以及启用交互。
40
66
 
41
67
  ```javascript
42
68
  import * as THREE from "three";
43
- import ThreeSdk from "./ThreeSdk/index.js";
44
- import LabelControl from "./ThreeSdk/plugins/LabelControl.js";
45
- import ModelControl from "./ThreeSdk/plugins/ModelControl.js";
69
+ import ThreeSdk from "./index.js";
70
+ import LabelControl from "./plugins/LabelControl.js";
71
+ import ModelControl from "./plugins/ModelControl.js";
46
72
 
47
73
  // 1. 初始化 SDK
48
74
  const container = document.getElementById("canvas-container");
@@ -57,12 +83,21 @@ threeSdk.init(
57
83
  },
58
84
  {
59
85
  // 控制器配置
86
+ enableDamping: true,
87
+ dampingFactor: 0.05,
60
88
  minDistance: 10,
61
89
  maxDistance: 500,
90
+ maxPolarAngle: Math.PI / 2,
91
+ target: new THREE.Vector3(0, 0, 0),
62
92
  },
63
93
  {
64
94
  // 灯光配置 (可选)
95
+ ambientLight: 0xffffff,
65
96
  ambientLightIntensity: 0.8,
97
+ directionalLightColor: 0xa5f3fc,
98
+ directionalLightIntensity: 1.5,
99
+ rimLightColor: 0x0ea5e9,
100
+ rimLightIntensity: 3,
66
101
  }
67
102
  );
68
103
 
@@ -70,10 +105,17 @@ threeSdk.init(
70
105
  threeSdk.plugins([LabelControl, ModelControl]);
71
106
 
72
107
  // 4. 创建全景背景 (可选)
73
- const textureLoader = new THREE.TextureLoader();
74
- textureLoader.load("/path/to/panorama.jpg", (texture) => {
75
- threeSdk.createPanoramaSphere(texture);
76
- });
108
+ threeSdk.createPanoramaSphere("/path/to/panorama.jpg");
109
+
110
+ // 或创建立方体贴图背景
111
+ threeSdk.createBackground([
112
+ "/path/to/xpos.jpg", // 右
113
+ "/path/to/xneg.jpg", // 左
114
+ "/path/to/ypos.jpg", // 上
115
+ "/path/to/yneg.jpg", // 下
116
+ "/path/to/zpos.jpg", // 前
117
+ "/path/to/zneg.jpg", // 后
118
+ ]);
77
119
 
78
120
  // 5. 使用 ModelControl 插件加载 GLTF 模型
79
121
  const modelControl = threeSdk._PluginsManager.get("ModelControl");
@@ -82,7 +124,7 @@ modelControl.loadGLTFBuilding(
82
124
  {
83
125
  ModelID: "MyCar",
84
126
  modelPath: "./resource/car/scene.gltf",
85
- position: [0, 0], // x, z 坐标
127
+ position: [0, 0], // [x, z] 坐标
86
128
  scale: 0.1,
87
129
  clickable: true,
88
130
  },
@@ -94,73 +136,543 @@ modelControl.loadGLTFBuilding(
94
136
  // 监听模型点击事件
95
137
  modelControl.onModelClickListener((object) => {
96
138
  if (object) {
97
- console.log("点击了模型:", object.userData.name);
139
+ console.log("点击了模型:", object);
140
+ }
141
+ });
142
+
143
+ // 监听模型悬停事件
144
+ modelControl.onModelMouseMoveListener((object) => {
145
+ if (object) {
146
+ console.log("悬停在模型上:", object);
98
147
  }
99
148
  });
100
149
 
101
150
  // 6. 使用 LabelControl 插件添加 3D 标签
102
151
  const labelControl = threeSdk._PluginsManager.get("LabelControl");
103
152
 
104
- labelControl.create3DLabel(
105
- "CarLabel", // 标签 ID
106
- `
107
- <div style="color: white; background: rgba(0,0,0,0.6); padding: 10px; border-radius: 5px;">
108
- <h3>My Car</h3>
109
- <p>Click to view details</p>
110
- </div>
111
- `,
153
+ // 创建箭头标签
154
+ labelControl.createArrow3DLabel(
155
+ "CarLabel",
156
+ {
157
+ template: "<div>My Car</div>",
158
+ data: {},
159
+ },
112
160
  new THREE.Vector3(0, 10, 0), // 标签位置
113
161
  {
114
- size: 0.02, // 缩放比例
162
+ size: 0.02,
163
+ backgroundColor: "rgba(20, 30, 50, 0.9)",
164
+ textColor: "#ffffff",
165
+ borderColor: "#22d3ee",
166
+ fontSize: 16,
115
167
  className: "my-label-class",
116
168
  },
117
169
  {
118
- // 标签事件
119
170
  click: (e) => {
120
171
  console.log("点击了标签", e);
121
172
  // 视角飞向标签位置
122
173
  threeSdk.flyTo({
123
174
  position: new THREE.Vector3(10, 10, 10),
124
- target: new THREE.Vector3(0, 0, 0)
175
+ target: new THREE.Vector3(0, 0, 0),
125
176
  });
126
- }
177
+ },
178
+ mouseenter: (e) => {
179
+ console.log("鼠标进入标签", e);
180
+ },
181
+ mouseleave: (e) => {
182
+ console.log("鼠标离开标签", e);
183
+ },
127
184
  }
128
185
  );
129
186
 
130
187
  // 7. 切换视角模式示例
131
188
  // 开启漫游模式
132
- // threeSdk.enterRoamMode();
189
+ threeSdk.enterRoamMode();
190
+
133
191
  // 开启第一人称模式
134
- // threeSdk.enterFirstPersonMode();
192
+ threeSdk.enterFirstPersonMode();
193
+
194
+ // 退出模式
195
+ threeSdk.exitRoamMode();
196
+ threeSdk.exitFirstPersonMode();
197
+ ```
198
+
199
+ ### 4.2 标签类型示例
200
+
201
+ LabelControl 插件支持三种标签类型:
202
+
203
+ ```javascript
204
+ const labelControl = threeSdk._PluginsManager.get("LabelControl");
205
+
206
+ // 1. 箭头标签 - 带向下箭头指示器
207
+ labelControl.createArrow3DLabel(
208
+ "ArrowLabel",
209
+ { template: "<div>箭头标签</div>", data: {} },
210
+ new THREE.Vector3(0, 5, 0),
211
+ { size: 0.02 }
212
+ );
213
+
214
+ // 2. 指示器标签 - 带折线指示器和背景图
215
+ labelControl.createIndicator3DLabel(
216
+ "IndicatorLabel",
217
+ { template: "<div>指示器标签</div>", data: {} },
218
+ new THREE.Vector3(5, 5, 0),
219
+ { size: 0.02 }
220
+ );
221
+
222
+ // 3. 可展开标签 - 点击可展开显示更多内容
223
+ labelControl.createExpand3DLabel(
224
+ "ExpandLabel",
225
+ {
226
+ template: "<div>点击展开</div>",
227
+ expandContentHtml: "<div>展开的内容</div>",
228
+ data: {},
229
+ },
230
+ new THREE.Vector3(-5, 5, 0),
231
+ { size: 0.02 }
232
+ );
233
+ ```
234
+
235
+ ---
236
+
237
+ ## 5. API 详细文档
238
+
239
+ ### 5.1 ThreeSdk 类
240
+
241
+ #### 构造函数
242
+
243
+ ```javascript
244
+ new ThreeSdk(container);
245
+ ```
246
+
247
+ - `container` (HTMLElement): 用于渲染 3D 场景的 DOM 容器
248
+
249
+ #### 主要方法
250
+
251
+ ##### `init(cameraConfig, controlConfig, lightConfig)`
252
+
253
+ 初始化场景、相机、灯光和控制器。
254
+
255
+ **参数:**
256
+
257
+ - `cameraConfig` (Object, 可选):
258
+
259
+ - `position` (THREE.Vector3, 默认: `new THREE.Vector3(0, 280, 320)`): 相机初始位置
260
+ - `lookAt` (THREE.Vector3, 默认: `new THREE.Vector3(0, 0, 0)`): 相机初始朝向
261
+
262
+ - `controlConfig` (Object, 可选):
263
+
264
+ - `enableDamping` (boolean, 默认: `true`): 是否启用阻尼
265
+ - `dampingFactor` (number, 默认: `0.05`): 阻尼因子
266
+ - `minDistance` (number, 默认: `50`): 最小缩放距离
267
+ - `maxDistance` (number, 默认: `800`): 最大缩放距离
268
+ - `maxPolarAngle` (number, 默认: `Math.PI / 2`): 最大极角
269
+ - `target` (THREE.Vector3, 默认: `new THREE.Vector3(0, 0, 0)`): 控制器目标位置
270
+
271
+ - `lightConfig` (Object, 可选):
272
+ - `ambientLight` (THREE.Color, 默认: `0xffffff`): 环境光颜色
273
+ - `ambientLightIntensity` (number, 默认: `0.5`): 环境光强度
274
+ - `directionalLightColor` (THREE.Color, 默认: `0xa5f3fc`): 方向光颜色
275
+ - `directionalLightIntensity` (number, 默认: `1.5`): 方向光强度
276
+ - `rimLightColor` (THREE.Color, 默认: `0x0ea5e9`): 边缘光颜色
277
+ - `rimLightIntensity` (number, 默认: `3`): 边缘光强度
278
+ - `rimLightPosition` (THREE.Vector3, 默认: `new THREE.Vector3(0, 100, -100)`): 边缘光位置
279
+ - `mainLightPosition` (THREE.Vector3, 默认: `new THREE.Vector3(50, 100, 50)`): 主光位置
280
+
281
+ ##### `plugins(plugins)`
282
+
283
+ 注册插件。
284
+
285
+ **参数:**
286
+
287
+ - `plugins` (Array<Object> | Object): 插件类或插件类数组
288
+
289
+ **示例:**
290
+
291
+ ```javascript
292
+ threeSdk.plugins([LabelControl, ModelControl]);
293
+ // 或
294
+ threeSdk.plugins(LabelControl);
295
+ ```
296
+
297
+ ##### `createPanoramaSphere(textureImage)`
298
+
299
+ 创建全景球体背景。
300
+
301
+ **参数:**
302
+
303
+ - `textureImage` (string): 全景图片路径(单张等距柱状投影图片)
304
+
305
+ **示例:**
306
+
307
+ ```javascript
308
+ threeSdk.createPanoramaSphere("/path/to/panorama.jpg");
135
309
  ```
136
310
 
137
- ## 4. API 概览
311
+ ##### `createBackground(textureImages)`
312
+
313
+ 创建立方体贴图背景。
314
+
315
+ **参数:**
316
+
317
+ - `textureImages` (string[]): 六面体图片路径数组,顺序为 [右, 左, 上, 下, 前, 后]
318
+
319
+ **示例:**
320
+
321
+ ```javascript
322
+ threeSdk.createBackground([
323
+ "/path/to/xpos.jpg",
324
+ "/path/to/xneg.jpg",
325
+ "/path/to/ypos.jpg",
326
+ "/path/to/yneg.jpg",
327
+ "/path/to/zpos.jpg",
328
+ "/path/to/zneg.jpg",
329
+ ]);
330
+ ```
331
+
332
+ ##### `enterRoamMode()`
333
+
334
+ 进入漫游模式。支持 WASD/方向键移动,鼠标拖拽旋转视角,双击地面跳转。
335
+
336
+ **操作说明:**
337
+
338
+ - WASD 或方向键:前后左右移动
339
+ - 鼠标拖拽:旋转视角
340
+ - 双击地面:跳转到点击位置
341
+ - 鼠标悬停地面:显示指示圆圈
342
+
343
+ ##### `exitRoamMode()`
344
+
345
+ 退出漫游模式,恢复轨道控制器。
346
+
347
+ ##### `enterFirstPersonMode()`
348
+
349
+ 进入第一人称模式。相机位置固定,仅允许围绕自身旋转查看。
350
+
351
+ **使用场景:** 全景查看、固定视角观察
352
+
353
+ ##### `exitFirstPersonMode()`
354
+
355
+ 退出第一人称模式,恢复原始控制状态。
356
+
357
+ ##### `flyTo(viewInfo, options)`
358
+
359
+ 相机平滑飞行到指定视角。返回 Promise。
360
+
361
+ **参数:**
362
+
363
+ - `viewInfo` (Object):
364
+ - `position` (THREE.Vector3): 目标相机位置
365
+ - `target` (THREE.Vector3): 目标朝向位置
366
+ - `options` (Object, 可选):
367
+ - `duration` (number, 默认: `1500`): 动画时长(毫秒)
368
+
369
+ **返回:** Promise
370
+
371
+ **示例:**
372
+
373
+ ```javascript
374
+ threeSdk
375
+ .flyTo(
376
+ {
377
+ position: new THREE.Vector3(10, 20, 30),
378
+ target: new THREE.Vector3(0, 0, 0),
379
+ },
380
+ {
381
+ duration: 2000,
382
+ }
383
+ )
384
+ .then(() => {
385
+ console.log("相机移动完成");
386
+ });
387
+ ```
388
+
389
+ ##### `createThreeGroup(name)`
390
+
391
+ 创建并获取一个 THREE.Group,用于管理场景中的对象分组。
392
+
393
+ **参数:**
394
+
395
+ - `name` (string): 组名称
396
+
397
+ **返回:** THREE.Group
398
+
399
+ **示例:**
400
+
401
+ ```javascript
402
+ const buildingGroup = threeSdk.createThreeGroup("buildings");
403
+ buildingGroup.add(someMesh);
404
+ ```
405
+
406
+ #### 属性
407
+
408
+ - `scene` (THREE.Scene): Three.js 场景对象
409
+ - `camera` (THREE.PerspectiveCamera): 相机对象
410
+ - `renderer` (THREE.WebGLRenderer): 渲染器对象
411
+ - `controls` (OrbitControls): 轨道控制器对象
412
+ - `raycaster` (THREE.Raycaster): 射线检测器
413
+ - `_PluginsManager` (Map): 插件管理器,可通过此属性获取已注册的插件
414
+
415
+ ---
416
+
417
+ ### 5.2 Plugin: ModelControl
418
+
419
+ #### 主要方法
420
+
421
+ ##### `loadGLTFBuilding(options, onLoadProcess)`
138
422
 
139
- ### ThreeSdk
423
+ 加载 GLTF 格式的建筑物模型。
140
424
 
141
- | 方法 | 描述 |
142
- |Data Type| Description|
143
- |---|---|
144
- | `init(cameraConfig, controlConfig, lightConfig)` | 初始化场景、相机、灯光和控制器。 |
145
- | `plugins(pluginsList)` | 注册插件数组。 |
146
- | `createPanoramaSphere(texture)` | 创建全景球体背景。 |
147
- | `enterRoamMode()` | 进入漫游模式 (WASD移动)。 |
148
- | `exitRoamMode()` | 退出漫游模式。 |
149
- | `enterFirstPersonMode()` | 进入第一人称模式 (定点旋转)。 |
150
- | `exitFirstPersonMode()` | 退出第一人称模式。 |
151
- | `flyTo(viewInfo, options)` | 相机平滑飞行到指定视角。 |
152
- | `createThreeGroup(name)` | 创建并获取一个 Three.Group。 |
425
+ **参数:**
153
426
 
154
- ### Plugin: ModelControl
427
+ - `options` (Object):
428
+ - `ModelID` (string): 模型唯一标识符
429
+ - `modelPath` (string): GLTF 模型文件路径
430
+ - `position` (Array, 默认: `[0, 0]`): 模型位置 `[x, z]` 坐标
431
+ - `scale` (number, 默认: `30`): 模型缩放比例
432
+ - `clickable` (boolean, 默认: `true`): 模型是否可点击
433
+ - `onLoadProcess` (Function, 可选): 加载进度回调函数 `(percent) => {}`
155
434
 
156
- | 方法 | 描述 |
157
- |---|---|
158
- | `loadGLTFBuilding(options, onLoadProcess)` | 加载 GLTF 模型,支持阴影和点击配置。 |
159
- | `onModelClickListener(callback)` | 监听模型点击事件。 |
160
- | `onModelMouseMoveListener(callback)` | 监听模型悬停事件。 |
435
+ **返回:** Promise<THREE.Object3D>
436
+
437
+ **示例:**
438
+
439
+ ```javascript
440
+ const model = await modelControl.loadGLTFBuilding(
441
+ {
442
+ ModelID: "building1",
443
+ modelPath: "./models/building.gltf",
444
+ position: [10, 20],
445
+ scale: 1.0,
446
+ clickable: true,
447
+ },
448
+ (percent) => {
449
+ console.log(`加载进度: ${percent}%`);
450
+ }
451
+ );
452
+ ```
453
+
454
+ ##### `onModelClickListener(callback)`
455
+
456
+ 监听模型点击事件。
457
+
458
+ **参数:**
459
+
460
+ - `callback` (Function): 回调函数 `(object) => {}`,点击模型时触发,`object` 为被点击的网格对象,未点击模型时为 `null`
461
+
462
+ **示例:**
463
+
464
+ ```javascript
465
+ modelControl.onModelClickListener((object) => {
466
+ if (object) {
467
+ console.log("点击了模型:", object);
468
+ console.log("模型名称:", object.userData.name);
469
+ }
470
+ });
471
+ ```
472
+
473
+ ##### `onModelMouseMoveListener(callback)`
474
+
475
+ 监听模型悬停事件。
476
+
477
+ **参数:**
478
+
479
+ - `callback` (Function): 回调函数 `(object) => {}`,悬停在模型上时触发,`object` 为被悬停的网格对象,未悬停时为 `null`
480
+
481
+ **注意:** 此方法会为可点击的模型添加悬停高亮效果(青色发光)。
482
+
483
+ **示例:**
484
+
485
+ ```javascript
486
+ modelControl.onModelMouseMoveListener((object) => {
487
+ if (object) {
488
+ console.log("悬停在模型上:", object);
489
+ }
490
+ });
491
+ ```
492
+
493
+ ##### `installMeshControls(mesh)`
494
+
495
+ 为指定网格安装变换控制器(TransformControls),支持平移、旋转、缩放。
496
+
497
+ **参数:**
498
+
499
+ - `mesh` (THREE.Mesh): 需要控制的网格对象
500
+
501
+ **操作说明:**
502
+
503
+ - 按 `G` 键:切换到平移模式
504
+ - 按 `R` 键:切换到旋转模式
505
+ - 按 `S` 键:切换到缩放模式
506
+
507
+ **示例:**
508
+
509
+ ```javascript
510
+ modelControl.installMeshControls(someMesh);
511
+ ```
512
+
513
+ ---
514
+
515
+ ### 5.3 Plugin: LabelControl
516
+
517
+ #### 主要方法
518
+
519
+ ##### `createArrow3DLabel(LabelID, contentOptions, position, options, Events)`
520
+
521
+ 创建带向下箭头指示器的 3D 标签。
522
+
523
+ **参数:**
524
+
525
+ - `LabelID` (string): 标签唯一标识符
526
+ - `contentOptions` (Object):
527
+ - `template` (string): HTML 模板字符串(支持 Vue 语法)
528
+ - `data` (Object): Vue 数据对象
529
+ - `position` (THREE.Vector3 | Array): 标签 3D 位置,可以是 Vector3 对象或 `[x, y, z]` 数组
530
+ - `options` (Object, 可选):
531
+ - `size` (number, 默认: `0.02`): 标签缩放大小
532
+ - `backgroundColor` (string, 默认: `"rgba(20, 30, 50, 0.9)"`): 背景颜色
533
+ - `textColor` (string, 默认: `"#ffffff"`): 文字颜色
534
+ - `borderColor` (string, 默认: `"#22d3ee"`): 边框颜色
535
+ - `fontSize` (number, 默认: `16`): 字体大小(px)
536
+ - `width` (string, 默认: `"auto"`): 标签宽度
537
+ - `className` (string, 默认: `"label-3d-arrow"`): 自定义 CSS 类名
538
+ - `Events` (Object, 可选):
539
+ - `click` (Function): 点击事件回调
540
+ - `mouseenter` (Function): 鼠标进入事件回调
541
+ - `mouseleave` (Function): 鼠标离开事件回调
542
+
543
+ **返回:** CSS3DObject
544
+
545
+ ##### `createIndicator3DLabel(LabelID, contentOptions, position, options, Events)`
546
+
547
+ 创建带折线指示器和背景图的 3D 标签。
548
+
549
+ **参数:** 同 `createArrow3DLabel`,但 `className` 默认为 `"label-3d-Indicator"`
550
+
551
+ **注意:** 此方法需要背景图片资源 `/ponit-ui-item.png`
552
+
553
+ ##### `createExpand3DLabel(LabelID, contentOptions, position, options, Events)`
554
+
555
+ 创建可展开的 3D 标签,点击标签可展开显示更多内容。
556
+
557
+ **参数:**
558
+
559
+ - `contentOptions` (Object):
560
+ - `template` (string): 标签显示的 HTML 模板
561
+ - `expandContentHtml` (string): 展开时显示的 HTML 内容
562
+ - `data` (Object): Vue 数据对象
563
+ - 其他参数同 `createArrow3DLabel`,但 `className` 默认为 `"label-3d-Expand"`
564
+
565
+ **返回:** CSS3DObject
566
+
567
+ **示例:**
568
+
569
+ ```javascript
570
+ labelControl.createExpand3DLabel(
571
+ "ExpandLabel",
572
+ {
573
+ template: "<div>点击展开</div>",
574
+ expandContentHtml: "<div>这是展开的内容</div>",
575
+ data: {},
576
+ },
577
+ new THREE.Vector3(0, 10, 0),
578
+ { size: 0.02 }
579
+ );
580
+ ```
581
+
582
+ ---
583
+
584
+ ## 6. 完整示例
585
+
586
+ ```javascript
587
+ import * as THREE from "three";
588
+ import ThreeSdk from "./index.js";
589
+ import LabelControl from "./plugins/LabelControl.js";
590
+ import ModelControl from "./plugins/ModelControl.js";
591
+
592
+ // 初始化
593
+ const container = document.getElementById("app");
594
+ const sdk = new ThreeSdk(container);
595
+
596
+ sdk.init(
597
+ {
598
+ position: new THREE.Vector3(0, 50, 100),
599
+ lookAt: new THREE.Vector3(0, 0, 0),
600
+ },
601
+ {
602
+ minDistance: 10,
603
+ maxDistance: 1000,
604
+ },
605
+ {
606
+ ambientLightIntensity: 0.6,
607
+ }
608
+ );
609
+
610
+ // 注册插件
611
+ sdk.plugins([LabelControl, ModelControl]);
612
+
613
+ const labelControl = sdk._PluginsManager.get("LabelControl");
614
+ const modelControl = sdk._PluginsManager.get("ModelControl");
615
+
616
+ // 加载模型
617
+ await modelControl.loadGLTFBuilding({
618
+ ModelID: "house",
619
+ modelPath: "./models/house.gltf",
620
+ position: [0, 0],
621
+ scale: 1,
622
+ clickable: true,
623
+ });
624
+
625
+ // 模型交互
626
+ modelControl.onModelClickListener((object) => {
627
+ if (object) {
628
+ console.log("模型被点击");
629
+ }
630
+ });
631
+
632
+ // 创建标签
633
+ labelControl.createArrow3DLabel(
634
+ "info",
635
+ {
636
+ template: "<div>{{ title }}</div>",
637
+ data: { title: "我的模型" },
638
+ },
639
+ new THREE.Vector3(0, 20, 0),
640
+ { size: 0.02 },
641
+ {
642
+ click: () => {
643
+ sdk.flyTo({
644
+ position: new THREE.Vector3(0, 30, 50),
645
+ target: new THREE.Vector3(0, 0, 0),
646
+ });
647
+ },
648
+ }
649
+ );
650
+ ```
651
+
652
+ ---
653
+
654
+ ## 7. 注意事项
655
+
656
+ 1. **依赖要求**:需要安装 Three.js 和相关依赖
657
+ 2. **Vue 支持**:标签系统使用 Vue 2.x 进行渲染,需要确保项目中已引入 Vue
658
+ 3. **地面检测**:漫游模式需要设置 `_GroundPlane` 属性才能正常使用地面点击跳转功能
659
+ 4. **性能优化**:大量模型和标签时建议使用场景组管理,合理控制渲染对象数量
660
+ 5. **浏览器兼容性**:建议使用现代浏览器(Chrome、Firefox、Edge 等)
661
+
662
+ ---
663
+
664
+ ## 8. 许可证
665
+
666
+ ISC
667
+
668
+ ---
669
+
670
+ ## 9. 作者
671
+
672
+ coderxq
673
+
674
+ ---
161
675
 
162
- ### Plugin: LabelControl
676
+ ## 10. 仓库地址
163
677
 
164
- | 方法 | 描述 |
165
- |---|---|
166
- | `create3DLabel(id, html, position, options, events)` | 创建 CSS3D 标签。 |
678
+ - Gitee: https://gitee.com/xieqianstudent/visual-learning.git