@kimap/indoor-positioning-sdk-vue2 5.7.3 → 5.7.5
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 +39 -7
- package/src/core/SceneCore.js +25 -4
package/package.json
CHANGED
package/src/core/KimapSDK.js
CHANGED
|
@@ -742,11 +742,6 @@ KimapSDK.prototype.getCoordinateSystem = function() {
|
|
|
742
742
|
*/
|
|
743
743
|
KimapSDK.prototype.autoAdjustCamera = function(options) {
|
|
744
744
|
var self = this;
|
|
745
|
-
|
|
746
|
-
if (!self.core || !self.core.mapModel) {
|
|
747
|
-
console.warn('KimapSDK: 地图模型未加载,无法调整相机');
|
|
748
|
-
return;
|
|
749
|
-
}
|
|
750
745
|
|
|
751
746
|
var opts = options || {};
|
|
752
747
|
var distanceFactor = opts.distanceFactor !== undefined ? opts.distanceFactor : 1.0;
|
|
@@ -754,6 +749,43 @@ KimapSDK.prototype.autoAdjustCamera = function(options) {
|
|
|
754
749
|
var yFactor = opts.yFactor !== undefined ? opts.yFactor : 0.4;
|
|
755
750
|
var zFactor = opts.zFactor !== undefined ? opts.zFactor : 0.5;
|
|
756
751
|
|
|
752
|
+
// 多楼层模式:基于 floorGroups 计算包围盒
|
|
753
|
+
if (self.isMultiFloor && self.floorGroups && self.floorGroups.length > 0) {
|
|
754
|
+
var allMeshes = [];
|
|
755
|
+
self.floorGroups.forEach(function(group) {
|
|
756
|
+
group.traverse(function(child) {
|
|
757
|
+
if (child.isMesh) allMeshes.push(child);
|
|
758
|
+
});
|
|
759
|
+
});
|
|
760
|
+
if (allMeshes.length === 0) return;
|
|
761
|
+
|
|
762
|
+
var box = new THREE.Box3();
|
|
763
|
+
allMeshes.forEach(function(mesh) { box.expandByObject(mesh); });
|
|
764
|
+
var center = new THREE.Vector3();
|
|
765
|
+
var size = new THREE.Vector3();
|
|
766
|
+
box.getCenter(center);
|
|
767
|
+
box.getSize(size);
|
|
768
|
+
|
|
769
|
+
var maxDim = Math.max(size.x, size.z);
|
|
770
|
+
var distance = maxDim * distanceFactor * 2;
|
|
771
|
+
|
|
772
|
+
self.core.camera.position.set(center.x, center.y + distance * 1.5, center.z + distance);
|
|
773
|
+
self.core.camera.lookAt(center);
|
|
774
|
+
if (self.core.controls) {
|
|
775
|
+
self.core.controls.target.copy(center);
|
|
776
|
+
self.core.controls.update();
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
console.log('KimapSDK: 相机已自动调整(多楼层模式)', { center: center, distance: distance, size: size });
|
|
780
|
+
return self;
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
// 单楼层模式
|
|
784
|
+
if (!self.core || !self.core.mapModel) {
|
|
785
|
+
console.warn('KimapSDK: 地图模型未加载,无法调整相机');
|
|
786
|
+
return;
|
|
787
|
+
}
|
|
788
|
+
|
|
757
789
|
var box = new THREE.Box3().setFromObject(self.core.mapModel);
|
|
758
790
|
var center = new THREE.Vector3();
|
|
759
791
|
var size = new THREE.Vector3();
|
|
@@ -771,7 +803,7 @@ KimapSDK.prototype.autoAdjustCamera = function(options) {
|
|
|
771
803
|
);
|
|
772
804
|
|
|
773
805
|
self.core.camera.lookAt(center);
|
|
774
|
-
|
|
806
|
+
|
|
775
807
|
if (self.core.controls) {
|
|
776
808
|
self.core.controls.target.copy(center);
|
|
777
809
|
self.core.controls.update();
|
|
@@ -782,7 +814,7 @@ KimapSDK.prototype.autoAdjustCamera = function(options) {
|
|
|
782
814
|
distance: distance,
|
|
783
815
|
size: size
|
|
784
816
|
});
|
|
785
|
-
|
|
817
|
+
|
|
786
818
|
return self;
|
|
787
819
|
};
|
|
788
820
|
|
package/src/core/SceneCore.js
CHANGED
|
@@ -363,8 +363,6 @@ SceneCore.prototype._loadKimapFileToGroup = function(kimapUrl, themeUrl, objLoad
|
|
|
363
363
|
if (borderInfo) self._borderInfo = borderInfo;
|
|
364
364
|
var mapConfig = extractMapConfigFromOBJ(objContent);
|
|
365
365
|
if (mapConfig && mapConfig.isCalibrated) self._mapConfig = mapConfig;
|
|
366
|
-
var textElements = extractTextElementsFromOBJ(objContent);
|
|
367
|
-
if (textElements && textElements.length > 0) self._textElements = textElements;
|
|
368
366
|
var wallOpacity = extractWallOpacityFromOBJ(objContent);
|
|
369
367
|
if (wallOpacity && Object.keys(wallOpacity).length > 0) self._wallOpacity = wallOpacity;
|
|
370
368
|
var shapeOpacity = extractShapeOpacityFromOBJ(objContent);
|
|
@@ -373,6 +371,16 @@ SceneCore.prototype._loadKimapFileToGroup = function(kimapUrl, themeUrl, objLoad
|
|
|
373
371
|
var colorMap = materials ? {} : extractColorsFromOBJ(objContent);
|
|
374
372
|
var object = objLoader.parse(objContent);
|
|
375
373
|
self._processLoadedModelToGroup(object, materials, colorMap, floorGroup, floorIndex);
|
|
374
|
+
|
|
375
|
+
// 提取文字元素(每个楼层都提取,以第一个楼层为准)
|
|
376
|
+
if (!self._textElements || self._textElements.length === 0) {
|
|
377
|
+
var textElements = extractTextElementsFromOBJ(objContent);
|
|
378
|
+
if (textElements && textElements.length > 0) {
|
|
379
|
+
self._textElements = textElements;
|
|
380
|
+
self.renderTextElements(self._textElements);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
|
|
376
384
|
resolve();
|
|
377
385
|
} catch (error) {
|
|
378
386
|
reject(error);
|
|
@@ -410,8 +418,21 @@ SceneCore.prototype._processLoadedModelToGroup = function(object, materials, col
|
|
|
410
418
|
floorGroup.add(object);
|
|
411
419
|
|
|
412
420
|
var box = new THREE.Box3().setFromObject(object);
|
|
413
|
-
var
|
|
414
|
-
|
|
421
|
+
var boxHeight = box.max.y - box.min.y;
|
|
422
|
+
|
|
423
|
+
// 逐层累积高度:每个楼层的地面 = 前几个楼层的总高度
|
|
424
|
+
var floorY = 0;
|
|
425
|
+
for (var i = 0; i < floorIndex; i++) {
|
|
426
|
+
var prevGroup = self.floorGroups[i];
|
|
427
|
+
if (prevGroup) {
|
|
428
|
+
var prevBox = new THREE.Box3().setFromObject(prevGroup);
|
|
429
|
+
floorY += (prevBox.max.y - prevBox.min.y);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// 修正当前楼层的 Y 偏移:使用 box.max.y(顶面高度)作为该楼层占据的高度基准,
|
|
434
|
+
// 这样每个楼层的地面(min.y)都对齐到正确的世界高度
|
|
435
|
+
object.position.set(-box.min.x, floorY - box.min.y, -box.min.z);
|
|
415
436
|
|
|
416
437
|
// 复用 backup 的材质处理策略,不改渲染风格
|
|
417
438
|
object.traverse(function(child) {
|