@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 +1 -1
- package/src/core/KimapSDK.js +55 -9
- package/src/core/SceneCore.js +29 -4
package/package.json
CHANGED
package/src/core/KimapSDK.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
|
package/src/core/SceneCore.js
CHANGED
|
@@ -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
|
|
414
|
-
|
|
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) {
|