@kimap/indoor-positioning-sdk-vue2 3.1.12 → 3.1.13
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/KimapCore.js +15 -113
package/package.json
CHANGED
package/src/KimapCore.js
CHANGED
|
@@ -303,15 +303,6 @@ SceneCore.prototype.setCameraPosition = function() {
|
|
|
303
303
|
var maxX = this.coordinateSystem.maxX;
|
|
304
304
|
var maxY = this.coordinateSystem.maxY;
|
|
305
305
|
|
|
306
|
-
// 如果 maxX 或 maxY 未定义,使用默认值(稍后会根据实际模型尺寸重新调整)
|
|
307
|
-
if (maxX === undefined || maxY === undefined) {
|
|
308
|
-
console.log('⚠️ 坐标系统尺寸未定义,使用默认相机位置(将在模型加载后自动调整)');
|
|
309
|
-
// 使用一个合理的默认位置:从斜上方俯视原点
|
|
310
|
-
this.camera.position.set(origin.x, 15, origin.z + 10);
|
|
311
|
-
this.camera.lookAt(origin.x, 0, origin.z);
|
|
312
|
-
return;
|
|
313
|
-
}
|
|
314
|
-
|
|
315
306
|
var centerX = origin.x + maxX / 2;
|
|
316
307
|
var centerZ = origin.z;
|
|
317
308
|
var distance = Math.max(maxX, maxY) * 1.5;
|
|
@@ -506,47 +497,19 @@ SceneCore.prototype.loadMap = function(OBJLoader, MTLLoader) {
|
|
|
506
497
|
self.mapModel = object;
|
|
507
498
|
self.scene.add(self.mapModel);
|
|
508
499
|
|
|
509
|
-
//
|
|
500
|
+
// 计算包围盒并调整模型位置,使其居中对齐
|
|
510
501
|
var box = new THREE.Box3().setFromObject(self.mapModel);
|
|
511
502
|
var center = new THREE.Vector3();
|
|
512
503
|
box.getCenter(center);
|
|
513
504
|
|
|
514
|
-
console.log('📦 模型原始包围盒:', {
|
|
515
|
-
min: { x: box.min.x.toFixed(2), y: box.min.y.toFixed(2), z: box.min.z.toFixed(2) },
|
|
516
|
-
max: { x: box.max.x.toFixed(2), y: box.max.y.toFixed(2), z: box.max.z.toFixed(2) },
|
|
517
|
-
center: { x: center.x.toFixed(2), y: center.y.toFixed(2), z: center.z.toFixed(2) }
|
|
518
|
-
});
|
|
519
|
-
|
|
520
|
-
// 如果有边界信息,使用边界信息来定位模型
|
|
521
|
-
// 目标:让模型的 min 点对齐到边界的 min 点
|
|
522
505
|
var origin = self.coordinateSystem.origin;
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
offsetY = origin.y + borderInfo.min.y - box.min.y;
|
|
529
|
-
offsetZ = origin.z + borderInfo.min.z - box.min.z;
|
|
530
|
-
|
|
531
|
-
console.log('✅ 使用边界信息定位模型');
|
|
532
|
-
console.log('🎯 目标边界:', borderInfo);
|
|
533
|
-
} else {
|
|
534
|
-
// 没有边界信息,使用传统的居中对齐方式
|
|
535
|
-
offsetX = origin.x - center.x;
|
|
536
|
-
offsetY = origin.y - box.min.y;
|
|
537
|
-
offsetZ = origin.z - center.z;
|
|
538
|
-
|
|
539
|
-
console.log('⚠️ 未找到边界信息,使用居中对齐方式');
|
|
540
|
-
}
|
|
541
|
-
|
|
542
|
-
self.mapModel.position.set(offsetX, offsetY, offsetZ);
|
|
506
|
+
self.mapModel.position.set(
|
|
507
|
+
origin.x - center.x, // X方向居中
|
|
508
|
+
origin.y - box.min.y, // Y方向:底部对齐地面
|
|
509
|
+
origin.z - center.z // Z方向居中
|
|
510
|
+
);
|
|
543
511
|
|
|
544
|
-
console.log('
|
|
545
|
-
x: offsetX.toFixed(2),
|
|
546
|
-
y: offsetY.toFixed(2),
|
|
547
|
-
z: offsetZ.toFixed(2)
|
|
548
|
-
});
|
|
549
|
-
console.log('✅ 模型已对齐');
|
|
512
|
+
console.log('✅ 模型已居中对齐到原点');
|
|
550
513
|
|
|
551
514
|
// 统计模型信息
|
|
552
515
|
var meshCount = 0;
|
|
@@ -655,98 +618,37 @@ SceneCore.prototype.loadMap = function(OBJLoader, MTLLoader) {
|
|
|
655
618
|
|
|
656
619
|
// 基于模型包围盒自动调整相机位置和控制器目标,避免依赖配置中的 maxX/maxY
|
|
657
620
|
try {
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
// 🔧 修复:只计算可见mesh的包围盒,排除隐藏的地平面
|
|
661
|
-
var finalBox = new THREE.Box3();
|
|
662
|
-
var visibleMeshCount = 0;
|
|
663
|
-
|
|
664
|
-
self.mapModel.traverse(function(child) {
|
|
665
|
-
if (child instanceof THREE.Mesh && child.visible) {
|
|
666
|
-
// 排除隐藏的交互层
|
|
667
|
-
if (child.name === 'HiddenGroundPlane' || child.name.includes('InteractionLayer')) {
|
|
668
|
-
return;
|
|
669
|
-
}
|
|
670
|
-
|
|
671
|
-
// 计算该mesh的包围盒并扩展总包围盒
|
|
672
|
-
var meshBox = new THREE.Box3().setFromObject(child);
|
|
673
|
-
finalBox.union(meshBox);
|
|
674
|
-
visibleMeshCount++;
|
|
675
|
-
}
|
|
676
|
-
});
|
|
677
|
-
|
|
678
|
-
console.log('✅ 计算了 ' + visibleMeshCount + ' 个可见mesh的包围盒');
|
|
679
|
-
|
|
621
|
+
// 使用模型当前位置重新计算包围盒和中心
|
|
622
|
+
var finalBox = new THREE.Box3().setFromObject(self.mapModel);
|
|
680
623
|
var finalCenter = new THREE.Vector3();
|
|
681
624
|
finalBox.getCenter(finalCenter);
|
|
682
|
-
|
|
683
|
-
console.log('📦 可见模型包围盒:', {
|
|
684
|
-
min: { x: finalBox.min.x.toFixed(2), y: finalBox.min.y.toFixed(2), z: finalBox.min.z.toFixed(2) },
|
|
685
|
-
max: { x: finalBox.max.x.toFixed(2), y: finalBox.max.y.toFixed(2), z: finalBox.max.z.toFixed(2) }
|
|
686
|
-
});
|
|
687
|
-
console.log('🎯 可见模型中心:', {
|
|
688
|
-
x: finalCenter.x.toFixed(2),
|
|
689
|
-
y: finalCenter.y.toFixed(2),
|
|
690
|
-
z: finalCenter.z.toFixed(2)
|
|
691
|
-
});
|
|
692
625
|
|
|
693
626
|
var finalSize = new THREE.Vector3();
|
|
694
627
|
finalBox.getSize(finalSize);
|
|
695
628
|
var maxSize = Math.max(finalSize.x, finalSize.z);
|
|
696
|
-
|
|
697
|
-
console.log('📏 可见模型尺寸:', {
|
|
698
|
-
x: finalSize.x.toFixed(2),
|
|
699
|
-
y: finalSize.y.toFixed(2),
|
|
700
|
-
z: finalSize.z.toFixed(2),
|
|
701
|
-
maxSize: maxSize.toFixed(2)
|
|
702
|
-
});
|
|
703
629
|
|
|
704
630
|
// 根据模型尺寸计算一个合理的视距
|
|
705
631
|
var distance = maxSize * 1.5;
|
|
706
|
-
|
|
707
|
-
// 确保最小距离,避免相机太近
|
|
708
|
-
if (distance < 10) {
|
|
709
|
-
distance = 10;
|
|
710
|
-
console.log('⚠️ 相机距离太近,调整为最小值: 10');
|
|
711
|
-
}
|
|
712
|
-
|
|
713
|
-
console.log('📹 计算相机距离:', distance.toFixed(2));
|
|
714
632
|
|
|
715
633
|
// 相机从斜上方俯视模型中心
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
634
|
+
self.camera.position.set(
|
|
635
|
+
finalCenter.x,
|
|
636
|
+
finalCenter.y + distance,
|
|
637
|
+
finalCenter.z + distance * 0.5
|
|
638
|
+
);
|
|
721
639
|
self.camera.lookAt(finalCenter.x, finalCenter.y, finalCenter.z);
|
|
722
|
-
|
|
723
|
-
console.log('📹 相机位置:', {
|
|
724
|
-
x: cameraX.toFixed(2),
|
|
725
|
-
y: cameraY.toFixed(2),
|
|
726
|
-
z: cameraZ.toFixed(2)
|
|
727
|
-
});
|
|
728
|
-
console.log('👀 相机朝向:', {
|
|
729
|
-
x: finalCenter.x.toFixed(2),
|
|
730
|
-
y: finalCenter.y.toFixed(2),
|
|
731
|
-
z: finalCenter.z.toFixed(2)
|
|
732
|
-
});
|
|
733
640
|
|
|
734
641
|
// 更新控制器目标为模型中心
|
|
735
642
|
if (self.controls) {
|
|
736
643
|
self.controls.target.copy(finalCenter);
|
|
737
644
|
self.controls.update();
|
|
738
|
-
console.log('🎮 控制器目标已更新');
|
|
739
645
|
}
|
|
740
646
|
|
|
741
647
|
// 更新坐标系范围为模型的实际尺寸,供其它功能使用
|
|
742
648
|
self.coordinateSystem.maxX = finalSize.x;
|
|
743
649
|
self.coordinateSystem.maxY = finalSize.z;
|
|
744
|
-
|
|
745
|
-
console.log('✅ 相机自动调整完成');
|
|
746
|
-
console.log('=========================');
|
|
747
650
|
} catch (e) {
|
|
748
|
-
console.
|
|
749
|
-
console.error('错误堆栈:', e.stack);
|
|
651
|
+
console.warn('根据模型自动调整相机位置失败:', e && e.message ? e.message : e);
|
|
750
652
|
}
|
|
751
653
|
|
|
752
654
|
resolve();
|