@kimap/indoor-positioning-sdk-vue2 5.9.8 → 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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kimap/indoor-positioning-sdk-vue2",
3
- "version": "5.9.8",
3
+ "version": "6.0.2",
4
4
  "description": "Vue2自包含室内定位SDK - 完全兼容Webpack3+Babel6 | Vue2 Self-Contained Indoor Positioning SDK",
5
5
  "main": "index.js",
6
6
  "files": [
@@ -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
- // -60° 俯角:camera.y = center.y + dist*0.866, camera.z = center.z + dist*0.5
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 + dist * 0.866,
748
- center.z + dist * 0.5
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
- }, 1200, function() {
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 外景视角,俯角约 -15°)
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
- // -60° 俯角:sin(60°)=0.866, cos(60°)=0.5(从模型斜上方俯视)
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 + dist * 0.866,
814
- center.z + dist * 0.5
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
- }, 1200, function() {
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 maxDim = Math.max(size.x, size.y, size.z);
1052
- var distance = maxDim * distanceFactor;
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 * xFactor,
1056
- center.y + distance * yFactor,
1057
- center.z + distance * zFactor
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
@@ -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
- // 单模型默认相机参数:俯仰角47.52°,方位角-37.94°,基准距离11.49
142
- var pitchDeg = 47.52;
141
+ // 单模型默认相机参数:俯仰角45°,方位角-37.94°,从侧面斜俯视,模型占屏幕80%
143
142
  var azimuthDeg = -37.94;
144
- var baseDistance = 11.49;
145
- var distance = maxSize > 0 ? (baseDistance / 10) * maxSize : baseDistance;
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,11 +510,11 @@ SceneCore.prototype._adjustCameraToAllFloors = function() {
506
510
  box.getSize(size);
507
511
  var maxSize = Math.max(size.x, size.z);
508
512
 
509
- // ALL多模型相机参数:俯仰角61.19°,方位角-47.86°,基准距离12.21
510
- var pitchDeg = 61.19;
511
- var azimuthDeg = -47.86;
512
- var baseDistance = 12.21;
513
- 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;
514
518
 
515
519
  var pitchRad = pitchDeg * Math.PI / 180;
516
520
  var azimuthRad = azimuthDeg * Math.PI / 180;
@@ -561,14 +565,18 @@ SceneCore.prototype.adjustCameraToFloor = function(floorIndex) {
561
565
  box.getSize(size);
562
566
  var maxSize = Math.max(size.x, size.z);
563
567
 
564
- // 单模型相机参数:俯仰角47.52°,方位角-37.94°,基准距离11.49
565
- var pitchDeg = 47.52;
568
+ // 单楼层相机:俯仰角45°,方位角-37.94°,从侧面斜俯视,模型占屏幕80%
566
569
  var azimuthDeg = -37.94;
567
- var baseDistance = 11.49;
568
- var distance = maxSize > 0 ? (baseDistance / 10) * maxSize : baseDistance;
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);
569
577
 
570
- var pitchRad = pitchDeg * Math.PI / 180;
571
578
  var azimuthRad = azimuthDeg * Math.PI / 180;
579
+ var pitchRad = pitchDeg * Math.PI / 180;
572
580
  var cosPitch = Math.cos(pitchRad);
573
581
  var sinPitch = Math.sin(pitchRad);
574
582
  var cosAzimuth = Math.cos(azimuthRad);
@@ -977,14 +985,18 @@ SceneCore.prototype._adjustCameraToModel = function() {
977
985
  finalBox.getSize(finalSize);
978
986
  var maxSize = Math.max(finalSize.x, finalSize.z);
979
987
 
980
- // 单模型相机参数:俯仰角47.52°,方位角-37.94°,基准距离11.49
981
- var pitchDeg = 47.52;
988
+ // 单模型相机:俯仰角45°,方位角-37.94°,从侧面斜俯视,模型占屏幕80%
982
989
  var azimuthDeg = -37.94;
983
- var baseDistance = 11.49;
984
- var distance = maxSize > 0 ? (baseDistance / 10) * maxSize : baseDistance;
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);
985
997
 
986
- var pitchRad = pitchDeg * Math.PI / 180;
987
998
  var azimuthRad = azimuthDeg * Math.PI / 180;
999
+ var pitchRad = pitchDeg * Math.PI / 180;
988
1000
  var cosPitch = Math.cos(pitchRad);
989
1001
  var sinPitch = Math.sin(pitchRad);
990
1002
  var cosAzimuth = Math.cos(azimuthRad);