@kimap/indoor-positioning-sdk-vue2 3.1.7 → 3.1.10
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 +87 -13
package/package.json
CHANGED
package/src/KimapCore.js
CHANGED
|
@@ -303,6 +303,15 @@ 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
|
+
|
|
306
315
|
var centerX = origin.x + maxX / 2;
|
|
307
316
|
var centerZ = origin.z;
|
|
308
317
|
var distance = Math.max(maxX, maxY) * 1.5;
|
|
@@ -497,19 +506,47 @@ SceneCore.prototype.loadMap = function(OBJLoader, MTLLoader) {
|
|
|
497
506
|
self.mapModel = object;
|
|
498
507
|
self.scene.add(self.mapModel);
|
|
499
508
|
|
|
500
|
-
//
|
|
509
|
+
// 计算包围盒
|
|
501
510
|
var box = new THREE.Box3().setFromObject(self.mapModel);
|
|
502
511
|
var center = new THREE.Vector3();
|
|
503
512
|
box.getCenter(center);
|
|
504
513
|
|
|
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 点
|
|
505
522
|
var origin = self.coordinateSystem.origin;
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
523
|
+
var offsetX, offsetY, offsetZ;
|
|
524
|
+
|
|
525
|
+
if (border) {
|
|
526
|
+
// 计算需要的偏移量:将模型的 min 点移动到边界的 min 点
|
|
527
|
+
offsetX = origin.x + border.min.x - box.min.x;
|
|
528
|
+
offsetY = origin.y + border.min.y - box.min.y;
|
|
529
|
+
offsetZ = origin.z + border.min.z - box.min.z;
|
|
530
|
+
|
|
531
|
+
console.log('✅ 使用边界信息定位模型');
|
|
532
|
+
console.log('🎯 目标边界:', border);
|
|
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
|
+
}
|
|
511
541
|
|
|
512
|
-
|
|
542
|
+
self.mapModel.position.set(offsetX, offsetY, offsetZ);
|
|
543
|
+
|
|
544
|
+
console.log('📍 模型位置偏移:', {
|
|
545
|
+
x: offsetX.toFixed(2),
|
|
546
|
+
y: offsetY.toFixed(2),
|
|
547
|
+
z: offsetZ.toFixed(2)
|
|
548
|
+
});
|
|
549
|
+
console.log('✅ 模型已对齐');
|
|
513
550
|
|
|
514
551
|
// 统计模型信息
|
|
515
552
|
var meshCount = 0;
|
|
@@ -618,37 +655,74 @@ SceneCore.prototype.loadMap = function(OBJLoader, MTLLoader) {
|
|
|
618
655
|
|
|
619
656
|
// 基于模型包围盒自动调整相机位置和控制器目标,避免依赖配置中的 maxX/maxY
|
|
620
657
|
try {
|
|
658
|
+
console.log('=== 开始自动调整相机位置 ===');
|
|
659
|
+
|
|
621
660
|
// 使用模型当前位置重新计算包围盒和中心
|
|
622
661
|
var finalBox = new THREE.Box3().setFromObject(self.mapModel);
|
|
623
662
|
var finalCenter = new THREE.Vector3();
|
|
624
663
|
finalBox.getCenter(finalCenter);
|
|
664
|
+
|
|
665
|
+
console.log('📦 模型最终包围盒:', {
|
|
666
|
+
min: { x: finalBox.min.x.toFixed(2), y: finalBox.min.y.toFixed(2), z: finalBox.min.z.toFixed(2) },
|
|
667
|
+
max: { x: finalBox.max.x.toFixed(2), y: finalBox.max.y.toFixed(2), z: finalBox.max.z.toFixed(2) }
|
|
668
|
+
});
|
|
669
|
+
console.log('🎯 模型中心:', {
|
|
670
|
+
x: finalCenter.x.toFixed(2),
|
|
671
|
+
y: finalCenter.y.toFixed(2),
|
|
672
|
+
z: finalCenter.z.toFixed(2)
|
|
673
|
+
});
|
|
625
674
|
|
|
626
675
|
var finalSize = new THREE.Vector3();
|
|
627
676
|
finalBox.getSize(finalSize);
|
|
628
677
|
var maxSize = Math.max(finalSize.x, finalSize.z);
|
|
678
|
+
|
|
679
|
+
console.log('📏 模型尺寸:', {
|
|
680
|
+
x: finalSize.x.toFixed(2),
|
|
681
|
+
y: finalSize.y.toFixed(2),
|
|
682
|
+
z: finalSize.z.toFixed(2),
|
|
683
|
+
maxSize: maxSize.toFixed(2)
|
|
684
|
+
});
|
|
629
685
|
|
|
630
686
|
// 根据模型尺寸计算一个合理的视距
|
|
631
687
|
var distance = maxSize * 1.5;
|
|
688
|
+
|
|
689
|
+
console.log('📹 计算相机距离:', distance.toFixed(2));
|
|
632
690
|
|
|
633
691
|
// 相机从斜上方俯视模型中心
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
);
|
|
692
|
+
var cameraX = finalCenter.x;
|
|
693
|
+
var cameraY = finalCenter.y + distance;
|
|
694
|
+
var cameraZ = finalCenter.z + distance * 0.5;
|
|
695
|
+
|
|
696
|
+
self.camera.position.set(cameraX, cameraY, cameraZ);
|
|
639
697
|
self.camera.lookAt(finalCenter.x, finalCenter.y, finalCenter.z);
|
|
698
|
+
|
|
699
|
+
console.log('📹 相机位置:', {
|
|
700
|
+
x: cameraX.toFixed(2),
|
|
701
|
+
y: cameraY.toFixed(2),
|
|
702
|
+
z: cameraZ.toFixed(2)
|
|
703
|
+
});
|
|
704
|
+
console.log('👀 相机朝向:', {
|
|
705
|
+
x: finalCenter.x.toFixed(2),
|
|
706
|
+
y: finalCenter.y.toFixed(2),
|
|
707
|
+
z: finalCenter.z.toFixed(2)
|
|
708
|
+
});
|
|
640
709
|
|
|
641
710
|
// 更新控制器目标为模型中心
|
|
642
711
|
if (self.controls) {
|
|
643
712
|
self.controls.target.copy(finalCenter);
|
|
644
713
|
self.controls.update();
|
|
714
|
+
console.log('🎮 控制器目标已更新');
|
|
645
715
|
}
|
|
646
716
|
|
|
647
717
|
// 更新坐标系范围为模型的实际尺寸,供其它功能使用
|
|
648
718
|
self.coordinateSystem.maxX = finalSize.x;
|
|
649
719
|
self.coordinateSystem.maxY = finalSize.z;
|
|
720
|
+
|
|
721
|
+
console.log('✅ 相机自动调整完成');
|
|
722
|
+
console.log('=========================');
|
|
650
723
|
} catch (e) {
|
|
651
|
-
console.
|
|
724
|
+
console.error('❌ 根据模型自动调整相机位置失败:', e && e.message ? e.message : e);
|
|
725
|
+
console.error('错误堆栈:', e.stack);
|
|
652
726
|
}
|
|
653
727
|
|
|
654
728
|
resolve();
|