@kimap/indoor-positioning-sdk-vue2 5.8.6 → 5.8.7

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kimap/indoor-positioning-sdk-vue2",
3
- "version": "5.8.6",
3
+ "version": "5.8.7",
4
4
  "description": "Vue2自包含室内定位SDK - 完全兼容Webpack3+Babel6 | Vue2 Self-Contained Indoor Positioning SDK",
5
5
  "main": "index.js",
6
6
  "files": [
@@ -10,6 +10,10 @@ var SceneCore = require('./SceneCore.js');
10
10
  // THREE.js 将在运行时加载
11
11
  var THREE = null;
12
12
  var loadThree = loaders.loadThree;
13
+
14
+ function easeInOutCubic(t) {
15
+ return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;
16
+ }
13
17
  var loadOBJLoader = loaders.loadOBJLoader;
14
18
  var loadFBXLoader = loaders.loadFBXLoader;
15
19
  var loadGLTFLoader = loaders.loadGLTFLoader;
@@ -624,38 +628,66 @@ KimapSDK.prototype.showSingleFloor = function(floorIndex) {
624
628
  // 判断方向:目标层是从上方滑下(低→高)还是从下方滑上(高→低)
625
629
  var targetFromAbove = floorIndex > currentFloorIndex;
626
630
 
627
- // 滑入起始偏移(减小幅度,约原值的50%)
631
+ // 滑入起始偏移
628
632
  var slideOffset = 4;
629
633
 
630
634
  var steps = [];
635
+ var fromAll = (currentFloorIndex === -1); // 是否从 ALL 模式切来
636
+
631
637
  this.floorGroups.forEach(function(group, idx) {
632
638
  if (idx === floorIndex) {
633
- // 目标层:从偏移位滑入到 y=0
639
+ // 目标层:先恢复到 ALL 位置(如果从 ALL 来),再从偏移位滑入
640
+ if (fromAll) {
641
+ var origY = self.core.floorOriginalY[idx] || 0;
642
+ group.position.y = origY;
643
+ } else {
644
+ group.position.y = targetFromAbove ? slideOffset : -slideOffset;
645
+ }
634
646
  group.visible = true;
635
- group.position.y = targetFromAbove ? slideOffset : -slideOffset;
636
647
  steps.push({
637
648
  group: group,
638
- fromY: targetFromAbove ? slideOffset : -slideOffset,
649
+ fromY: group.position.y,
639
650
  toY: 0,
640
651
  toVisible: true
641
652
  });
642
653
  } else {
643
- // 离场层:立即消失(移到下方,不做动画)
644
- group.visible = false;
645
- var origY = self.core.floorOriginalY[idx] || 0;
646
- group.position.y = -origY - 1;
654
+ // 离场层:若有动画在跑则先停止,否则立即移到隐藏位
655
+ if (self.core.floorAnim && self.core.floorAnim.running) {
656
+ var cur = self.core.floorAnim;
657
+ var t = Math.min((Date.now() - cur.startTime) / cur.duration, 1);
658
+ var et = 1 - Math.pow(1 - t, 3);
659
+ for (var i = 0; i < cur.steps.length; i++) {
660
+ var cs = cur.steps[i];
661
+ if (cs.group === group) {
662
+ group.position.y = cs.fromY + (cs.toY - cs.fromY) * et;
663
+ break;
664
+ }
665
+ }
666
+ }
667
+ var origY2 = self.core.floorOriginalY[idx] || 0;
668
+ // 从 ALL 来:滑出动画到原始位置;普通切换:立即隐藏
669
+ if (fromAll) {
670
+ steps.push({
671
+ group: group,
672
+ fromY: group.position.y,
673
+ toY: origY2,
674
+ toVisible: true
675
+ });
676
+ } else {
677
+ group.visible = false;
678
+ group.position.y = -origY2 - 1;
679
+ }
647
680
  }
648
681
  });
649
682
 
650
- // 合并/覆盖已有动画:先停止当前帧再以新起止值启动
683
+ // 合并/覆盖已有楼层动画:先瞬移再启动新动画
651
684
  if (self.core.floorAnim && self.core.floorAnim.running) {
652
685
  var cur = self.core.floorAnim;
653
686
  var t = Math.min((Date.now() - cur.startTime) / cur.duration, 1);
654
- var et = 1 - Math.pow(1 - t, 3); // easeOutCubic reverse
655
- // 把每个 group 瞬移到当前动画帧的位置
656
- for (var i = 0; i < cur.steps.length; i++) {
657
- var cs = cur.steps[i];
658
- cs.group.position.y = cs.fromY + (cs.toY - cs.fromY) * et;
687
+ var et = 1 - Math.pow(1 - t, 3);
688
+ for (var j = 0; j < cur.steps.length; j++) {
689
+ var cs2 = cur.steps[j];
690
+ cs2.group.position.y = cs2.fromY + (cs2.toY - cs2.fromY) * et;
659
691
  }
660
692
  }
661
693
 
@@ -667,9 +699,50 @@ KimapSDK.prototype.showSingleFloor = function(floorIndex) {
667
699
  };
668
700
 
669
701
  this._currentShowingFloorIndex = floorIndex;
670
- // 退出 ALL 时:相机动画恢复到单楼层视角(保持当前位置,不重置)
702
+
703
+ // 退出 ALL:相机从 ALL 视角平滑飞向单楼层位置
671
704
  if (self.core.cameraPitchState === 1) {
672
- self.core.animateCameraToFloorView(600);
705
+ // 停止已有相机动画并记录当前帧
706
+ if (self.core.cameraPitchAnim && self.core.cameraPitchAnim.running) {
707
+ var cpa = self.core.cameraPitchAnim;
708
+ var tc = Math.min((Date.now() - cpa.startTime) / cpa.duration, 1);
709
+ var etc = easeInOutCubic(tc);
710
+ self.core.camera.position.lerpVectors(cpa.fromPos, cpa.toPos, etc);
711
+ self.core.camera.lookAt(
712
+ cpa.fromTarget.x + (cpa.toTarget.x - cpa.fromTarget.x) * etc,
713
+ cpa.fromTarget.y + (cpa.toTarget.y - cpa.fromTarget.y) * etc,
714
+ cpa.fromTarget.z + (cpa.toTarget.z - cpa.fromTarget.z) * etc
715
+ );
716
+ if (self.core.controls) self.core.controls.update();
717
+ self.core.cameraPitchAnim = null;
718
+ }
719
+ // 目标相机位置:单楼层 -60° 俯角,lookAt 稍偏高处
720
+ var floorMeshes = [];
721
+ self.floorGroups[floorIndex].traverse(function(child) {
722
+ if (child.isMesh) floorMeshes.push(child);
723
+ });
724
+ var box2 = new THREE.Box3();
725
+ floorMeshes.forEach(function(m) { box2.expandByObject(m); });
726
+ var ctr = new THREE.Vector3();
727
+ var sz = new THREE.Vector3();
728
+ box2.getCenter(ctr);
729
+ box2.getSize(sz);
730
+ var ms = Math.max(sz.x, sz.z);
731
+ var d = ms * 1.8;
732
+ var lookAtH = new THREE.Vector3(ctr.x, ctr.y + ms * 0.15, ctr.z);
733
+ var toPos = new THREE.Vector3(lookAtH.x, lookAtH.y - d * 0.866, lookAtH.z + d * 0.5);
734
+ var fromCP = self.core.camera.position.clone();
735
+ var fromTgt = self.core.lookAtTarget ? self.core.lookAtTarget.clone() : lookAtH.clone();
736
+ self.core.cameraPitchAnim = {
737
+ running: true,
738
+ startTime: Date.now(),
739
+ duration: 600,
740
+ fromPos: fromCP,
741
+ toPos: toPos,
742
+ fromTarget: fromTgt,
743
+ toTarget: lookAtH
744
+ };
745
+ self.core.cameraPitchState = 0;
673
746
  }
674
747
  };
675
748
 
@@ -532,10 +532,17 @@ SceneCore.prototype.adjustCameraToFloor = function(floorIndex) {
532
532
  box.getCenter(center);
533
533
  box.getSize(size);
534
534
  var maxSize = Math.max(size.x, size.z);
535
- var distance = maxSize * 2;
536
-
537
- this.camera.position.set(center.x, center.y + distance * 1.5, center.z + distance);
538
- var lookAtTgt = new THREE.Vector3(center.x, center.y, center.z);
535
+ // -60° 俯角(与 ALL 视角一致),y 高出包围盒中心让它稍偏斜上方看
536
+ var dist = maxSize * 1.8;
537
+
538
+ var lookAtTgt = new THREE.Vector3(center.x, center.y + maxSize * 0.15, center.z);
539
+ // camera.y - lookAt.y = dist * sin(-60°) = -dist * 0.866
540
+ // camera.z - lookAt.z = dist * cos(-60°) = dist * 0.5
541
+ this.camera.position.set(
542
+ lookAtTgt.x,
543
+ lookAtTgt.y - dist * 0.866,
544
+ lookAtTgt.z + dist * 0.5
545
+ );
539
546
  this.camera.lookAt(lookAtTgt);
540
547
  if (this.controls) {
541
548
  this.controls.target.copy(lookAtTgt);
@@ -1342,12 +1349,12 @@ SceneCore.prototype.animateCameraToAllView = function(duration) {
1342
1349
  this.cameraPrePitchPos = this.camera.position.clone();
1343
1350
  this.cameraPrePitchTarget = this.controls ? this.controls.target.clone() : center.clone();
1344
1351
 
1345
- // 较低俯角 -45°(-60°太极端):camera.y - center.y = distance × sin(-45°) ≈ -distance × 0.707
1346
- // camera.z - center.z = distance × cos(-45°) ≈ distance × 0.707
1347
- var dist = maxSize * 1.8; // 适度拉近,视野更舒适
1352
+ // 较高俯角 -40°(从单楼层的 -60° 稍抬高):camera.y - center.y = distance × sin(-40°) ≈ -dist * 0.643
1353
+ // camera.z - center.z = distance × cos(-40°) ≈ dist * 0.766
1354
+ var dist = maxSize * 1.8;
1348
1355
  var fromPos = this.camera.position.clone();
1349
1356
  var fromTarget = this.controls ? this.controls.target.clone() : center.clone();
1350
- var toPos = new THREE.Vector3(center.x, center.y - dist * 0.707, center.z + dist * 0.707);
1357
+ var toPos = new THREE.Vector3(center.x, center.y - dist * 0.643, center.z + dist * 0.766);
1351
1358
  var toTarget = new THREE.Vector3(center.x, center.y, center.z);
1352
1359
 
1353
1360
  this.cameraPitchAnim = {