easy-threesdk 1.0.0 → 1.0.3
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 +579 -67
- package/index.js +112 -60
- package/loader/WaterMaterial/WaterEffect.js +255 -0
- package/loader/WaterMaterial/index.js +36 -0
- package/loader/WaterMaterial/resource/shaders/caustics/fragment.glsl +24 -0
- package/loader/WaterMaterial/resource/shaders/caustics/vertex.glsl +34 -0
- package/loader/WaterMaterial/resource/shaders/debug/fragment.glsl +12 -0
- package/loader/WaterMaterial/resource/shaders/debug/vertex.glsl +10 -0
- package/loader/WaterMaterial/resource/shaders/pool/fragment.glsl +17 -0
- package/loader/WaterMaterial/resource/shaders/pool/vertex.glsl +16 -0
- package/loader/WaterMaterial/resource/shaders/simulation/drop_fragment.glsl +22 -0
- package/loader/WaterMaterial/resource/shaders/simulation/normal_fragment.glsl +19 -0
- package/loader/WaterMaterial/resource/shaders/simulation/update_fragment.glsl +33 -0
- package/loader/WaterMaterial/resource/shaders/simulation/vertex.glsl +9 -0
- package/loader/WaterMaterial/resource/shaders/utils.glsl +60 -0
- package/loader/WaterMaterial/resource/shaders/water/fragment.glsl +69 -0
- package/loader/WaterMaterial/resource/shaders/water/vertex.glsl +24 -0
- package/loader/WaterMaterial/resource/tiles.jpg +0 -0
- package/loader/WaterMaterial/resource/vite.svg +1 -0
- package/loader/WaterMaterial/resource/xneg.jpg +0 -0
- package/loader/WaterMaterial/resource/xpos.jpg +0 -0
- package/loader/WaterMaterial/resource/ypos.jpg +0 -0
- package/loader/WaterMaterial/resource/zneg.jpg +0 -0
- package/loader/WaterMaterial/resource/zpos.jpg +0 -0
- package/package.json +5 -1
- package/plugins/LabelControl.js +344 -31
- package/plugins/ModelControl.js +47 -11
- package/tools/index.js +19 -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
|
-
|
|
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
|
-
###
|
|
11
|
-
- **自动化初始化**:一键初始化 Scene、Camera、Renderer、OrbitControls 和 Lights。
|
|
12
|
-
- **响应式适配**:自动处理窗口大小调整 (Resize)。
|
|
13
|
-
- **光照系统**:内置环境光、方向光和边缘光 (Rim Light) 配置。
|
|
25
|
+
### 3.1 场景基础建设
|
|
14
26
|
|
|
15
|
-
|
|
16
|
-
-
|
|
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
|
-
-
|
|
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
|
-
|
|
32
|
-
-
|
|
33
|
-
|
|
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
|
-
##
|
|
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 "./
|
|
44
|
-
import LabelControl from "./
|
|
45
|
-
import ModelControl from "./
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
|
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
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
189
|
+
threeSdk.enterRoamMode();
|
|
190
|
+
|
|
133
191
|
// 开启第一人称模式
|
|
134
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
159
|
-
|
|
160
|
-
|
|
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
|
-
|
|
676
|
+
## 10. 仓库地址
|
|
163
677
|
|
|
164
|
-
|
|
165
|
-
|---|---|
|
|
166
|
-
| `create3DLabel(id, html, position, options, events)` | 创建 CSS3D 标签。 |
|
|
678
|
+
- Gitee: https://gitee.com/xieqianstudent/visual-learning.git
|