@kimap/indoor-positioning-sdk-vue2 5.7.4 → 5.7.6

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.7.4",
3
+ "version": "5.7.6",
4
4
  "description": "Vue2自包含室内定位SDK - 完全兼容Webpack3+Babel6 | Vue2 Self-Contained Indoor Positioning SDK",
5
5
  "main": "index.js",
6
6
  "files": [
@@ -604,8 +604,18 @@ KimapSDK.prototype.changeFloor = function(floorIdOrIndex) {
604
604
  */
605
605
  KimapSDK.prototype.showSingleFloor = function(floorIndex) {
606
606
  if (!this.floorGroups || this.floorGroups.length === 0) return;
607
+ var self = this;
607
608
  this.floorGroups.forEach(function(group, index) {
608
- group.visible = index === floorIndex;
609
+ if (index === floorIndex) {
610
+ // 单层模式:将该楼层移动到贴地位置(y = 0)
611
+ group.visible = true;
612
+ group.position.y = 0;
613
+ } else {
614
+ // 隐藏其他楼层,同时移到下方避免干扰
615
+ group.visible = false;
616
+ var originalY = self.core.floorOriginalY[index] || 0;
617
+ group.position.y = -originalY - 1; // 移到地面以下
618
+ }
609
619
  });
610
620
  };
611
621
 
@@ -615,8 +625,12 @@ KimapSDK.prototype.showSingleFloor = function(floorIndex) {
615
625
  */
616
626
  KimapSDK.prototype.showAllFloors = function() {
617
627
  if (!this.floorGroups || this.floorGroups.length === 0) return;
618
- this.floorGroups.forEach(function(group) {
628
+ var self = this;
629
+ this.floorGroups.forEach(function(group, index) {
619
630
  group.visible = true;
631
+ // 恢复原始世界 Y 偏移(含间隙)
632
+ var originalY = self.core.floorOriginalY[index] || 0;
633
+ group.position.y = originalY;
620
634
  });
621
635
  };
622
636
 
@@ -742,11 +756,6 @@ KimapSDK.prototype.getCoordinateSystem = function() {
742
756
  */
743
757
  KimapSDK.prototype.autoAdjustCamera = function(options) {
744
758
  var self = this;
745
-
746
- if (!self.core || !self.core.mapModel) {
747
- console.warn('KimapSDK: 地图模型未加载,无法调整相机');
748
- return;
749
- }
750
759
 
751
760
  var opts = options || {};
752
761
  var distanceFactor = opts.distanceFactor !== undefined ? opts.distanceFactor : 1.0;
@@ -754,6 +763,43 @@ KimapSDK.prototype.autoAdjustCamera = function(options) {
754
763
  var yFactor = opts.yFactor !== undefined ? opts.yFactor : 0.4;
755
764
  var zFactor = opts.zFactor !== undefined ? opts.zFactor : 0.5;
756
765
 
766
+ // 多楼层模式:基于 floorGroups 计算包围盒
767
+ if (self.isMultiFloor && self.floorGroups && self.floorGroups.length > 0) {
768
+ var allMeshes = [];
769
+ self.floorGroups.forEach(function(group) {
770
+ group.traverse(function(child) {
771
+ if (child.isMesh) allMeshes.push(child);
772
+ });
773
+ });
774
+ if (allMeshes.length === 0) return;
775
+
776
+ var box = new THREE.Box3();
777
+ allMeshes.forEach(function(mesh) { box.expandByObject(mesh); });
778
+ var center = new THREE.Vector3();
779
+ var size = new THREE.Vector3();
780
+ box.getCenter(center);
781
+ box.getSize(size);
782
+
783
+ var maxDim = Math.max(size.x, size.z);
784
+ var distance = maxDim * distanceFactor * 2;
785
+
786
+ self.core.camera.position.set(center.x, center.y + distance * 1.5, center.z + distance);
787
+ self.core.camera.lookAt(center);
788
+ if (self.core.controls) {
789
+ self.core.controls.target.copy(center);
790
+ self.core.controls.update();
791
+ }
792
+
793
+ console.log('KimapSDK: 相机已自动调整(多楼层模式)', { center: center, distance: distance, size: size });
794
+ return self;
795
+ }
796
+
797
+ // 单楼层模式
798
+ if (!self.core || !self.core.mapModel) {
799
+ console.warn('KimapSDK: 地图模型未加载,无法调整相机');
800
+ return;
801
+ }
802
+
757
803
  var box = new THREE.Box3().setFromObject(self.core.mapModel);
758
804
  var center = new THREE.Vector3();
759
805
  var size = new THREE.Vector3();
@@ -771,7 +817,7 @@ KimapSDK.prototype.autoAdjustCamera = function(options) {
771
817
  );
772
818
 
773
819
  self.core.camera.lookAt(center);
774
-
820
+
775
821
  if (self.core.controls) {
776
822
  self.core.controls.target.copy(center);
777
823
  self.core.controls.update();
@@ -782,7 +828,7 @@ KimapSDK.prototype.autoAdjustCamera = function(options) {
782
828
  distance: distance,
783
829
  size: size
784
830
  });
785
-
831
+
786
832
  return self;
787
833
  };
788
834
 
@@ -64,6 +64,7 @@ function SceneCore(config) {
64
64
  this.floorGroups = [];
65
65
  this.floorHeight = 3; // 米
66
66
  this.isMultiFloor = Array.isArray(config.objUrl);
67
+ this.floorOriginalY = []; // 每个楼层的原始世界Y偏移(含间隙)
67
68
  }
68
69
 
69
70
  /**
@@ -363,8 +364,6 @@ SceneCore.prototype._loadKimapFileToGroup = function(kimapUrl, themeUrl, objLoad
363
364
  if (borderInfo) self._borderInfo = borderInfo;
364
365
  var mapConfig = extractMapConfigFromOBJ(objContent);
365
366
  if (mapConfig && mapConfig.isCalibrated) self._mapConfig = mapConfig;
366
- var textElements = extractTextElementsFromOBJ(objContent);
367
- if (textElements && textElements.length > 0) self._textElements = textElements;
368
367
  var wallOpacity = extractWallOpacityFromOBJ(objContent);
369
368
  if (wallOpacity && Object.keys(wallOpacity).length > 0) self._wallOpacity = wallOpacity;
370
369
  var shapeOpacity = extractShapeOpacityFromOBJ(objContent);
@@ -373,6 +372,16 @@ SceneCore.prototype._loadKimapFileToGroup = function(kimapUrl, themeUrl, objLoad
373
372
  var colorMap = materials ? {} : extractColorsFromOBJ(objContent);
374
373
  var object = objLoader.parse(objContent);
375
374
  self._processLoadedModelToGroup(object, materials, colorMap, floorGroup, floorIndex);
375
+
376
+ // 提取文字元素(每个楼层都提取,以第一个楼层为准)
377
+ if (!self._textElements || self._textElements.length === 0) {
378
+ var textElements = extractTextElementsFromOBJ(objContent);
379
+ if (textElements && textElements.length > 0) {
380
+ self._textElements = textElements;
381
+ self.renderTextElements(self._textElements);
382
+ }
383
+ }
384
+
376
385
  resolve();
377
386
  } catch (error) {
378
387
  reject(error);
@@ -410,8 +419,24 @@ SceneCore.prototype._processLoadedModelToGroup = function(object, materials, col
410
419
  floorGroup.add(object);
411
420
 
412
421
  var box = new THREE.Box3().setFromObject(object);
413
- var floorY = floorIndex * self.floorHeight;
414
- object.position.set(-box.min.x, -box.min.y + floorY, -box.min.z);
422
+ var boxHeight = box.max.y - box.min.y;
423
+
424
+ // 逐层累积高度:每个楼层的地面 = 前几个楼层的总高度
425
+ var floorY = 0;
426
+ for (var i = 0; i < floorIndex; i++) {
427
+ var prevGroup = self.floorGroups[i];
428
+ if (prevGroup) {
429
+ var prevBox = new THREE.Box3().setFromObject(prevGroup);
430
+ floorY += (prevBox.max.y - prevBox.min.y);
431
+ }
432
+ }
433
+
434
+ // 修正当前楼层的 Y 偏移:使用 box.max.y(顶面高度)作为该楼层占据的高度基准,
435
+ // 这样每个楼层的地面(min.y)都对齐到正确的世界高度
436
+ object.position.set(-box.min.x, floorY - box.min.y, -box.min.z);
437
+
438
+ // 记录每个楼层的原始世界 Y 偏移(ALL 模式时使用)
439
+ self.floorOriginalY[floorIndex] = floorY;
415
440
 
416
441
  // 复用 backup 的材质处理策略,不改渲染风格
417
442
  object.traverse(function(child) {