hj-gis-sdk 1.0.0 → 1.0.2
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 +50 -59
- package/dev-dist/animation.esm.js +152 -0
- package/dev-dist/animation.esm.js.map +1 -0
- package/dev-dist/animation.js +154 -0
- package/dev-dist/animation.js.map +1 -0
- package/dev-dist/building.esm.js +85 -0
- package/dev-dist/building.esm.js.map +1 -0
- package/dev-dist/building.js +87 -0
- package/dev-dist/building.js.map +1 -0
- package/dev-dist/common.esm.js +16159 -0
- package/dev-dist/common.esm.js.map +1 -0
- package/dev-dist/common.js +16163 -0
- package/dev-dist/common.js.map +1 -0
- package/dev-dist/fence.esm.js +100 -0
- package/dev-dist/fence.esm.js.map +1 -0
- package/dev-dist/fence.js +102 -0
- package/dev-dist/fence.js.map +1 -0
- package/dev-dist/ghost.esm.js +53 -0
- package/dev-dist/ghost.esm.js.map +1 -0
- package/dev-dist/ghost.js +55 -0
- package/dev-dist/ghost.js.map +1 -0
- package/dev-dist/heatmap.esm.js +103 -0
- package/dev-dist/heatmap.esm.js.map +1 -0
- package/dev-dist/heatmap.js +105 -0
- package/dev-dist/heatmap.js.map +1 -0
- package/dev-dist/index.esm.js +21 -0
- package/dev-dist/index.esm.js.map +1 -0
- package/dev-dist/index.esm2.js +4272 -0
- package/dev-dist/index.esm2.js.map +1 -0
- package/dev-dist/index.js +26 -0
- package/dev-dist/index.js.map +1 -0
- package/dev-dist/index2.js +4280 -0
- package/dev-dist/index2.js.map +1 -0
- package/dev-dist/keyframe.esm.js +95 -0
- package/dev-dist/keyframe.esm.js.map +1 -0
- package/dev-dist/keyframe.js +97 -0
- package/dev-dist/keyframe.js.map +1 -0
- package/dev-dist/measurement.esm.js +57 -0
- package/dev-dist/measurement.esm.js.map +1 -0
- package/dev-dist/measurement.js +59 -0
- package/dev-dist/measurement.js.map +1 -0
- package/dev-dist/scatter.esm.js +85 -0
- package/dev-dist/scatter.esm.js.map +1 -0
- package/dev-dist/scatter.js +87 -0
- package/dev-dist/scatter.js.map +1 -0
- package/dev-dist/src.esm.js +289 -0
- package/dev-dist/src.esm.js.map +1 -0
- package/dev-dist/src.js +291 -0
- package/dev-dist/src.js.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/animation/animate-clip.d.ts +39 -0
- package/dev-dist/types/hj-gis-sdk/addons/animation/animate-clip.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/animation/animation-action.d.ts +31 -0
- package/dev-dist/types/hj-gis-sdk/addons/animation/animation-action.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/animation/animation-mixer.d.ts +18 -0
- package/dev-dist/types/hj-gis-sdk/addons/animation/animation-mixer.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/animation/index.d.ts +5 -0
- package/dev-dist/types/hj-gis-sdk/addons/animation/index.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/camera.d.ts +59 -0
- package/dev-dist/types/hj-gis-sdk/addons/camera.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/clock.d.ts +40 -0
- package/dev-dist/types/hj-gis-sdk/addons/clock.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/commander/context.d.ts +24 -0
- package/dev-dist/types/hj-gis-sdk/addons/commander/context.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/commander/dispatcher.d.ts +43 -0
- package/dev-dist/types/hj-gis-sdk/addons/commander/dispatcher.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/commander/excutor/base.d.ts +22 -0
- package/dev-dist/types/hj-gis-sdk/addons/commander/excutor/base.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/loader/index.d.ts +6 -0
- package/dev-dist/types/hj-gis-sdk/addons/loader/index.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/loader/loader.d.ts +4 -0
- package/dev-dist/types/hj-gis-sdk/addons/loader/loader.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/node/base.d.ts +63 -0
- package/dev-dist/types/hj-gis-sdk/addons/node/base.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/node/ue-node.d.ts +82 -0
- package/dev-dist/types/hj-gis-sdk/addons/node/ue-node.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/proxy.d.ts +83 -0
- package/dev-dist/types/hj-gis-sdk/addons/proxy.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/tools/base.d.ts +7 -0
- package/dev-dist/types/hj-gis-sdk/addons/tools/base.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/tools/building.d.ts +36 -0
- package/dev-dist/types/hj-gis-sdk/addons/tools/building.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/tools/daytime.d.ts +7 -0
- package/dev-dist/types/hj-gis-sdk/addons/tools/daytime.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/tools/fence.d.ts +61 -0
- package/dev-dist/types/hj-gis-sdk/addons/tools/fence.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/tools/ghost.d.ts +14 -0
- package/dev-dist/types/hj-gis-sdk/addons/tools/ghost.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/tools/heat-map.d.ts +65 -0
- package/dev-dist/types/hj-gis-sdk/addons/tools/heat-map.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/tools/index.d.ts +26 -0
- package/dev-dist/types/hj-gis-sdk/addons/tools/index.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/tools/match-view.d.ts +7 -0
- package/dev-dist/types/hj-gis-sdk/addons/tools/match-view.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/tools/measurement.d.ts +13 -0
- package/dev-dist/types/hj-gis-sdk/addons/tools/measurement.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/tools/pick-cast.d.ts +26 -0
- package/dev-dist/types/hj-gis-sdk/addons/tools/pick-cast.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/tools/scatter.d.ts +57 -0
- package/dev-dist/types/hj-gis-sdk/addons/tools/scatter.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/tools/weather.d.ts +31 -0
- package/dev-dist/types/hj-gis-sdk/addons/tools/weather.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/transform.d.ts +91 -0
- package/dev-dist/types/hj-gis-sdk/addons/transform.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/addons/world.d.ts +76 -0
- package/dev-dist/types/hj-gis-sdk/addons/world.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/core/ue-rpc.d.ts +54 -0
- package/dev-dist/types/hj-gis-sdk/core/ue-rpc.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/index.d.ts +27 -0
- package/dev-dist/types/hj-gis-sdk/index.d.ts.map +1 -0
- package/dev-dist/types/hj-gis-sdk/utils.d.ts +16 -0
- package/dev-dist/types/hj-gis-sdk/utils.d.ts.map +1 -0
- package/dev-dist/types/src/animation.d.ts +2 -0
- package/dev-dist/types/src/animation.d.ts.map +1 -0
- package/dev-dist/types/src/building.d.ts +2 -0
- package/dev-dist/types/src/building.d.ts.map +1 -0
- package/dev-dist/types/src/common.d.ts +5 -0
- package/dev-dist/types/src/common.d.ts.map +1 -0
- package/dev-dist/types/src/fence.d.ts +2 -0
- package/dev-dist/types/src/fence.d.ts.map +1 -0
- package/dev-dist/types/src/ghost.d.ts +2 -0
- package/dev-dist/types/src/ghost.d.ts.map +1 -0
- package/dev-dist/types/src/heatmap.d.ts +2 -0
- package/dev-dist/types/src/heatmap.d.ts.map +1 -0
- package/dev-dist/types/src/index.d.ts +2 -0
- package/dev-dist/types/src/index.d.ts.map +1 -0
- package/dev-dist/types/src/keyframe.d.ts +2 -0
- package/dev-dist/types/src/keyframe.d.ts.map +1 -0
- package/dev-dist/types/src/measurement.d.ts +2 -0
- package/dev-dist/types/src/measurement.d.ts.map +1 -0
- package/dev-dist/types/src/scatter.d.ts +2 -0
- package/dev-dist/types/src/scatter.d.ts.map +1 -0
- package/dev-dist/types/src/weather.d.ts +2 -0
- package/dev-dist/types/src/weather.d.ts.map +1 -0
- package/dev-dist/weather.esm.js +68 -0
- package/dev-dist/weather.esm.js.map +1 -0
- package/dev-dist/weather.js +70 -0
- package/dev-dist/weather.js.map +1 -0
- package/dist/sdk.esm.js +19 -6
- package/dist/sdk.esm.js.map +1 -1
- package/dist/sdk.js +19 -6
- package/dist/sdk.js.map +1 -1
- package/dist/sdk.umd.js +1 -1
- package/dist/sdk.umd.js.map +1 -1
- package/dist/types/hj-gis-sdk/addons/tools/scatter.d.ts.map +1 -1
- package/dist/types/src/common.d.ts.map +1 -1
- package/hj-gis-sdk/addons/animation/animate-clip.ts +93 -0
- package/hj-gis-sdk/addons/animation/animation-action.ts +93 -0
- package/hj-gis-sdk/addons/animation/animation-mixer.ts +51 -0
- package/hj-gis-sdk/addons/animation/index.ts +17 -0
- package/hj-gis-sdk/addons/camera.ts +173 -0
- package/hj-gis-sdk/addons/clock.ts +85 -0
- package/hj-gis-sdk/addons/commander/context.ts +70 -0
- package/hj-gis-sdk/addons/commander/dispatcher.ts +68 -0
- package/hj-gis-sdk/addons/commander/excutor/base.ts +26 -0
- package/hj-gis-sdk/addons/loader/index.ts +7 -0
- package/hj-gis-sdk/addons/loader/loader.ts +3 -0
- package/hj-gis-sdk/addons/node/base.ts +131 -0
- package/hj-gis-sdk/addons/node/ue-node.ts +147 -0
- package/hj-gis-sdk/addons/proxy.ts +200 -0
- package/hj-gis-sdk/addons/tools/base.ts +11 -0
- package/hj-gis-sdk/addons/tools/building.ts +84 -0
- package/hj-gis-sdk/addons/tools/daytime.ts +14 -0
- package/hj-gis-sdk/addons/tools/fence.ts +105 -0
- package/hj-gis-sdk/addons/tools/ghost.ts +31 -0
- package/hj-gis-sdk/addons/tools/heat-map.ts +95 -0
- package/hj-gis-sdk/addons/tools/index.ts +25 -0
- package/hj-gis-sdk/addons/tools/match-view.ts +35 -0
- package/hj-gis-sdk/addons/tools/measurement.ts +25 -0
- package/hj-gis-sdk/addons/tools/pick-cast.ts +67 -0
- package/hj-gis-sdk/addons/tools/scatter.ts +230 -0
- package/hj-gis-sdk/addons/tools/weather.ts +40 -0
- package/hj-gis-sdk/addons/transform.ts +126 -0
- package/hj-gis-sdk/addons/world.ts +173 -0
- package/hj-gis-sdk/core/ue-rpc.ts +234 -0
- package/hj-gis-sdk/index.ts +26 -0
- package/hj-gis-sdk/utils.ts +52 -0
- package/index.html +48 -0
- package/package-lock.json +7368 -0
- package/package.json +17 -4
- package/rollup.config.dev.js +107 -0
- package/rollup.config.js +52 -0
- package/src/animation.ts +175 -0
- package/src/building.ts +114 -0
- package/src/common.ts +47 -0
- package/src/fence.ts +131 -0
- package/src/ghost.ts +70 -0
- package/src/heatmap.ts +125 -0
- package/src/index.ts +350 -0
- package/src/keyframe.ts +113 -0
- package/src/measurement.ts +80 -0
- package/src/scatter.ts +105 -0
- package/src/weather.ts +86 -0
- package/tsconfig.json +30 -0
- package/yarn.lock +3108 -0
package/README.md
CHANGED
|
@@ -194,6 +194,8 @@ const heatmap = await world.tools.heatMap.create({
|
|
|
194
194
|
})
|
|
195
195
|
```
|
|
196
196
|
|
|
197
|
+
[在线地址](https://codesandbox.io/p/sandbox/base-kjj5dn)
|
|
198
|
+
|
|
197
199
|
## 5. 详细使用示例
|
|
198
200
|
|
|
199
201
|
### 5.1 地图管理
|
|
@@ -316,6 +318,8 @@ hoverHandle()
|
|
|
316
318
|
// 世界坐标可以通过屏幕拾取回调获取
|
|
317
319
|
```
|
|
318
320
|
|
|
321
|
+
[5.1-5.5 在线地址](https://codesandbox.io/p/sandbox/base-kjj5dn)
|
|
322
|
+
|
|
319
323
|
### 5.6 视觉虚化
|
|
320
324
|
|
|
321
325
|
视觉虚化功能用于将场景中的对象设置为半透明状态,便于查看复杂场景。
|
|
@@ -330,6 +334,8 @@ if (ghostHandle) {
|
|
|
330
334
|
}
|
|
331
335
|
```
|
|
332
336
|
|
|
337
|
+
[5.6 在线地址](https://codesandbox.io/p/sandbox/ghost-tz49vl)
|
|
338
|
+
|
|
333
339
|
### 5.7 建筑分解
|
|
334
340
|
|
|
335
341
|
建筑分解功能用于将建筑模型按照楼层或部分进行展开和折叠,便于查看内部结构。
|
|
@@ -355,6 +361,8 @@ await expandHandler.expandFloor({
|
|
|
355
361
|
})
|
|
356
362
|
```
|
|
357
363
|
|
|
364
|
+
[5.7 在线地址](https://codesandbox.io/p/sandbox/building-s5qg58)
|
|
365
|
+
|
|
358
366
|
### 5.8 动画系统
|
|
359
367
|
|
|
360
368
|
动画系统支持骨骼动画播放和基于关键帧的动画控制。
|
|
@@ -369,7 +377,9 @@ const skeletalMesh = await world.spawnSkeletalMesh({
|
|
|
369
377
|
const animationMixer = new Animation.AnimationMixer(world.rpc)
|
|
370
378
|
|
|
371
379
|
// 创建动画片段
|
|
372
|
-
const animateClip = new Animation.PresetAnimateClip(
|
|
380
|
+
const animateClip = new Animation.PresetAnimateClip(
|
|
381
|
+
'/Game/Mesh/Human/Jog_In_Circle_Anim.Jog_In_Circle_Anim'
|
|
382
|
+
)
|
|
373
383
|
|
|
374
384
|
// 创建动画动作
|
|
375
385
|
const animateAction = animationMixer.clipAction(animateClip, skeletalMesh)
|
|
@@ -409,6 +419,9 @@ keyframeAction.duration = 3.0 // 动画时长
|
|
|
409
419
|
keyframeAction.play()
|
|
410
420
|
```
|
|
411
421
|
|
|
422
|
+
[5.8 骨骼动画在线地址](https://codesandbox.io/p/sandbox/animation-42ljhx)
|
|
423
|
+
[5.8 帧动画在线地址](https://codesandbox.io/p/sandbox/keyframe-nvh8s3)
|
|
424
|
+
|
|
412
425
|
### 5.9 热力图
|
|
413
426
|
|
|
414
427
|
热力图功能用于基于数据创建可视化的热力分布效果。
|
|
@@ -424,20 +437,12 @@ const heatmapFromImage = await world.tools.heatMap.create({
|
|
|
424
437
|
transform: transform
|
|
425
438
|
})
|
|
426
439
|
|
|
427
|
-
// 从点集创建热力图
|
|
428
|
-
const heatmapFromPoints = await world.tools.heatMap.create({
|
|
429
|
-
transform: transform,
|
|
430
|
-
points: [
|
|
431
|
-
{ x: 0, y: 0, count: 100 },
|
|
432
|
-
{ x: 10, y: 10, count: 200 },
|
|
433
|
-
{ x: 20, y: 20, count: 150 }
|
|
434
|
-
]
|
|
435
|
-
})
|
|
436
|
-
|
|
437
440
|
// 销毁热力图
|
|
438
441
|
heatmapFromImage.remove()
|
|
439
442
|
```
|
|
440
443
|
|
|
444
|
+
[5.9 在线地址](https://codesandbox.io/p/sandbox/heatmap-5rdgp4)
|
|
445
|
+
|
|
441
446
|
### 5.10 电子围栏
|
|
442
447
|
|
|
443
448
|
电子围栏功能用于创建和管理多边形的虚拟围栏。
|
|
@@ -459,6 +464,8 @@ const fence = await world.tools.fence.create({
|
|
|
459
464
|
await fence.remove()
|
|
460
465
|
```
|
|
461
466
|
|
|
467
|
+
[5.10 在线地址](https://codesandbox.io/p/sandbox/fence-9cpswg?file=%2Fsrc%2Findex.ts)
|
|
468
|
+
|
|
462
469
|
### 5.11 天气系统
|
|
463
470
|
|
|
464
471
|
天气系统用于控制场景中的天气效果,如晴天、雨天、雪天等。
|
|
@@ -475,6 +482,8 @@ await world.tools.weather.setDayTime({
|
|
|
475
482
|
})
|
|
476
483
|
```
|
|
477
484
|
|
|
485
|
+
[5.11 在线地址](https://codesandbox.io/p/sandbox/weather-x2mdw2?file=%2Fsrc%2Findex.ts%3A59%2C25)
|
|
486
|
+
|
|
478
487
|
### 5.12 散点图
|
|
479
488
|
|
|
480
489
|
散点图功能用于在场景中创建和管理标记点。
|
|
@@ -500,6 +509,8 @@ const scatter = await world.tools.scatter.create({
|
|
|
500
509
|
await scatter.removeAll()
|
|
501
510
|
```
|
|
502
511
|
|
|
512
|
+
[5.12 在线地址](https://codesandbox.io/p/sandbox/scatter-69vjmh?file=%2Fsrc%2Findex.ts%3A52%2C19)
|
|
513
|
+
|
|
503
514
|
### 5.13 测量工具
|
|
504
515
|
|
|
505
516
|
测量工具用于测量场景中的距离、面积和高度。
|
|
@@ -518,6 +529,8 @@ await world.tools.measurement.draw(MeasurementType.Height)
|
|
|
518
529
|
await world.tools.measurement.clean()
|
|
519
530
|
```
|
|
520
531
|
|
|
532
|
+
[5.13 在线地址](https://codesandbox.io/p/sandbox/measurement-3z44xn?file=%2Fsrc%2Findex.ts)
|
|
533
|
+
|
|
521
534
|
## 6. 核心功能实现代码
|
|
522
535
|
|
|
523
536
|
以下是从 GUI 示例中提取的核心功能实现代码(不包含 GUI 部分):
|
|
@@ -543,7 +556,8 @@ let map: InstanceType<typeof UERPCNode> | undefined = undefined
|
|
|
543
556
|
* 初始化应用
|
|
544
557
|
*/
|
|
545
558
|
async function initializeApp() {
|
|
546
|
-
const url = `ws://120.27.198.158:9001/player`
|
|
559
|
+
// const url = `ws://120.27.198.158:9001/player`
|
|
560
|
+
const url = `wss://kdyjs-proxy.metamaker.cn/proxy_gis_sdk`
|
|
547
561
|
const config = new Config({
|
|
548
562
|
initialSettings: {
|
|
549
563
|
ss: url,
|
|
@@ -720,77 +734,62 @@ if (document.readyState === 'loading') {
|
|
|
720
734
|
### 7.1 连接失败
|
|
721
735
|
|
|
722
736
|
- 确保 Pixel Streaming 服务器正在运行
|
|
723
|
-
- 检查 URL 是否正确,格式应为 `ws://your-server-url
|
|
737
|
+
- 检查 URL 是否正确,格式应为 `ws://your-server-url`
|
|
724
738
|
- 确保服务器端口未被防火墙阻止
|
|
725
739
|
- 检查网络连接是否正常
|
|
726
740
|
|
|
727
741
|
### 7.2 对象不显示
|
|
728
742
|
|
|
729
|
-
-
|
|
743
|
+
- 确保对象的资源路径正确
|
|
730
744
|
- 检查对象的位置是否在相机的可见范围内
|
|
731
745
|
- 确保对象的缩放比例合适,避免过大或过小
|
|
732
746
|
- 检查对象的材质和渲染设置是否正确
|
|
733
747
|
|
|
734
|
-
### 7.3
|
|
735
|
-
|
|
736
|
-
- 优化 RPC 调用频率,避免频繁的远程操作
|
|
737
|
-
- 减少同时显示的对象数量,特别是复杂模型
|
|
738
|
-
- 合理设置相机的视锥体和渲染距离
|
|
739
|
-
- 避免在短时间内创建和销毁大量对象
|
|
740
|
-
- 使用批量操作代替单个操作
|
|
741
|
-
|
|
742
|
-
### 7.4 动画不播放
|
|
748
|
+
### 7.3 动画不播放
|
|
743
749
|
|
|
744
750
|
- 确保骨骼动画资源路径正确
|
|
745
751
|
- 检查动画名称是否与 Unreal Engine 中的动画名称一致
|
|
746
752
|
- 确保动画组件已正确配置在蓝图中
|
|
747
753
|
- 检查是否有其他动画正在播放并冲突
|
|
748
754
|
|
|
749
|
-
### 7.5
|
|
750
|
-
|
|
751
|
-
- 确保鼠标坐标转换正确,考虑画布的缩放和偏移
|
|
752
|
-
- 检查拾取的最大距离设置是否足够
|
|
753
|
-
- 确保场景中有可拾取的对象
|
|
754
|
-
- 检查 Unreal Engine 中的碰撞设置是否正确
|
|
755
|
-
|
|
756
|
-
### 7.6 建筑分解失败
|
|
755
|
+
### 7.5 建筑分解失败
|
|
757
756
|
|
|
758
757
|
- 确保建筑蓝图支持分解功能
|
|
759
758
|
- 检查 BuildingID 是否正确
|
|
760
759
|
- 确保建筑模型的楼层数据已正确配置
|
|
761
760
|
- 检查展开参数是否在合理范围内
|
|
762
761
|
|
|
763
|
-
### 7.
|
|
762
|
+
### 7.6 热力图显示异常
|
|
764
763
|
|
|
765
764
|
- 确保灰度图 URL 可访问且格式正确
|
|
766
765
|
- 检查 MeshSize 和 MeshSegment 参数设置是否合理
|
|
767
766
|
- 调整 Opacity 和 EmissiveStrength 参数以获得更好的视觉效果
|
|
768
767
|
- 确保热力图的位置和缩放设置正确
|
|
769
768
|
|
|
770
|
-
##
|
|
769
|
+
## 7.7. 底层 API 参考
|
|
771
770
|
|
|
772
|
-
本GIS SDK是对底层UERPC功能的封装,旨在为开发者提供更便捷、更友好的调用接口。
|
|
771
|
+
本 GIS SDK 是对底层 UERPC 功能的封装,旨在为开发者提供更便捷、更友好的调用接口。
|
|
773
772
|
|
|
774
|
-
### 8.1 UERPC文档链接
|
|
773
|
+
### 8.1 UERPC 文档链接
|
|
775
774
|
|
|
776
|
-
如果您需要了解更多底层功能或希望构建更灵活的架构,可以参考完整的UERPC文档:
|
|
775
|
+
如果您需要了解更多底层功能或希望构建更灵活的架构,可以参考完整的 UERPC 文档:
|
|
777
776
|
|
|
778
|
-
[UERPC前端API使用指南](./README_UERPC.md)
|
|
777
|
+
[UERPC 前端 API 使用指南](./README_UERPC.md)
|
|
779
778
|
|
|
780
779
|
### 8.2 关于封装说明
|
|
781
780
|
|
|
782
|
-
GIS SDK的所有接口调用均基于UERPC文档中提供的功能进行封装。这些封装旨在简化开发流程,提供更直观的API设计和更强大的类型支持。
|
|
781
|
+
GIS SDK 的所有接口调用均基于 UERPC 文档中提供的功能进行封装。这些封装旨在简化开发流程,提供更直观的 API 设计和更强大的类型支持。
|
|
783
782
|
|
|
784
|
-
如果您对当前架构不满意,或需要实现更复杂的功能,可以直接基于`README_UERPC.md`文档中提供的UERPC核心功能进行自定义封装,以满足您的特定需求。
|
|
783
|
+
如果您对当前架构不满意,或需要实现更复杂的功能,可以直接基于`README_UERPC.md`文档中提供的 UERPC 核心功能进行自定义封装,以满足您的特定需求。
|
|
785
784
|
|
|
786
|
-
### 8.3 封装与原生API的关系
|
|
785
|
+
### 8.3 封装与原生 API 的关系
|
|
787
786
|
|
|
788
|
-
- **便捷性**:GIS SDK将复杂的UERPC调用封装为简单的对象方法
|
|
789
|
-
- **类型安全**:提供完整的TypeScript类型定义,减少开发错误
|
|
787
|
+
- **便捷性**:GIS SDK 将复杂的 UERPC 调用封装为简单的对象方法
|
|
788
|
+
- **类型安全**:提供完整的 TypeScript 类型定义,减少开发错误
|
|
790
789
|
- **架构优化**:采用面向对象的设计,使代码更易于维护和扩展
|
|
791
|
-
- **灵活性**:保留了UERPC的核心功能,同时提供了更高级的抽象
|
|
790
|
+
- **灵活性**:保留了 UERPC 的核心功能,同时提供了更高级的抽象
|
|
792
791
|
|
|
793
|
-
无论您选择使用GIS SDK的封装接口还是直接使用UERPC原生API,都可以实现与Unreal Engine的高效通信和交互。
|
|
792
|
+
无论您选择使用 GIS SDK 的封装接口还是直接使用 UERPC 原生 API,都可以实现与 Unreal Engine 的高效通信和交互。
|
|
794
793
|
|
|
795
794
|
## 9. 更新日志
|
|
796
795
|
|
|
@@ -801,24 +800,16 @@ GIS SDK的所有接口调用均基于UERPC文档中提供的功能进行封装
|
|
|
801
800
|
- 支持静态网格体和蓝图对象管理
|
|
802
801
|
- 支持相机控制
|
|
803
802
|
- 支持屏幕拾取
|
|
804
|
-
|
|
805
|
-
### 1.1.0
|
|
806
|
-
|
|
807
|
-
- 新增建筑分解功能
|
|
808
|
-
- 新增动画系统(骨骼动画和关键帧动画)
|
|
809
|
-
- 新增热力图功能
|
|
810
|
-
- 新增电子围栏功能
|
|
811
|
-
|
|
812
|
-
### 1.2.0
|
|
813
|
-
|
|
814
803
|
- 新增天气系统
|
|
815
804
|
- 新增散点图功能
|
|
816
805
|
- 新增测量工具
|
|
817
806
|
- 新增视觉虚化功能
|
|
807
|
+
- 新增建筑分解功能
|
|
808
|
+
- 新增动画系统(骨骼动画和关键帧动画)
|
|
809
|
+
- 新增热力图功能
|
|
810
|
+
- 新增电子围栏功能
|
|
818
811
|
|
|
819
|
-
### 1.
|
|
812
|
+
### 1.0.1
|
|
820
813
|
|
|
821
|
-
-
|
|
822
|
-
-
|
|
823
|
-
- 修复已知 bug
|
|
824
|
-
- 增强跨浏览器兼容性
|
|
814
|
+
- 已知 Bugfix
|
|
815
|
+
- README 文档更新
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
|
|
2
|
+
(function(l, r) { if (!l || l.getElementById('livereloadscript')) return; r = l.createElement('script'); r.async = 1; r.src = '//' + (self.location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1'; r.id = 'livereloadscript'; l.getElementsByTagName('head')[0].appendChild(r) })(self.document);
|
|
3
|
+
import { G as GUI, A as Addons, i as initializeApp } from './common.esm.js';
|
|
4
|
+
import { L as Logger, c as LogLevel } from './index.esm2.js';
|
|
5
|
+
|
|
6
|
+
Logger.InitLogging(LogLevel.Info, false);
|
|
7
|
+
const { UERPCNode, Animation } = Addons;
|
|
8
|
+
let world;
|
|
9
|
+
let camera;
|
|
10
|
+
let skeletalNode = null;
|
|
11
|
+
let animationMixer = null;
|
|
12
|
+
async function _initializeApp() {
|
|
13
|
+
// const url = `ws://120.27.198.158:9001/player`
|
|
14
|
+
const url = `wss://kdyjs-proxy.metamaker.cn/proxy_gis_sdk`;
|
|
15
|
+
const AppElement = document.querySelector('#ue');
|
|
16
|
+
let result = await initializeApp(url, AppElement);
|
|
17
|
+
world = result.world;
|
|
18
|
+
camera = result.camera;
|
|
19
|
+
animationMixer = new Animation.AnimationMixer(world.rpc);
|
|
20
|
+
// 可以在此处加载动画相关的蓝图对象
|
|
21
|
+
skeletalNode = await world.spawnSkeletalMesh({
|
|
22
|
+
assetPath: '/Game/Mesh/Human/Jog_In_Circle.Jog_In_Circle'
|
|
23
|
+
});
|
|
24
|
+
// 模型太大, 调整到适合的大小
|
|
25
|
+
skeletalNode.transform.scale.set(0.3, 0.3, 0.3);
|
|
26
|
+
camera.transform.position.x = -180;
|
|
27
|
+
camera.transform.position.z = 5;
|
|
28
|
+
}
|
|
29
|
+
// 判断 window 是否初始化完成
|
|
30
|
+
if (document.readyState === 'loading') {
|
|
31
|
+
// 文档正在加载,等待DOMContentLoaded事件
|
|
32
|
+
document.addEventListener('DOMContentLoaded', _initializeApp);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
// 文档已经加载完成,直接初始化应用
|
|
36
|
+
_initializeApp();
|
|
37
|
+
}
|
|
38
|
+
// 动画控制配置
|
|
39
|
+
const animationConfig = {
|
|
40
|
+
speed: 1.0,
|
|
41
|
+
loop: true,
|
|
42
|
+
playing: false
|
|
43
|
+
};
|
|
44
|
+
// 动画列表(示例)
|
|
45
|
+
const animationList = {
|
|
46
|
+
跑步动画: '/Game/Mesh/Human/Jog_In_Circle_Anim.Jog_In_Circle_Anim'
|
|
47
|
+
};
|
|
48
|
+
const selectedAnimation = {
|
|
49
|
+
current: ''
|
|
50
|
+
};
|
|
51
|
+
// 创建GUI控制面板
|
|
52
|
+
const gui = new GUI();
|
|
53
|
+
let animateAction;
|
|
54
|
+
let animateClip;
|
|
55
|
+
// 添加动画选择下拉菜单
|
|
56
|
+
const animationFolder = gui.addFolder('动画控制');
|
|
57
|
+
animationFolder
|
|
58
|
+
.add(selectedAnimation, 'current', animationList)
|
|
59
|
+
.name('选择动画')
|
|
60
|
+
.onChange(async (value) => {
|
|
61
|
+
animateClip = new Animation.PresetAnimateClip(value);
|
|
62
|
+
animateAction = animationMixer.clipAction(animateClip, skeletalNode);
|
|
63
|
+
});
|
|
64
|
+
// 添加动画播放控制
|
|
65
|
+
// 保存按钮引用
|
|
66
|
+
let playButton, pauseButton;
|
|
67
|
+
const animationControls = {
|
|
68
|
+
play: async () => {
|
|
69
|
+
if (!animateAction) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (animationConfig.loop) {
|
|
73
|
+
animateAction.type = 'loop';
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
animateAction.type = 'once';
|
|
77
|
+
}
|
|
78
|
+
animateAction.rate = animationConfig.speed;
|
|
79
|
+
animateAction.play();
|
|
80
|
+
animationConfig.playing = true;
|
|
81
|
+
// 更新按钮状态
|
|
82
|
+
updateButtonStates();
|
|
83
|
+
},
|
|
84
|
+
pause: async () => {
|
|
85
|
+
if (!animateAction) {
|
|
86
|
+
alert('动画未准备好');
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
animateAction.pause();
|
|
90
|
+
animationConfig.playing = false;
|
|
91
|
+
// 更新按钮状态
|
|
92
|
+
updateButtonStates();
|
|
93
|
+
},
|
|
94
|
+
stop: async () => {
|
|
95
|
+
if (!animateAction) {
|
|
96
|
+
alert('动画未准备好');
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// animateAction.stop()
|
|
100
|
+
animationConfig.playing = false;
|
|
101
|
+
// 更新按钮状态
|
|
102
|
+
updateButtonStates();
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
// 创建按钮并保存引用
|
|
106
|
+
playButton = animationFolder
|
|
107
|
+
.add(animationControls, 'play')
|
|
108
|
+
.name('播放')
|
|
109
|
+
.disable(animationConfig.playing);
|
|
110
|
+
pauseButton = animationFolder
|
|
111
|
+
.add(animationControls, 'pause')
|
|
112
|
+
.name('暂停')
|
|
113
|
+
.enable(animationConfig.playing);
|
|
114
|
+
// 添加停止按钮
|
|
115
|
+
animationFolder
|
|
116
|
+
.add(animationControls, 'stop')
|
|
117
|
+
.name('停止');
|
|
118
|
+
// 更新按钮状态的函数
|
|
119
|
+
function updateButtonStates() {
|
|
120
|
+
if (playButton) {
|
|
121
|
+
if (animationConfig.playing) {
|
|
122
|
+
playButton.disable();
|
|
123
|
+
pauseButton.enable();
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
playButton.enable();
|
|
127
|
+
pauseButton.disable();
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// 添加动画参数控制
|
|
132
|
+
animationFolder
|
|
133
|
+
.add(animationConfig, 'speed', 0.1, 3.0, 0.1)
|
|
134
|
+
.name('动画速度')
|
|
135
|
+
.onChange(async (value) => {
|
|
136
|
+
console.log('设置动画速度:', value);
|
|
137
|
+
// await world.tools.animation.setSpeed(value)
|
|
138
|
+
// animateAction?.rate = value
|
|
139
|
+
if (!animateAction) {
|
|
140
|
+
alert('请先选择动画');
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
animationFolder
|
|
145
|
+
.add(animationConfig, 'loop')
|
|
146
|
+
.name('循环播放')
|
|
147
|
+
.onChange(async (value) => {
|
|
148
|
+
console.log('设置循环播放:', value);
|
|
149
|
+
});
|
|
150
|
+
// 打开默认的文件夹
|
|
151
|
+
animationFolder.open();
|
|
152
|
+
//# sourceMappingURL=animation.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animation.esm.js","sources":["../src/animation.ts"],"sourcesContent":["import { Addons } from 'hj-gis-sdk'\n\n/// 动画效果示例\n\nimport { PerspectiveCamera } from 'hj-gis-sdk/addons/camera'\nimport { initializeApp } from './common'\n\nimport GUI from 'lil-gui'\nimport { Logger, LogLevel } from '@epicgames-ps/lib-pixelstreamingcommon-ue5.5'\n\nLogger.InitLogging(LogLevel.Info, false)\nconst { UERPCNode, Animation } = Addons\n\nlet world: InstanceType<typeof Addons.World>\nlet camera: InstanceType<typeof PerspectiveCamera>\n\nlet skeletalNode: InstanceType<typeof UERPCNode> | null = null\nlet animationMixer: InstanceType<typeof Animation.AnimationMixer> | null = null\n\nasync function _initializeApp() {\n // const url = `ws://120.27.198.158:9001/player`\n const url = `wss://kdyjs-proxy.metamaker.cn/proxy_gis_sdk`\n const AppElement = document.querySelector('#ue')! as HTMLElement\n let result = await initializeApp(url, AppElement)\n world = result.world\n camera = result.camera\n animationMixer = new Animation.AnimationMixer(world.rpc)\n\n // 可以在此处加载动画相关的蓝图对象\n skeletalNode = await world.spawnSkeletalMesh({\n assetPath: '/Game/Mesh/Human/Jog_In_Circle.Jog_In_Circle'\n })\n\n // 模型太大, 调整到适合的大小\n skeletalNode.transform.scale.set(0.3, 0.3, 0.3)\n\n camera.transform.position.x = -180\n camera.transform.position.z = 5\n}\n\n// 判断 window 是否初始化完成\nif (document.readyState === 'loading') {\n // 文档正在加载,等待DOMContentLoaded事件\n document.addEventListener('DOMContentLoaded', _initializeApp)\n} else {\n // 文档已经加载完成,直接初始化应用\n _initializeApp()\n}\n\n// 动画控制配置\nconst animationConfig = {\n speed: 1.0,\n loop: true,\n playing: false\n}\n\n// 动画列表(示例)\nconst animationList = {\n 跑步动画: '/Game/Mesh/Human/Jog_In_Circle_Anim.Jog_In_Circle_Anim'\n}\n\nconst selectedAnimation = {\n current: ''\n}\n\n// 创建GUI控制面板\nconst gui = new GUI()\n\nlet animateAction: InstanceType<typeof Animation.AnimationAction> | undefined\nlet animateClip: InstanceType<typeof Animation.PresetAnimateClip>\n// 添加动画选择下拉菜单\nconst animationFolder = gui.addFolder('动画控制')\nanimationFolder\n .add(selectedAnimation, 'current', animationList)\n .name('选择动画')\n .onChange(async (value: string) => {\n animateClip = new Animation.PresetAnimateClip(value)\n\n animateAction = animationMixer!.clipAction(animateClip, skeletalNode!)\n })\n\n// 添加动画播放控制\n// 保存按钮引用\nlet playButton: any, pauseButton: any\n\nconst animationControls = {\n play: async () => {\n if (!animateAction) {\n return\n }\n if (animationConfig.loop) {\n animateAction.type = 'loop'\n } else {\n animateAction.type = 'once'\n }\n animateAction.rate = animationConfig.speed\n animateAction.play()\n animationConfig.playing = true\n // 更新按钮状态\n updateButtonStates()\n },\n pause: async () => {\n if (!animateAction) {\n alert('动画未准备好')\n return\n }\n animateAction.pause()\n animationConfig.playing = false\n // 更新按钮状态\n updateButtonStates()\n },\n stop: async () => {\n if (!animateAction) {\n alert('动画未准备好')\n return\n }\n // animateAction.stop()\n animationConfig.playing = false\n // 更新按钮状态\n updateButtonStates()\n }\n}\n\n// 创建按钮并保存引用\nplayButton = animationFolder\n .add(animationControls, 'play')\n .name('播放')\n .disable(animationConfig.playing)\n\npauseButton = animationFolder\n .add(animationControls, 'pause')\n .name('暂停')\n .enable(animationConfig.playing)\n\n// 添加停止按钮\nconst stopButton = animationFolder\n .add(animationControls, 'stop')\n .name('停止')\n\n// 更新按钮状态的函数\nfunction updateButtonStates() {\n if (playButton) {\n if (animationConfig.playing) {\n playButton.disable()\n pauseButton.enable()\n } else {\n playButton.enable()\n pauseButton.disable()\n }\n }\n}\n\n// 添加动画参数控制\nanimationFolder\n .add(animationConfig, 'speed', 0.1, 3.0, 0.1)\n .name('动画速度')\n .onChange(async (value: number) => {\n console.log('设置动画速度:', value)\n // await world.tools.animation.setSpeed(value)\n // animateAction?.rate = value\n if (!animateAction) {\n alert('请先选择动画')\n return\n }\n })\n\nanimationFolder\n .add(animationConfig, 'loop')\n .name('循环播放')\n .onChange(async (value: boolean) => {\n console.log('设置循环播放:', value)\n })\n\n// 打开默认的文件夹\nanimationFolder.open()\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
|
|
2
|
+
(function(l, r) { if (!l || l.getElementById('livereloadscript')) return; r = l.createElement('script'); r.async = 1; r.src = '//' + (self.location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1'; r.id = 'livereloadscript'; l.getElementsByTagName('head')[0].appendChild(r) })(self.document);
|
|
3
|
+
'use strict';
|
|
4
|
+
|
|
5
|
+
var common = require('./common.js');
|
|
6
|
+
var index = require('./index2.js');
|
|
7
|
+
|
|
8
|
+
index.Logger.InitLogging(index.LogLevel.Info, false);
|
|
9
|
+
const { UERPCNode, Animation } = common.Addons;
|
|
10
|
+
let world;
|
|
11
|
+
let camera;
|
|
12
|
+
let skeletalNode = null;
|
|
13
|
+
let animationMixer = null;
|
|
14
|
+
async function _initializeApp() {
|
|
15
|
+
// const url = `ws://120.27.198.158:9001/player`
|
|
16
|
+
const url = `wss://kdyjs-proxy.metamaker.cn/proxy_gis_sdk`;
|
|
17
|
+
const AppElement = document.querySelector('#ue');
|
|
18
|
+
let result = await common.initializeApp(url, AppElement);
|
|
19
|
+
world = result.world;
|
|
20
|
+
camera = result.camera;
|
|
21
|
+
animationMixer = new Animation.AnimationMixer(world.rpc);
|
|
22
|
+
// 可以在此处加载动画相关的蓝图对象
|
|
23
|
+
skeletalNode = await world.spawnSkeletalMesh({
|
|
24
|
+
assetPath: '/Game/Mesh/Human/Jog_In_Circle.Jog_In_Circle'
|
|
25
|
+
});
|
|
26
|
+
// 模型太大, 调整到适合的大小
|
|
27
|
+
skeletalNode.transform.scale.set(0.3, 0.3, 0.3);
|
|
28
|
+
camera.transform.position.x = -180;
|
|
29
|
+
camera.transform.position.z = 5;
|
|
30
|
+
}
|
|
31
|
+
// 判断 window 是否初始化完成
|
|
32
|
+
if (document.readyState === 'loading') {
|
|
33
|
+
// 文档正在加载,等待DOMContentLoaded事件
|
|
34
|
+
document.addEventListener('DOMContentLoaded', _initializeApp);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
// 文档已经加载完成,直接初始化应用
|
|
38
|
+
_initializeApp();
|
|
39
|
+
}
|
|
40
|
+
// 动画控制配置
|
|
41
|
+
const animationConfig = {
|
|
42
|
+
speed: 1.0,
|
|
43
|
+
loop: true,
|
|
44
|
+
playing: false
|
|
45
|
+
};
|
|
46
|
+
// 动画列表(示例)
|
|
47
|
+
const animationList = {
|
|
48
|
+
跑步动画: '/Game/Mesh/Human/Jog_In_Circle_Anim.Jog_In_Circle_Anim'
|
|
49
|
+
};
|
|
50
|
+
const selectedAnimation = {
|
|
51
|
+
current: ''
|
|
52
|
+
};
|
|
53
|
+
// 创建GUI控制面板
|
|
54
|
+
const gui = new common.GUI();
|
|
55
|
+
let animateAction;
|
|
56
|
+
let animateClip;
|
|
57
|
+
// 添加动画选择下拉菜单
|
|
58
|
+
const animationFolder = gui.addFolder('动画控制');
|
|
59
|
+
animationFolder
|
|
60
|
+
.add(selectedAnimation, 'current', animationList)
|
|
61
|
+
.name('选择动画')
|
|
62
|
+
.onChange(async (value) => {
|
|
63
|
+
animateClip = new Animation.PresetAnimateClip(value);
|
|
64
|
+
animateAction = animationMixer.clipAction(animateClip, skeletalNode);
|
|
65
|
+
});
|
|
66
|
+
// 添加动画播放控制
|
|
67
|
+
// 保存按钮引用
|
|
68
|
+
let playButton, pauseButton;
|
|
69
|
+
const animationControls = {
|
|
70
|
+
play: async () => {
|
|
71
|
+
if (!animateAction) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (animationConfig.loop) {
|
|
75
|
+
animateAction.type = 'loop';
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
animateAction.type = 'once';
|
|
79
|
+
}
|
|
80
|
+
animateAction.rate = animationConfig.speed;
|
|
81
|
+
animateAction.play();
|
|
82
|
+
animationConfig.playing = true;
|
|
83
|
+
// 更新按钮状态
|
|
84
|
+
updateButtonStates();
|
|
85
|
+
},
|
|
86
|
+
pause: async () => {
|
|
87
|
+
if (!animateAction) {
|
|
88
|
+
alert('动画未准备好');
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
animateAction.pause();
|
|
92
|
+
animationConfig.playing = false;
|
|
93
|
+
// 更新按钮状态
|
|
94
|
+
updateButtonStates();
|
|
95
|
+
},
|
|
96
|
+
stop: async () => {
|
|
97
|
+
if (!animateAction) {
|
|
98
|
+
alert('动画未准备好');
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
// animateAction.stop()
|
|
102
|
+
animationConfig.playing = false;
|
|
103
|
+
// 更新按钮状态
|
|
104
|
+
updateButtonStates();
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
// 创建按钮并保存引用
|
|
108
|
+
playButton = animationFolder
|
|
109
|
+
.add(animationControls, 'play')
|
|
110
|
+
.name('播放')
|
|
111
|
+
.disable(animationConfig.playing);
|
|
112
|
+
pauseButton = animationFolder
|
|
113
|
+
.add(animationControls, 'pause')
|
|
114
|
+
.name('暂停')
|
|
115
|
+
.enable(animationConfig.playing);
|
|
116
|
+
// 添加停止按钮
|
|
117
|
+
animationFolder
|
|
118
|
+
.add(animationControls, 'stop')
|
|
119
|
+
.name('停止');
|
|
120
|
+
// 更新按钮状态的函数
|
|
121
|
+
function updateButtonStates() {
|
|
122
|
+
if (playButton) {
|
|
123
|
+
if (animationConfig.playing) {
|
|
124
|
+
playButton.disable();
|
|
125
|
+
pauseButton.enable();
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
playButton.enable();
|
|
129
|
+
pauseButton.disable();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// 添加动画参数控制
|
|
134
|
+
animationFolder
|
|
135
|
+
.add(animationConfig, 'speed', 0.1, 3.0, 0.1)
|
|
136
|
+
.name('动画速度')
|
|
137
|
+
.onChange(async (value) => {
|
|
138
|
+
console.log('设置动画速度:', value);
|
|
139
|
+
// await world.tools.animation.setSpeed(value)
|
|
140
|
+
// animateAction?.rate = value
|
|
141
|
+
if (!animateAction) {
|
|
142
|
+
alert('请先选择动画');
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
animationFolder
|
|
147
|
+
.add(animationConfig, 'loop')
|
|
148
|
+
.name('循环播放')
|
|
149
|
+
.onChange(async (value) => {
|
|
150
|
+
console.log('设置循环播放:', value);
|
|
151
|
+
});
|
|
152
|
+
// 打开默认的文件夹
|
|
153
|
+
animationFolder.open();
|
|
154
|
+
//# sourceMappingURL=animation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animation.js","sources":["../src/animation.ts"],"sourcesContent":["import { Addons } from 'hj-gis-sdk'\n\n/// 动画效果示例\n\nimport { PerspectiveCamera } from 'hj-gis-sdk/addons/camera'\nimport { initializeApp } from './common'\n\nimport GUI from 'lil-gui'\nimport { Logger, LogLevel } from '@epicgames-ps/lib-pixelstreamingcommon-ue5.5'\n\nLogger.InitLogging(LogLevel.Info, false)\nconst { UERPCNode, Animation } = Addons\n\nlet world: InstanceType<typeof Addons.World>\nlet camera: InstanceType<typeof PerspectiveCamera>\n\nlet skeletalNode: InstanceType<typeof UERPCNode> | null = null\nlet animationMixer: InstanceType<typeof Animation.AnimationMixer> | null = null\n\nasync function _initializeApp() {\n // const url = `ws://120.27.198.158:9001/player`\n const url = `wss://kdyjs-proxy.metamaker.cn/proxy_gis_sdk`\n const AppElement = document.querySelector('#ue')! as HTMLElement\n let result = await initializeApp(url, AppElement)\n world = result.world\n camera = result.camera\n animationMixer = new Animation.AnimationMixer(world.rpc)\n\n // 可以在此处加载动画相关的蓝图对象\n skeletalNode = await world.spawnSkeletalMesh({\n assetPath: '/Game/Mesh/Human/Jog_In_Circle.Jog_In_Circle'\n })\n\n // 模型太大, 调整到适合的大小\n skeletalNode.transform.scale.set(0.3, 0.3, 0.3)\n\n camera.transform.position.x = -180\n camera.transform.position.z = 5\n}\n\n// 判断 window 是否初始化完成\nif (document.readyState === 'loading') {\n // 文档正在加载,等待DOMContentLoaded事件\n document.addEventListener('DOMContentLoaded', _initializeApp)\n} else {\n // 文档已经加载完成,直接初始化应用\n _initializeApp()\n}\n\n// 动画控制配置\nconst animationConfig = {\n speed: 1.0,\n loop: true,\n playing: false\n}\n\n// 动画列表(示例)\nconst animationList = {\n 跑步动画: '/Game/Mesh/Human/Jog_In_Circle_Anim.Jog_In_Circle_Anim'\n}\n\nconst selectedAnimation = {\n current: ''\n}\n\n// 创建GUI控制面板\nconst gui = new GUI()\n\nlet animateAction: InstanceType<typeof Animation.AnimationAction> | undefined\nlet animateClip: InstanceType<typeof Animation.PresetAnimateClip>\n// 添加动画选择下拉菜单\nconst animationFolder = gui.addFolder('动画控制')\nanimationFolder\n .add(selectedAnimation, 'current', animationList)\n .name('选择动画')\n .onChange(async (value: string) => {\n animateClip = new Animation.PresetAnimateClip(value)\n\n animateAction = animationMixer!.clipAction(animateClip, skeletalNode!)\n })\n\n// 添加动画播放控制\n// 保存按钮引用\nlet playButton: any, pauseButton: any\n\nconst animationControls = {\n play: async () => {\n if (!animateAction) {\n return\n }\n if (animationConfig.loop) {\n animateAction.type = 'loop'\n } else {\n animateAction.type = 'once'\n }\n animateAction.rate = animationConfig.speed\n animateAction.play()\n animationConfig.playing = true\n // 更新按钮状态\n updateButtonStates()\n },\n pause: async () => {\n if (!animateAction) {\n alert('动画未准备好')\n return\n }\n animateAction.pause()\n animationConfig.playing = false\n // 更新按钮状态\n updateButtonStates()\n },\n stop: async () => {\n if (!animateAction) {\n alert('动画未准备好')\n return\n }\n // animateAction.stop()\n animationConfig.playing = false\n // 更新按钮状态\n updateButtonStates()\n }\n}\n\n// 创建按钮并保存引用\nplayButton = animationFolder\n .add(animationControls, 'play')\n .name('播放')\n .disable(animationConfig.playing)\n\npauseButton = animationFolder\n .add(animationControls, 'pause')\n .name('暂停')\n .enable(animationConfig.playing)\n\n// 添加停止按钮\nconst stopButton = animationFolder\n .add(animationControls, 'stop')\n .name('停止')\n\n// 更新按钮状态的函数\nfunction updateButtonStates() {\n if (playButton) {\n if (animationConfig.playing) {\n playButton.disable()\n pauseButton.enable()\n } else {\n playButton.enable()\n pauseButton.disable()\n }\n }\n}\n\n// 添加动画参数控制\nanimationFolder\n .add(animationConfig, 'speed', 0.1, 3.0, 0.1)\n .name('动画速度')\n .onChange(async (value: number) => {\n console.log('设置动画速度:', value)\n // await world.tools.animation.setSpeed(value)\n // animateAction?.rate = value\n if (!animateAction) {\n alert('请先选择动画')\n return\n }\n })\n\nanimationFolder\n .add(animationConfig, 'loop')\n .name('循环播放')\n .onChange(async (value: boolean) => {\n console.log('设置循环播放:', value)\n })\n\n// 打开默认的文件夹\nanimationFolder.open()\n"],"names":["Logger","LogLevel","Addons","initializeApp","GUI"],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
|
|
2
|
+
(function(l, r) { if (!l || l.getElementById('livereloadscript')) return; r = l.createElement('script'); r.async = 1; r.src = '//' + (self.location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1'; r.id = 'livereloadscript'; l.getElementsByTagName('head')[0].appendChild(r) })(self.document);
|
|
3
|
+
import { G as GUI, i as initializeApp } from './common.esm.js';
|
|
4
|
+
import { L as Logger, c as LogLevel } from './index.esm2.js';
|
|
5
|
+
|
|
6
|
+
Logger.InitLogging(LogLevel.Info, false);
|
|
7
|
+
let world;
|
|
8
|
+
let camera;
|
|
9
|
+
let bluePrintNode;
|
|
10
|
+
async function _initializeApp() {
|
|
11
|
+
// const url = `ws://120.27.198.158:9001/player`
|
|
12
|
+
const url = `wss://kdyjs-proxy.metamaker.cn/proxy_gis_sdk`;
|
|
13
|
+
const AppElement = document.querySelector('#ue');
|
|
14
|
+
let result = await initializeApp(url, AppElement);
|
|
15
|
+
world = result.world;
|
|
16
|
+
camera = result.camera;
|
|
17
|
+
// 设置相机位置
|
|
18
|
+
camera.transform.position.z = 10;
|
|
19
|
+
camera.transform.position.x = -80;
|
|
20
|
+
camera.transform.position.y = 0;
|
|
21
|
+
// 确保加载了正确的蓝图对象
|
|
22
|
+
let louNode = await world.spawnLocalBlueprintActor({
|
|
23
|
+
assetPath: '/Game/Mesh/Lou/Lou.Lou'
|
|
24
|
+
});
|
|
25
|
+
bluePrintNode = louNode;
|
|
26
|
+
}
|
|
27
|
+
// 判断 window 是否初始化完成
|
|
28
|
+
if (document.readyState === 'loading') {
|
|
29
|
+
// 文档正在加载,等待DOMContentLoaded事件
|
|
30
|
+
document.addEventListener('DOMContentLoaded', _initializeApp);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
// 文档已经加载完成,直接初始化应用
|
|
34
|
+
_initializeApp();
|
|
35
|
+
}
|
|
36
|
+
// 建筑处理器类型
|
|
37
|
+
let handler;
|
|
38
|
+
const gui = new GUI();
|
|
39
|
+
// 生成建筑按钮
|
|
40
|
+
gui
|
|
41
|
+
.add({
|
|
42
|
+
async building() {
|
|
43
|
+
// z
|
|
44
|
+
handler = await world.tools.building.expand(bluePrintNode.key, {
|
|
45
|
+
spacing: 5,
|
|
46
|
+
duration: 1
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}, 'building')
|
|
50
|
+
.name('查看建筑物');
|
|
51
|
+
gui
|
|
52
|
+
.add({
|
|
53
|
+
async expandFloor() {
|
|
54
|
+
if (!handler) {
|
|
55
|
+
alert('请先查看建筑物');
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
let _dir = camera.transform.position
|
|
59
|
+
.clone()
|
|
60
|
+
.subtract(bluePrintNode.transform.position)
|
|
61
|
+
.normalize();
|
|
62
|
+
let distance = bluePrintNode.transform.position.distanceTo(camera.transform.position);
|
|
63
|
+
// 向相机的镜头靠近
|
|
64
|
+
handler.expandFloor({
|
|
65
|
+
floorIndex: 2,
|
|
66
|
+
direction: {
|
|
67
|
+
X: _dir.x,
|
|
68
|
+
Y: _dir.y,
|
|
69
|
+
Z: _dir.z
|
|
70
|
+
},
|
|
71
|
+
distance: distance / 3,
|
|
72
|
+
// expandHeight: 0,
|
|
73
|
+
duration: 1.2
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}, 'expandFloor')
|
|
77
|
+
.name('展开楼层');
|
|
78
|
+
gui
|
|
79
|
+
.add({
|
|
80
|
+
collapse: () => {
|
|
81
|
+
handler.collapse();
|
|
82
|
+
}
|
|
83
|
+
}, 'collapse')
|
|
84
|
+
.name('折叠建筑');
|
|
85
|
+
//# sourceMappingURL=building.esm.js.map
|