@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 +1 -1
- package/src/core/KimapSDK.js +89 -16
- package/src/core/SceneCore.js +15 -8
package/package.json
CHANGED
package/src/core/KimapSDK.js
CHANGED
|
@@ -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
|
-
//
|
|
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
|
-
//
|
|
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:
|
|
649
|
+
fromY: group.position.y,
|
|
639
650
|
toY: 0,
|
|
640
651
|
toVisible: true
|
|
641
652
|
});
|
|
642
653
|
} else {
|
|
643
|
-
//
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
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);
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
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
|
-
|
|
702
|
+
|
|
703
|
+
// 退出 ALL:相机从 ALL 视角平滑飞向单楼层位置
|
|
671
704
|
if (self.core.cameraPitchState === 1) {
|
|
672
|
-
|
|
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
|
|
package/src/core/SceneCore.js
CHANGED
|
@@ -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
|
-
|
|
536
|
-
|
|
537
|
-
|
|
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
|
-
//
|
|
1346
|
-
// camera.z - center.z = distance × cos(-
|
|
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.
|
|
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 = {
|