hj-gis-sdk 1.0.0 → 1.0.1

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 (190) hide show
  1. package/README.md +50 -59
  2. package/dev-dist/animation.esm.js +152 -0
  3. package/dev-dist/animation.esm.js.map +1 -0
  4. package/dev-dist/animation.js +154 -0
  5. package/dev-dist/animation.js.map +1 -0
  6. package/dev-dist/building.esm.js +85 -0
  7. package/dev-dist/building.esm.js.map +1 -0
  8. package/dev-dist/building.js +87 -0
  9. package/dev-dist/building.js.map +1 -0
  10. package/dev-dist/common.esm.js +16153 -0
  11. package/dev-dist/common.esm.js.map +1 -0
  12. package/dev-dist/common.js +16157 -0
  13. package/dev-dist/common.js.map +1 -0
  14. package/dev-dist/fence.esm.js +100 -0
  15. package/dev-dist/fence.esm.js.map +1 -0
  16. package/dev-dist/fence.js +102 -0
  17. package/dev-dist/fence.js.map +1 -0
  18. package/dev-dist/ghost.esm.js +53 -0
  19. package/dev-dist/ghost.esm.js.map +1 -0
  20. package/dev-dist/ghost.js +55 -0
  21. package/dev-dist/ghost.js.map +1 -0
  22. package/dev-dist/heatmap.esm.js +103 -0
  23. package/dev-dist/heatmap.esm.js.map +1 -0
  24. package/dev-dist/heatmap.js +105 -0
  25. package/dev-dist/heatmap.js.map +1 -0
  26. package/dev-dist/index.esm.js +21 -0
  27. package/dev-dist/index.esm.js.map +1 -0
  28. package/dev-dist/index.esm2.js +4272 -0
  29. package/dev-dist/index.esm2.js.map +1 -0
  30. package/dev-dist/index.js +26 -0
  31. package/dev-dist/index.js.map +1 -0
  32. package/dev-dist/index2.js +4280 -0
  33. package/dev-dist/index2.js.map +1 -0
  34. package/dev-dist/keyframe.esm.js +95 -0
  35. package/dev-dist/keyframe.esm.js.map +1 -0
  36. package/dev-dist/keyframe.js +97 -0
  37. package/dev-dist/keyframe.js.map +1 -0
  38. package/dev-dist/measurement.esm.js +57 -0
  39. package/dev-dist/measurement.esm.js.map +1 -0
  40. package/dev-dist/measurement.js +59 -0
  41. package/dev-dist/measurement.js.map +1 -0
  42. package/dev-dist/scatter.esm.js +85 -0
  43. package/dev-dist/scatter.esm.js.map +1 -0
  44. package/dev-dist/scatter.js +87 -0
  45. package/dev-dist/scatter.js.map +1 -0
  46. package/dev-dist/src.esm.js +289 -0
  47. package/dev-dist/src.esm.js.map +1 -0
  48. package/dev-dist/src.js +291 -0
  49. package/dev-dist/src.js.map +1 -0
  50. package/dev-dist/types/hj-gis-sdk/addons/animation/animate-clip.d.ts +39 -0
  51. package/dev-dist/types/hj-gis-sdk/addons/animation/animate-clip.d.ts.map +1 -0
  52. package/dev-dist/types/hj-gis-sdk/addons/animation/animation-action.d.ts +31 -0
  53. package/dev-dist/types/hj-gis-sdk/addons/animation/animation-action.d.ts.map +1 -0
  54. package/dev-dist/types/hj-gis-sdk/addons/animation/animation-mixer.d.ts +18 -0
  55. package/dev-dist/types/hj-gis-sdk/addons/animation/animation-mixer.d.ts.map +1 -0
  56. package/dev-dist/types/hj-gis-sdk/addons/animation/index.d.ts +5 -0
  57. package/dev-dist/types/hj-gis-sdk/addons/animation/index.d.ts.map +1 -0
  58. package/dev-dist/types/hj-gis-sdk/addons/camera.d.ts +59 -0
  59. package/dev-dist/types/hj-gis-sdk/addons/camera.d.ts.map +1 -0
  60. package/dev-dist/types/hj-gis-sdk/addons/clock.d.ts +40 -0
  61. package/dev-dist/types/hj-gis-sdk/addons/clock.d.ts.map +1 -0
  62. package/dev-dist/types/hj-gis-sdk/addons/commander/context.d.ts +24 -0
  63. package/dev-dist/types/hj-gis-sdk/addons/commander/context.d.ts.map +1 -0
  64. package/dev-dist/types/hj-gis-sdk/addons/commander/dispatcher.d.ts +43 -0
  65. package/dev-dist/types/hj-gis-sdk/addons/commander/dispatcher.d.ts.map +1 -0
  66. package/dev-dist/types/hj-gis-sdk/addons/commander/excutor/base.d.ts +22 -0
  67. package/dev-dist/types/hj-gis-sdk/addons/commander/excutor/base.d.ts.map +1 -0
  68. package/dev-dist/types/hj-gis-sdk/addons/loader/index.d.ts +6 -0
  69. package/dev-dist/types/hj-gis-sdk/addons/loader/index.d.ts.map +1 -0
  70. package/dev-dist/types/hj-gis-sdk/addons/loader/loader.d.ts +4 -0
  71. package/dev-dist/types/hj-gis-sdk/addons/loader/loader.d.ts.map +1 -0
  72. package/dev-dist/types/hj-gis-sdk/addons/node/base.d.ts +63 -0
  73. package/dev-dist/types/hj-gis-sdk/addons/node/base.d.ts.map +1 -0
  74. package/dev-dist/types/hj-gis-sdk/addons/node/ue-node.d.ts +82 -0
  75. package/dev-dist/types/hj-gis-sdk/addons/node/ue-node.d.ts.map +1 -0
  76. package/dev-dist/types/hj-gis-sdk/addons/proxy.d.ts +83 -0
  77. package/dev-dist/types/hj-gis-sdk/addons/proxy.d.ts.map +1 -0
  78. package/dev-dist/types/hj-gis-sdk/addons/tools/base.d.ts +7 -0
  79. package/dev-dist/types/hj-gis-sdk/addons/tools/base.d.ts.map +1 -0
  80. package/dev-dist/types/hj-gis-sdk/addons/tools/building.d.ts +36 -0
  81. package/dev-dist/types/hj-gis-sdk/addons/tools/building.d.ts.map +1 -0
  82. package/dev-dist/types/hj-gis-sdk/addons/tools/daytime.d.ts +7 -0
  83. package/dev-dist/types/hj-gis-sdk/addons/tools/daytime.d.ts.map +1 -0
  84. package/dev-dist/types/hj-gis-sdk/addons/tools/fence.d.ts +61 -0
  85. package/dev-dist/types/hj-gis-sdk/addons/tools/fence.d.ts.map +1 -0
  86. package/dev-dist/types/hj-gis-sdk/addons/tools/ghost.d.ts +14 -0
  87. package/dev-dist/types/hj-gis-sdk/addons/tools/ghost.d.ts.map +1 -0
  88. package/dev-dist/types/hj-gis-sdk/addons/tools/heat-map.d.ts +65 -0
  89. package/dev-dist/types/hj-gis-sdk/addons/tools/heat-map.d.ts.map +1 -0
  90. package/dev-dist/types/hj-gis-sdk/addons/tools/index.d.ts +26 -0
  91. package/dev-dist/types/hj-gis-sdk/addons/tools/index.d.ts.map +1 -0
  92. package/dev-dist/types/hj-gis-sdk/addons/tools/match-view.d.ts +7 -0
  93. package/dev-dist/types/hj-gis-sdk/addons/tools/match-view.d.ts.map +1 -0
  94. package/dev-dist/types/hj-gis-sdk/addons/tools/measurement.d.ts +13 -0
  95. package/dev-dist/types/hj-gis-sdk/addons/tools/measurement.d.ts.map +1 -0
  96. package/dev-dist/types/hj-gis-sdk/addons/tools/pick-cast.d.ts +26 -0
  97. package/dev-dist/types/hj-gis-sdk/addons/tools/pick-cast.d.ts.map +1 -0
  98. package/dev-dist/types/hj-gis-sdk/addons/tools/scatter.d.ts +57 -0
  99. package/dev-dist/types/hj-gis-sdk/addons/tools/scatter.d.ts.map +1 -0
  100. package/dev-dist/types/hj-gis-sdk/addons/tools/weather.d.ts +31 -0
  101. package/dev-dist/types/hj-gis-sdk/addons/tools/weather.d.ts.map +1 -0
  102. package/dev-dist/types/hj-gis-sdk/addons/transform.d.ts +91 -0
  103. package/dev-dist/types/hj-gis-sdk/addons/transform.d.ts.map +1 -0
  104. package/dev-dist/types/hj-gis-sdk/addons/world.d.ts +76 -0
  105. package/dev-dist/types/hj-gis-sdk/addons/world.d.ts.map +1 -0
  106. package/dev-dist/types/hj-gis-sdk/core/ue-rpc.d.ts +54 -0
  107. package/dev-dist/types/hj-gis-sdk/core/ue-rpc.d.ts.map +1 -0
  108. package/dev-dist/types/hj-gis-sdk/index.d.ts +27 -0
  109. package/dev-dist/types/hj-gis-sdk/index.d.ts.map +1 -0
  110. package/dev-dist/types/hj-gis-sdk/utils.d.ts +16 -0
  111. package/dev-dist/types/hj-gis-sdk/utils.d.ts.map +1 -0
  112. package/dev-dist/types/src/animation.d.ts +2 -0
  113. package/dev-dist/types/src/animation.d.ts.map +1 -0
  114. package/dev-dist/types/src/building.d.ts +2 -0
  115. package/dev-dist/types/src/building.d.ts.map +1 -0
  116. package/dev-dist/types/src/common.d.ts +5 -0
  117. package/dev-dist/types/src/common.d.ts.map +1 -0
  118. package/dev-dist/types/src/fence.d.ts +2 -0
  119. package/dev-dist/types/src/fence.d.ts.map +1 -0
  120. package/dev-dist/types/src/ghost.d.ts +2 -0
  121. package/dev-dist/types/src/ghost.d.ts.map +1 -0
  122. package/dev-dist/types/src/heatmap.d.ts +2 -0
  123. package/dev-dist/types/src/heatmap.d.ts.map +1 -0
  124. package/dev-dist/types/src/index.d.ts +2 -0
  125. package/dev-dist/types/src/index.d.ts.map +1 -0
  126. package/dev-dist/types/src/keyframe.d.ts +2 -0
  127. package/dev-dist/types/src/keyframe.d.ts.map +1 -0
  128. package/dev-dist/types/src/measurement.d.ts +2 -0
  129. package/dev-dist/types/src/measurement.d.ts.map +1 -0
  130. package/dev-dist/types/src/scatter.d.ts +2 -0
  131. package/dev-dist/types/src/scatter.d.ts.map +1 -0
  132. package/dev-dist/types/src/weather.d.ts +2 -0
  133. package/dev-dist/types/src/weather.d.ts.map +1 -0
  134. package/dev-dist/weather.esm.js +68 -0
  135. package/dev-dist/weather.esm.js.map +1 -0
  136. package/dev-dist/weather.js +70 -0
  137. package/dev-dist/weather.js.map +1 -0
  138. package/dist/sdk.esm.js +19 -6
  139. package/dist/sdk.esm.js.map +1 -1
  140. package/dist/sdk.js +19 -6
  141. package/dist/sdk.js.map +1 -1
  142. package/dist/sdk.umd.js +1 -1
  143. package/dist/sdk.umd.js.map +1 -1
  144. package/dist/types/hj-gis-sdk/addons/tools/scatter.d.ts.map +1 -1
  145. package/hj-gis-sdk/addons/animation/animate-clip.ts +93 -0
  146. package/hj-gis-sdk/addons/animation/animation-action.ts +93 -0
  147. package/hj-gis-sdk/addons/animation/animation-mixer.ts +51 -0
  148. package/hj-gis-sdk/addons/animation/index.ts +17 -0
  149. package/hj-gis-sdk/addons/camera.ts +173 -0
  150. package/hj-gis-sdk/addons/clock.ts +85 -0
  151. package/hj-gis-sdk/addons/commander/context.ts +70 -0
  152. package/hj-gis-sdk/addons/commander/dispatcher.ts +68 -0
  153. package/hj-gis-sdk/addons/commander/excutor/base.ts +26 -0
  154. package/hj-gis-sdk/addons/loader/index.ts +7 -0
  155. package/hj-gis-sdk/addons/loader/loader.ts +3 -0
  156. package/hj-gis-sdk/addons/node/base.ts +131 -0
  157. package/hj-gis-sdk/addons/node/ue-node.ts +147 -0
  158. package/hj-gis-sdk/addons/proxy.ts +200 -0
  159. package/hj-gis-sdk/addons/tools/base.ts +11 -0
  160. package/hj-gis-sdk/addons/tools/building.ts +84 -0
  161. package/hj-gis-sdk/addons/tools/daytime.ts +14 -0
  162. package/hj-gis-sdk/addons/tools/fence.ts +105 -0
  163. package/hj-gis-sdk/addons/tools/ghost.ts +31 -0
  164. package/hj-gis-sdk/addons/tools/heat-map.ts +95 -0
  165. package/hj-gis-sdk/addons/tools/index.ts +25 -0
  166. package/hj-gis-sdk/addons/tools/match-view.ts +35 -0
  167. package/hj-gis-sdk/addons/tools/measurement.ts +25 -0
  168. package/hj-gis-sdk/addons/tools/pick-cast.ts +67 -0
  169. package/hj-gis-sdk/addons/tools/scatter.ts +230 -0
  170. package/hj-gis-sdk/addons/tools/weather.ts +40 -0
  171. package/hj-gis-sdk/addons/transform.ts +126 -0
  172. package/hj-gis-sdk/addons/world.ts +173 -0
  173. package/hj-gis-sdk/core/ue-rpc.ts +234 -0
  174. package/hj-gis-sdk/index.ts +26 -0
  175. package/hj-gis-sdk/utils.ts +52 -0
  176. package/package.json +16 -4
  177. package/rollup.config.dev.js +107 -0
  178. package/rollup.config.js +52 -0
  179. package/src/animation.ts +175 -0
  180. package/src/building.ts +114 -0
  181. package/src/common.ts +39 -0
  182. package/src/fence.ts +131 -0
  183. package/src/ghost.ts +70 -0
  184. package/src/heatmap.ts +125 -0
  185. package/src/index.ts +350 -0
  186. package/src/keyframe.ts +113 -0
  187. package/src/measurement.ts +80 -0
  188. package/src/scatter.ts +105 -0
  189. package/src/weather.ts +86 -0
  190. package/tsconfig.json +30 -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('/Game/Mesh/Human/Jog_In_Circle_Anim.Jog_In_Circle_Anim')
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:9001/player`
737
+ - 检查 URL 是否正确,格式应为 `ws://your-server-url`
724
738
  - 确保服务器端口未被防火墙阻止
725
739
  - 检查网络连接是否正常
726
740
 
727
741
  ### 7.2 对象不显示
728
742
 
729
- - 确保对象的资源路径正确,格式应为 `/Game/Path/To/Asset`
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.7 热力图显示异常
762
+ ### 7.6 热力图显示异常
764
763
 
765
764
  - 确保灰度图 URL 可访问且格式正确
766
765
  - 检查 MeshSize 和 MeshSegment 参数设置是否合理
767
766
  - 调整 Opacity 和 EmissiveStrength 参数以获得更好的视觉效果
768
767
  - 确保热力图的位置和缩放设置正确
769
768
 
770
- ## 8. 底层API参考
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.3.0
812
+ ### 1.0.1
820
813
 
821
- - 优化 RPC 通信性能
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