@kimap/indoor-positioning-sdk-vue2 6.0.0 → 6.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/package.json +1 -1
- package/src/core/KimapSDK.js +67 -20
- package/src/core/SceneCore.js +32 -22
package/package.json
CHANGED
package/src/core/KimapSDK.js
CHANGED
|
@@ -739,19 +739,34 @@ KimapSDK.prototype._adjustCameraToFloor = function(floorIndex) {
|
|
|
739
739
|
box.getCenter(center);
|
|
740
740
|
box.getSize(size);
|
|
741
741
|
var maxSize = Math.max(size.x, size.z);
|
|
742
|
-
var dist = maxSize * 1.2;
|
|
743
742
|
|
|
744
|
-
//
|
|
743
|
+
// 俯角45°、方位角-37.94°,从侧面斜俯视,模型占屏幕80%(与SceneCore一致)
|
|
744
|
+
var azimuthDeg = -37.94;
|
|
745
|
+
var pitchDeg = 45;
|
|
746
|
+
var screenFillFactor = 0.8;
|
|
747
|
+
var aspect = (this.core.camera && this.core.camera.aspect) || (window.innerWidth / window.innerHeight);
|
|
748
|
+
var fovRad = (this.core.camera && this.core.camera.fov) ? this.core.camera.fov * Math.PI / 180 : (60 * Math.PI / 180);
|
|
749
|
+
var hDist = maxSize / 2 / screenFillFactor / Math.tan(Math.atan(Math.tan(fovRad / 2) / aspect));
|
|
750
|
+
var vDist = maxSize / 2 / screenFillFactor / Math.tan(fovRad / 2);
|
|
751
|
+
var distance = Math.max(hDist, vDist);
|
|
752
|
+
|
|
753
|
+
var azimuthRad = azimuthDeg * Math.PI / 180;
|
|
754
|
+
var pitchRad = pitchDeg * Math.PI / 180;
|
|
755
|
+
var cosPitch = Math.cos(pitchRad);
|
|
756
|
+
var sinPitch = Math.sin(pitchRad);
|
|
757
|
+
var sinAzimuth = Math.sin(azimuthRad);
|
|
758
|
+
var cosAzimuth = Math.cos(azimuthRad);
|
|
759
|
+
|
|
745
760
|
var targetPosition = new THREE.Vector3(
|
|
746
|
-
center.x,
|
|
747
|
-
center.y +
|
|
748
|
-
center.z +
|
|
761
|
+
center.x + distance * sinAzimuth * cosPitch,
|
|
762
|
+
center.y + distance * sinPitch,
|
|
763
|
+
center.z + distance * cosAzimuth * cosPitch
|
|
749
764
|
);
|
|
750
765
|
|
|
751
766
|
this._animateCamera({
|
|
752
767
|
position: targetPosition,
|
|
753
768
|
lookAt: center
|
|
754
|
-
},
|
|
769
|
+
}, 500, function() {
|
|
755
770
|
console.log('KimapSDK: 已切换到楼层 ' + (floorIndex + 1) + 'F(动画完成)');
|
|
756
771
|
});
|
|
757
772
|
} catch (e) {
|
|
@@ -782,7 +797,7 @@ KimapSDK.prototype.showAllFloors = function() {
|
|
|
782
797
|
};
|
|
783
798
|
|
|
784
799
|
/**
|
|
785
|
-
* 多楼层:相机动画飞到能看到所有楼层的位置(ALL
|
|
800
|
+
* 多楼层:相机动画飞到能看到所有楼层的位置(ALL 外景视角,从侧方斜俯视,俯角约 45°)
|
|
786
801
|
* @private
|
|
787
802
|
*/
|
|
788
803
|
KimapSDK.prototype._zoomToShowAllFloors = function() {
|
|
@@ -805,19 +820,34 @@ KimapSDK.prototype._zoomToShowAllFloors = function() {
|
|
|
805
820
|
box.getCenter(center);
|
|
806
821
|
box.getSize(size);
|
|
807
822
|
var maxSize = Math.max(size.x, size.z);
|
|
808
|
-
var dist = maxSize * 1.2;
|
|
809
823
|
|
|
810
|
-
//
|
|
824
|
+
// ALL侧方斜俯视:方位角-45°,俯角45°,模型占屏幕80%
|
|
825
|
+
var azimuthDeg = -45;
|
|
826
|
+
var pitchDeg = 45;
|
|
827
|
+
var screenFillFactor = 0.8;
|
|
828
|
+
var aspect = (this.core.camera && this.core.camera.aspect) || (window.innerWidth / window.innerHeight);
|
|
829
|
+
var fovRad = (this.core.camera && this.core.camera.fov) ? this.core.camera.fov * Math.PI / 180 : (60 * Math.PI / 180);
|
|
830
|
+
var hDist = maxSize / 2 / screenFillFactor / Math.tan(Math.atan(Math.tan(fovRad / 2) / aspect));
|
|
831
|
+
var vDist = maxSize / 2 / screenFillFactor / Math.tan(fovRad / 2);
|
|
832
|
+
var distance = Math.max(hDist, vDist);
|
|
833
|
+
|
|
834
|
+
var azimuthRad = azimuthDeg * Math.PI / 180;
|
|
835
|
+
var pitchRad = pitchDeg * Math.PI / 180;
|
|
836
|
+
var cosPitch = Math.cos(pitchRad);
|
|
837
|
+
var sinPitch = Math.sin(pitchRad);
|
|
838
|
+
var sinAzimuth = Math.sin(azimuthRad);
|
|
839
|
+
var cosAzimuth = Math.cos(azimuthRad);
|
|
840
|
+
|
|
811
841
|
var targetPosition = new THREE.Vector3(
|
|
812
|
-
center.x,
|
|
813
|
-
center.y +
|
|
814
|
-
center.z +
|
|
842
|
+
center.x + distance * sinAzimuth * cosPitch,
|
|
843
|
+
center.y + distance * sinPitch,
|
|
844
|
+
center.z + distance * cosAzimuth * cosPitch
|
|
815
845
|
);
|
|
816
846
|
|
|
817
847
|
this._animateCamera({
|
|
818
848
|
position: targetPosition,
|
|
819
849
|
lookAt: center
|
|
820
|
-
},
|
|
850
|
+
}, 500, function() {
|
|
821
851
|
console.log('KimapSDK: 已切换到ALL模式(动画完成)');
|
|
822
852
|
});
|
|
823
853
|
} catch (e) {
|
|
@@ -1035,7 +1065,7 @@ KimapSDK.prototype.autoAdjustCamera = function(options) {
|
|
|
1035
1065
|
return self;
|
|
1036
1066
|
}
|
|
1037
1067
|
|
|
1038
|
-
//
|
|
1068
|
+
// 单楼层模式:从侧面斜俯视,俯角45°,方位角-37.94°,镜头拉近(模型占屏幕80%)
|
|
1039
1069
|
if (!self.core || !self.core.mapModel) {
|
|
1040
1070
|
console.warn('KimapSDK: 地图模型未加载,无法调整相机');
|
|
1041
1071
|
return;
|
|
@@ -1048,13 +1078,30 @@ KimapSDK.prototype.autoAdjustCamera = function(options) {
|
|
|
1048
1078
|
box.getCenter(center);
|
|
1049
1079
|
box.getSize(size);
|
|
1050
1080
|
|
|
1051
|
-
var
|
|
1052
|
-
|
|
1081
|
+
var maxSize = Math.max(size.x, size.z);
|
|
1082
|
+
|
|
1083
|
+
var azimuthDeg = -37.94;
|
|
1084
|
+
var pitchDeg = 45;
|
|
1085
|
+
// 镜头拉近:模型占屏幕约80%,留20%边距;根据视锥FOV计算实际需要的距离
|
|
1086
|
+
var screenFillFactor = 0.8;
|
|
1087
|
+
var aspect = (self.core.camera && self.core.camera.aspect) || (window.innerWidth / window.innerHeight);
|
|
1088
|
+
var fovRad = (self.core.camera && self.core.camera.fov) ? self.core.camera.fov * Math.PI / 180 : (60 * Math.PI / 180);
|
|
1089
|
+
// 水平方向:model宽/2 对应屏幕半宽/0.8;竖直方向:model深/2 对应 (fov/2)/0.8;取较大值
|
|
1090
|
+
var hDist = maxSize / 2 / screenFillFactor / Math.tan(Math.atan(Math.tan(fovRad / 2) / aspect));
|
|
1091
|
+
var vDist = maxSize / 2 / screenFillFactor / Math.tan(fovRad / 2);
|
|
1092
|
+
var distance = Math.max(hDist, vDist);
|
|
1093
|
+
|
|
1094
|
+
var azimuthRad = azimuthDeg * Math.PI / 180;
|
|
1095
|
+
var pitchRad = pitchDeg * Math.PI / 180;
|
|
1096
|
+
var cosPitch = Math.cos(pitchRad);
|
|
1097
|
+
var sinPitch = Math.sin(pitchRad);
|
|
1098
|
+
var cosAzimuth = Math.cos(azimuthRad);
|
|
1099
|
+
var sinAzimuth = Math.sin(azimuthRad);
|
|
1053
1100
|
|
|
1054
1101
|
self.core.camera.position.set(
|
|
1055
|
-
center.x + distance *
|
|
1056
|
-
center.y + distance *
|
|
1057
|
-
center.z + distance *
|
|
1102
|
+
center.x + distance * sinAzimuth * cosPitch,
|
|
1103
|
+
center.y + distance * sinPitch,
|
|
1104
|
+
center.z + distance * cosAzimuth * cosPitch
|
|
1058
1105
|
);
|
|
1059
1106
|
|
|
1060
1107
|
self.core.camera.lookAt(center);
|
|
@@ -1064,7 +1111,7 @@ KimapSDK.prototype.autoAdjustCamera = function(options) {
|
|
|
1064
1111
|
self.core.controls.update();
|
|
1065
1112
|
}
|
|
1066
1113
|
|
|
1067
|
-
console.log('KimapSDK:
|
|
1114
|
+
console.log('KimapSDK: 相机已自动调整(单楼层,俯角45°/方位角-37.94°,模型占屏80%)', {
|
|
1068
1115
|
center: center,
|
|
1069
1116
|
distance: distance,
|
|
1070
1117
|
size: size
|
package/src/core/SceneCore.js
CHANGED
|
@@ -138,14 +138,18 @@ SceneCore.prototype.setCameraPosition = function() {
|
|
|
138
138
|
var centerZ = origin.z;
|
|
139
139
|
var maxSize = Math.max(maxX, maxY);
|
|
140
140
|
|
|
141
|
-
// 单模型默认相机参数:俯仰角45°,方位角-37.94
|
|
142
|
-
var pitchDeg = 45;
|
|
141
|
+
// 单模型默认相机参数:俯仰角45°,方位角-37.94°,从侧面斜俯视,模型占屏幕80%
|
|
143
142
|
var azimuthDeg = -37.94;
|
|
144
|
-
var
|
|
145
|
-
var
|
|
143
|
+
var pitchDeg = 45;
|
|
144
|
+
var screenFillFactor = 0.8;
|
|
145
|
+
var aspect = this.camera ? this.camera.aspect : (this.container.clientWidth / this.container.clientHeight);
|
|
146
|
+
var fovRad = this.camera ? this.camera.fov * Math.PI / 180 : (60 * Math.PI / 180);
|
|
147
|
+
var hDist = maxSize / 2 / screenFillFactor / Math.tan(Math.atan(Math.tan(fovRad / 2) / aspect));
|
|
148
|
+
var vDist = maxSize / 2 / screenFillFactor / Math.tan(fovRad / 2);
|
|
149
|
+
var distance = Math.max(hDist, vDist);
|
|
146
150
|
|
|
147
|
-
var pitchRad = pitchDeg * Math.PI / 180;
|
|
148
151
|
var azimuthRad = azimuthDeg * Math.PI / 180;
|
|
152
|
+
var pitchRad = pitchDeg * Math.PI / 180;
|
|
149
153
|
var cosPitch = Math.cos(pitchRad);
|
|
150
154
|
var sinPitch = Math.sin(pitchRad);
|
|
151
155
|
var cosAzimuth = Math.cos(azimuthRad);
|
|
@@ -506,13 +510,11 @@ SceneCore.prototype._adjustCameraToAllFloors = function() {
|
|
|
506
510
|
box.getSize(size);
|
|
507
511
|
var maxSize = Math.max(size.x, size.z);
|
|
508
512
|
|
|
509
|
-
//
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
var
|
|
513
|
-
var
|
|
514
|
-
var baseDistance = 13.2;
|
|
515
|
-
var distance = maxSize > 0 ? (baseDistance / 10) * maxSize : baseDistance;
|
|
513
|
+
// 从侧方斜俯视:方位角 -45°(侧方),俯角 45°(polar≈60°,与调试值对应)
|
|
514
|
+
var pitchDeg = 45;
|
|
515
|
+
var azimuthDeg = -45;
|
|
516
|
+
var baseDistance = maxSize > 0 ? maxSize * 0.8 : 10;
|
|
517
|
+
var distance = baseDistance;
|
|
516
518
|
|
|
517
519
|
var pitchRad = pitchDeg * Math.PI / 180;
|
|
518
520
|
var azimuthRad = azimuthDeg * Math.PI / 180;
|
|
@@ -563,14 +565,18 @@ SceneCore.prototype.adjustCameraToFloor = function(floorIndex) {
|
|
|
563
565
|
box.getSize(size);
|
|
564
566
|
var maxSize = Math.max(size.x, size.z);
|
|
565
567
|
|
|
566
|
-
//
|
|
567
|
-
var pitchDeg = 45;
|
|
568
|
+
// 单楼层相机:俯仰角45°,方位角-37.94°,从侧面斜俯视,模型占屏幕80%
|
|
568
569
|
var azimuthDeg = -37.94;
|
|
569
|
-
var
|
|
570
|
-
var
|
|
570
|
+
var pitchDeg = 45;
|
|
571
|
+
var screenFillFactor = 0.8;
|
|
572
|
+
var aspect = this.camera ? this.camera.aspect : (this.container.clientWidth / this.container.clientHeight);
|
|
573
|
+
var fovRad = this.camera ? this.camera.fov * Math.PI / 180 : (60 * Math.PI / 180);
|
|
574
|
+
var hDist = maxSize / 2 / screenFillFactor / Math.tan(Math.atan(Math.tan(fovRad / 2) / aspect));
|
|
575
|
+
var vDist = maxSize / 2 / screenFillFactor / Math.tan(fovRad / 2);
|
|
576
|
+
var distance = Math.max(hDist, vDist);
|
|
571
577
|
|
|
572
|
-
var pitchRad = pitchDeg * Math.PI / 180;
|
|
573
578
|
var azimuthRad = azimuthDeg * Math.PI / 180;
|
|
579
|
+
var pitchRad = pitchDeg * Math.PI / 180;
|
|
574
580
|
var cosPitch = Math.cos(pitchRad);
|
|
575
581
|
var sinPitch = Math.sin(pitchRad);
|
|
576
582
|
var cosAzimuth = Math.cos(azimuthRad);
|
|
@@ -979,14 +985,18 @@ SceneCore.prototype._adjustCameraToModel = function() {
|
|
|
979
985
|
finalBox.getSize(finalSize);
|
|
980
986
|
var maxSize = Math.max(finalSize.x, finalSize.z);
|
|
981
987
|
|
|
982
|
-
//
|
|
983
|
-
var pitchDeg = 45;
|
|
988
|
+
// 单模型相机:俯仰角45°,方位角-37.94°,从侧面斜俯视,模型占屏幕80%
|
|
984
989
|
var azimuthDeg = -37.94;
|
|
985
|
-
var
|
|
986
|
-
var
|
|
990
|
+
var pitchDeg = 45;
|
|
991
|
+
var screenFillFactor = 0.8;
|
|
992
|
+
var aspect = this.camera ? this.camera.aspect : (this.container.clientWidth / this.container.clientHeight);
|
|
993
|
+
var fovRad = this.camera ? this.camera.fov * Math.PI / 180 : (60 * Math.PI / 180);
|
|
994
|
+
var hDist = maxSize / 2 / screenFillFactor / Math.tan(Math.atan(Math.tan(fovRad / 2) / aspect));
|
|
995
|
+
var vDist = maxSize / 2 / screenFillFactor / Math.tan(fovRad / 2);
|
|
996
|
+
var distance = Math.max(hDist, vDist);
|
|
987
997
|
|
|
988
|
-
var pitchRad = pitchDeg * Math.PI / 180;
|
|
989
998
|
var azimuthRad = azimuthDeg * Math.PI / 180;
|
|
999
|
+
var pitchRad = pitchDeg * Math.PI / 180;
|
|
990
1000
|
var cosPitch = Math.cos(pitchRad);
|
|
991
1001
|
var sinPitch = Math.sin(pitchRad);
|
|
992
1002
|
var cosAzimuth = Math.cos(azimuthRad);
|