xzw 2 years ago
parent
commit
bd96766be5
4 changed files with 116 additions and 36 deletions
  1. 6 4
      src/pages/SViewer.vue
  2. 2 1
      src/pages/Viewer.vue
  3. 95 20
      src/utils/ConvertViews.js
  4. 13 11
      src/utils/sync.js

+ 6 - 4
src/pages/SViewer.vue

@@ -74,7 +74,7 @@ const sourceURL = computed(() => {
         return `smart-kankan.html?m=${source.value.num}`//`smart-laser.html?m=${source.value.num}&dev`
     }*/ 
     
-    if(sourceFrame.value && (bimChecked.value || sourceFrame.value.contentWindow.app || sourceFrame.value.contentWindow.loaded)){
+    if(lastFakeApp/*sourceFrame.value && (bimChecked.value || sourceFrame.value.contentWindow.app || sourceFrame.value.contentWindow.loaded)*/){
         sync.views.addViewInfo(sourceFrame.value.contentWindow)
     }
     if(bimChecked.value){
@@ -119,12 +119,14 @@ const onLoadSource = () => {
     }else{ 
         win.sceneType = 'laser' 
         win.loaded.then(sdk => { 
-            win.viewer.images360.cancelFlyToPano() 
+            sync.views.laserCancelFly(app)//win.viewer.images360.cancelFlyToPano() 
             loaded();
             
             setTimeout(()=>{//laser的代码中莫名会请求showPointCloud,所以尽量晚一点覆盖它
-                win.Potree.settings.displayMode = mode.value == 0 ? "showPanos" : "showPointCloud"
-            },1000)
+                if(win.Potree){
+                    win.Potree.settings.displayMode = mode.value == 0 ? "showPanos" : "showPointCloud"
+                }
+            }, sync.views.settings.checkModeDelay)
             
          }) 
     }

+ 2 - 1
src/pages/Viewer.vue

@@ -72,7 +72,7 @@ import browser from '@/utils/browser'
 import Toast from '@/components/dialog/Toast'
 import AppHeader from '@/components/header'
 import Calendar from '@/components/calendar'
-import sync, { beforeChangeURL, loadSourceScene, loadTargetScene, setPanoWithBim, flyToP1P2} from '@/utils/sync'
+import sync, { laserChangeMode, beforeChangeURL, loadSourceScene, loadTargetScene, setPanoWithBim, flyToP1P2} from '@/utils/sync'
 
 // 是否BIM模式
 const showBim = ref(browser.urlHasValue('bim'))
@@ -223,6 +223,7 @@ const onModeChange = targetMode => {
     if (sync.sourceInst) {
         sync.sourceInst.loaded.then(sdk => sdk.scene.changeMode(targetMode))
         mode.value = targetMode
+        laserChangeMode(mode.value)
     }
 }
 const onPickDate = name => {

+ 95 - 20
src/utils/ConvertViews.js

@@ -8,8 +8,8 @@ export default class ConvertViews extends THREE.EventDispatcher{
     constructor( ) {
         super()
         this.settings = {
-            durations : {flyToPano:1000, dolly:60, bimAniOrigin:1000}
-            
+            durations : {flyToPano:1000, dolly:20, bimAniOrigin:1000},
+            checkModeDelay : 1000,
             
             
         }
@@ -257,28 +257,33 @@ export default class ConvertViews extends THREE.EventDispatcher{
             targetApp.CLOUD.GlobalData.WalkRotationSpeed = -0.2 //反向一下
         }
         
-        //this.syncView(sourceApp, targetApp)
-        if(targetApp.sceneType == 'bim' /* || this.ifCanChangePos(targetApp) */){
+        
+        if(targetApp.sceneType == 'bim'  ){
             
             this.syncPosRot(sourceFakeApp.viewInfo, targetApp, convertInfo) 
             
         }else if(targetApp.sceneType == 'laser' ){
-            setTimeout(()=>{//一开始虽然是点云模式,但过后又变成showPano所以是没加载好
-                if(this.ifCanChangePos(targetApp) ){
+            selectBestPose() //刚好在点位上的话这句设置完就正确了
+            setTimeout(()=>{ //刚开始总是showPointCloud  (且稍后会自动飞到某点)所以需要延时 
+                this.laserCancelFly(targetApp)
+                if(this.ifCanChangePos(targetApp)){//点云模式的话
                     this.syncPosRot(sourceFakeApp.viewInfo, targetApp, convertInfo) 
                 }else{
-                    selectBestPose()
+                     
                 } 
-            },1000) 
+            },this.settings.checkModeDelay+10) 
         }else{//bim -> 固定点位
             selectBestPose()
              
-        }
-        
+        }  
+       
     }
     
     
-     
+    laserCancelFly(app){
+        app.viewer.images360.cancelFlyToPano() 
+        app.viewer.mainViewport.view.cancelFlying()
+    }
      
     bindWithBim(sourceApp, targetApp, panoData ) {
         //if (!this.player1.model.panos.list.length || !this.player2.model.panos.list.length) return
@@ -398,20 +403,20 @@ export default class ConvertViews extends THREE.EventDispatcher{
             
             
             
-            //补充control
+            //将第一人称control补充完:
              
-          
-            let baseSpeed = THREE.MathUtils.clamp( modelSize.length() / 10, 1, 10)
-            
+            //scroll
+            let baseSpeed = THREE.MathUtils.clamp( Math.sqrt(modelSize.length()) / 5, 0.3, 8) //在modelBound中时的速度
+            //console.log('baseSpeed',baseSpeed)
             let dom = bimViewer.getDomElement();
             dom.addEventListener('mousewheel', e => {   //原版滚轮不能缩放,自己加一个
                 if(e.wheelDelta == 0)return //mac
                 let info = bimViewer.getCameraStatus()  
                 let dis = modelBound.distanceToPoint(info.position)
-                let speed = baseSpeed + dis / 8
+                let speed = baseSpeed + dis / 6
                 //console.log('speed', speed)
                
-                this.bimFlyTo({forwardDis: e.wheelDelta > 0 ? speed : -speed,  duration:this.settings.durations.dolly, radius:dis})
+                this.bimFlyTo({forwardDis: e.wheelDelta > 0 ? speed : -speed,  duration:this.settings.durations.dolly , minRadius : baseSpeed})
             }) 
             
             //右键pan
@@ -792,13 +797,13 @@ export default class ConvertViews extends THREE.EventDispatcher{
         let position = data.position
         if(!position){
             position = new THREE.Vector3().addVectors(info.position, dir.clone().multiplyScalar(data.forwardDis))//forwardDis:前进距离
-            radius = Math.max(radius-data.forwardDis, 0.7)
+            radius = Math.max(radius-data.forwardDis, data.minRadius || 0.7)
         }
         if(data.duration != void 0){
             bimViewer.getViewer().animator.setDuration(data.duration)//滚轮缩放时长,原先:1000
         }
         
-        
+        //console.log('radius',radius)
         
         let target = new THREE.Vector3().addVectors(position, dir.clone().multiplyScalar(radius))
         let msg = {//不能修改
@@ -814,7 +819,7 @@ export default class ConvertViews extends THREE.EventDispatcher{
     
     flyToPano(app, panoId, o={}){
         if(app.sceneType == 'laser'){ 
-            app.viewer.images360.cancelFlyToPano() 
+            this.laserCancelFly(app)//app.viewer.images360.cancelFlyToPano() 
             app.viewer.images360.flyToPano(Object.assign({},{ 
                 pano: app.viewer.images360.getPano(panoId)
             },o)) 
@@ -951,3 +956,73 @@ note:
 (所以只需要实时检测相机是否改变, hasChanged后发送)
 
  */
+ 
+ /* 
+ 其他代码:
+ 
+    initTagAdd(){ 
+        let markerConfig = new Bimface.Plugins.Marker3D.Marker3DContainerConfig();
+        markerConfig.viewer = this.viewer;
+        let tags = new Bimface.Plugins.Marker3D.Marker3DContainer(markerConfig);
+        console.log('tags',tags)
+        
+        this.addEventListener('addTag',(e)=>{
+            if(this.targetPano[e.index].tag){
+                tags.removeItemById(this.targetPano[e.index].tag.id)
+            }
+            let position = new THREE.Vector3
+            if(e.position){
+                position.copy(e.position)
+            }else{
+                let currStatus = this.viewer.getCameraStatus()
+                position.copy(currStatus.position)
+            } 
+            
+            
+            
+            let marker3dConfig = new Bimface.Plugins.Marker3D.Marker3DConfig();
+             
+            marker3dConfig.src = 'images/hotpoint'+ e.index +'.png'//"http://static.bimface.com/resources/3DMarker/warner/warner_red.png";
+            
+            marker3dConfig.worldPosition = new THREE.Vector3().copy(position) 
+            marker3dConfig.worldPosition.z -= belowHeight
+            marker3dConfig.tooltip = '此为漫游点'+e.index //三维标签的提示
+            let tag = new Bimface.Plugins.Marker3D.Marker3D(marker3dConfig);
+            tags.addItem(tag);
+            this.viewer.clearSelectedComponents();
+            this.viewer.render();
+            this.targetPano[e.index].tag = tag
+            this.updatePanoMatch(position, e.index )
+        })
+    }
+    
+    
+    
+    this.viewer.addEventListener( Bimface.Viewer.Viewer3DEvent.MouseClicked, (objectData)=>{
+            
+        let position = objectData.worldPosition.clone().add({x:0,y:0,z:height});
+    })
+    
+    
+    
+    
+    addMesh(cameraData){
+         
+        var mesh = new Bimface.Plugins.Geometry.Plane({
+            type:'rectangle', points:[{x:-0.1,y:-0.1,z:0},{x:0.1,y:0.1,z:0}]
+        });
+            
+        var extObjMng = new Bimface.Plugins.ExternalObject.ExternalObjectManager(viewer2);            
+        extObjMng.loadObject({ name: 'plane', object: mesh});//作为外部构件添加到场景中
+
+        //mesh.children[0].position.copy(cameraData.position).setZ(0.5)
+        mesh.children[0].up.set(0,0,1) 
+        mesh.children[0].rotation.set(0,0,Math.PI/2)
+        
+        this.plane = mesh
+        window.extObjMng = extObjMng
+         
+        
+    } 
+ 
+ */

+ 13 - 11
src/utils/sync.js

@@ -8,11 +8,9 @@ let sourceApp = null,
   
 const isEdit = browser.urlHasValue('adjust')
 
-let panoData //= {p1:{id:0},p2:{id:1}}//默认
-let targetPano /* = isEdit ? null : [//targetPano
-                        {position: new THREE.Vector3( -5.313605730801787,  -4.889868407960505,  1.237447893355817),},
-                        {position: new THREE.Vector3( -5.337403524084278,  -2.5012228235167737, 1.2808838933558175),} 
-                    ]    */
+let panoData 
+let targetPano
+let laserMode  
 export function setPanoWithBim(data){
     if(!isEdit){
         panoData = data 
@@ -23,8 +21,7 @@ export function flyToP1P2(data){
     views.flyToPano(sourceApp, data.id,  {duration : views.settings.durations.flyToPano}) 
     
     //right
-    views.bimFlyTo({position:data.position,  duration : views.settings.durations.flyToPano})
-    
+    views.bimFlyTo({position:data.position,  duration : views.settings.durations.flyToPano}) 
 }
  
 
@@ -166,8 +163,8 @@ function laserLoaded(app,mode){
     if(!app.viewer){
         return console.error('!app.viewer', app.viewer)
     }
-    
-    app.viewer.images360.cancelFlyToPano() 
+    laserMode = mode
+    views.laserCancelFly(app)//app.viewer.images360.cancelFlyToPano() 
     app.viewer.mainViewport.view.minPitch += 0.01 //防止bim垂直视角上的闪烁(似乎是因 up 要乘以某矩阵导致微小偏差所致)
     app.viewer.mainViewport.view.minPitch -= 0.01
     app.viewer.images360.panos.forEach(pano=>{
@@ -179,11 +176,16 @@ function laserLoaded(app,mode){
     app.viewer.setPointLevels()
     app.Potree.settings.rotAroundPoint = false   //去除原因:比较好同步,尤其当左边在当前点位,右边同步后却离开当前点位的话拖拽就会绕点旋转了
     setTimeout(()=>{//laser的代码中莫名会请求showPointCloud,所以尽量晚一点覆盖它
-        app.Potree.settings.displayMode = mode == 0 ? "showPanos" : "showPointCloud"
-    },1000)
+        if(app.Potree){
+            app.Potree.settings.displayMode = laserMode == 0 ? "showPanos" : "showPointCloud"
+        }
+    }, views.settings.checkModeDelay)
 
 }
 
+export function laserChangeMode(mode){
+    laserMode = mode
+}
 
 window.addEventListener('mouseup',(e)=>{
     //iframe的window的mouseup 在拖拽出窗口外居然不执行,只好用全局的通知它们