소스 검색

fix: 和bim同步点错误

xzw 1 년 전
부모
커밋
1a2fef790e
1개의 변경된 파일21개의 추가작업 그리고 22개의 파일을 삭제
  1. 21 22
      src/utils/ConvertViews.js

+ 21 - 22
src/utils/ConvertViews.js

@@ -571,7 +571,7 @@ export default class ConvertViews extends THREE.EventDispatcher{
             })  
             convertInfo.sourceFakeApp = o.sourceApp.fakeApp 
             convertInfo.targetFakeApp = o.targetApp.fakeApp 
-        }else{
+        }else{//bim
             panoPos1 = o.sourcePano.map(e=>e.position) //pick两个点来计算
             panoPos2 = o.targetPano.map(e=>e.position)
              
@@ -608,28 +608,27 @@ export default class ConvertViews extends THREE.EventDispatcher{
         //检查是否重合。直接将matrix作用于pos1中,理想情况是会和pos2完全一样。
 
         let length = Math.min(panoPos1.length,  panoPos2.length)
-        
-        let diffVecs = panoPos1.slice(length).map((e,i)=>{
-            let newPos = e.clone().applyMatrix4(matrix) //旋转过后。
-            return new THREE.Vector3().subVectors(newPos, panoPos2[i]) // 和pos1之间的偏差。越小越重合
-        })   
-        let disDiffs = diffVecs.map(e=>e.length())
-        let disDiffs2 = disDiffs.sort((a,b)=>{return a-b})
-        let maxTolerance = 2 * disDiffs2[Math.round(diffVecs.length/3)]  //最大值限制在1/3的两倍处。不用绝对数值的原因:主要考虑到万一拍摄间隔很大,那么最小的diff都可能很大,所以还是按比例划分吧。    
-        if(disDiffs2[1]>=maxTolerance){//至少有两个 
-            maxTolerance = disDiffs2[1]
+        if(length>2){
+            let diffVecs = panoPos1.slice(0,length).map((e,i)=>{
+                let newPos = e.clone().applyMatrix4(matrix) //旋转过后。
+                return new THREE.Vector3().subVectors(newPos, panoPos2[i]) // 和pos1之间的偏差。越小越重合
+            })   
+            let disDiffs = diffVecs.map(e=>e.length())
+            let disDiffs2 = disDiffs.sort((a,b)=>{return a-b})
+            let maxTolerance = 2 * disDiffs2[Math.round(diffVecs.length/3)]  //最大值限制在1/3的两倍处。不用绝对数值的原因:主要考虑到万一拍摄间隔很大,那么最小的diff都可能很大,所以还是按比例划分吧。    
+            if(disDiffs2[1]>=maxTolerance){//至少有两个 
+                maxTolerance = disDiffs2[1]
+            }
+            console.log('difVecs',diffVecs, 'disDiffs2',disDiffs2,'maxTolerance',maxTolerance)   
+            
+            
+            //排除掉偏差大的坏点
+            let panoPos1new = panoPos1.filter((p,i)=>{return disDiffs[i]<=maxTolerance})    
+            let panoPos2new = panoPos2.filter((p,i)=>{return disDiffs[i]<=maxTolerance})    
+            if(panoPos1new.length > 1 && panoPos2new.length > 1){  //用剩下的点再算一次   
+                matrix = compute(panoPos1new,panoPos2new)
+            }
         }
-        console.log('difVecs',diffVecs, 'disDiffs2',disDiffs2,'maxTolerance',maxTolerance)   
-        
-        
-        //排除掉偏差大的坏点
-        let panoPos1new = panoPos1.filter((p,i)=>{return disDiffs[i]<=maxTolerance})    
-        let panoPos2new = panoPos2.filter((p,i)=>{return disDiffs[i]<=maxTolerance})    
-          
-        //用剩下的点再算一次    
-        matrix = compute(panoPos1new,panoPos2new)
-        
-        
         
         convertInfo.convertMatrix = matrix
         convertInfo.convertMatrixInvert = matrix.clone().invert()