|
@@ -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()
|