xzw 9 месяцев назад
Родитель
Сommit
bebeef147a

+ 6 - 1
src/custom/modules/mergeModel/MergeEditor.js

@@ -772,7 +772,12 @@ let MergeEditor = {
                 tag.titleLabel.updatePose()
             }
         })
-        
+        viewer.scene.overlays.forEach(e=>{
+            if(e.model == model){
+                MergeEditor.getBoundCenter(e);
+                e.dispatchEvent('transformChanged') 
+            }  
+        })
         
         
         //反向求transformMatrix  参考Alignment.js   移动漫游点 

+ 3 - 9
src/custom/objects/Monitor.js

@@ -144,23 +144,17 @@ export default class Monitor extends THREE.Object3D{
         }
         
         
-        {
-             
-            let getVecFromData = (vec)=>{//应该主要是3dtiles要转换  
-                return  Potree.math.convertVector.YupToZup(vec).applyMatrix4(model.posRot1MatrixInvert) 
-            }
-            
-             
+        { 
             this.posOri = new THREE.Vector3(parseFloat(data.data['posOri-x']), parseFloat(data.data['posOri-y']), parseFloat(data.data['posOri-z'])),
             this.posOffset = new THREE.Vector3(parseFloat(data.data['posOffset-x']), parseFloat(data.data['posOffset-y']), parseFloat(data.data['posOffset-z'])),
             
             // data.position && this.position.copy(data.position)
             this.position.copy(this.posOri).add(this.posOffset) 
-            this.position.copy(getVecFromData(this.position))
+            this.position.copy(Potree.Utils.tran4dkkVecInModel(this.position, model))
  
             // target的优先级大于rotation
             if (data.target) {
-                this.target = getVecFromData(data.data.target) 
+                this.target = Potree.Utils.tran4dkkVecInModel(data.data.target, model) 
                 this.lookAt(data.target)
             } else {
                 data.data.rotation && this.quaternion.setFromEuler(data.data.rotation)

+ 86 - 31
src/custom/objects/Overlay.js

@@ -37,7 +37,18 @@ export default class Overlay extends THREE.Object3D {
         this.setContent( data.media[0], data.url, data.isNew)
         //this.setScale(data.width, data.height)
         this.scale.set(data.width||1, data.height||1,  1) //需要把width转化一下吗,还是后端转化?
+        data.reverse && (this.scale.x *= -1)
         this.addEventListener('dispose',this.dispose.bind(this))
+        
+        
+        let updatePlayInSight = ()=>{ 
+            Common.intervalTool.isWaiting('updatePlayInSight', ()=>{   
+                 Overlay.updatePlayInSight()
+            },500)
+        }
+        this.addEventListener('isVisible',updatePlayInSight)
+        this.addEventListener('transformChanged',updatePlayInSight) 
+        
     } 
     
     
@@ -103,45 +114,89 @@ export default class Overlay extends THREE.Object3D {
     
     dispose(){
         //geo和mat已经在mergeEditor里删了,这要删一下video啥的吗?
+        let index = viewer.scene.overlays.indexOf(this)
+        if(index == -1)return 
+        viewer.scene.overlays.splice(index,1)
+        
         if(this.mediaType == 'video'){
             let media = this.plane.material.map.image
-            media?.pause()
+            media?.pause() 
             this.disposed = true
         }
     }
-    /* save(){ //不在这保存,因为当做模型保存的,只需要比模型多一个url、type的数据
-                也是加入到viewer.objs里
-         let info = {
-            "media": [
-                this.mediaType
-            ],
-            "reverse": false,
-            "limitToOnlyPano": false,
-            "url": "WqXhX412472.png",
-            "sid": "WqXhX412472",
-            "depth": 0,
-            "pos": [
-                0.8304,
-                0.8788,
-                1.2941
-            ],
-            "createTime": 1740641260916,
-            "width": 0.7926,
-            "frameType": "wall_1",
-            "qua": [
-                0,
-                1,
-                0,
-                0
-            ],
-            "poster": "WqXhX412472.png",
-            "floorIndex": 0,
-            "height": 0.6309
+    
+    
+    videoControl(state){
+        var video = this.plane.material.map.image
+        if(!video)return
+        
+        
+        this.shouldPlay = state
+        if (!state || state == 'stop') {
+            if (!video.paused){
+                video.pause()
+                console.log('videoControl paused ')
+            } 
+        }else if(state) {
+            if (video.paused){
+                 console.log('videoControl play ')
+                //video = this.loadVideo()
+                video.play()
+            }
         }
-        return info
+    }
+    
+    
+    
+    
+ 
+    static updatePlayInSight(){
+        const min = 0.15//最小可播放尺寸(屏幕宽高都是2)
+        let camera = viewer.mainViewport.camera
+        let camDir = viewer.mainViewport.view.direction 
+        let frustumMatrix = new THREE.Matrix4
+            frustumMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse) 
+        let frustum = new THREE.Frustum();
+            frustum.setFromProjectionMatrix(frustumMatrix) 
         
-    } */
+        let insight = (overlay)=>{  
+
+            if(overlay.plane.material.side!=2){ //side为0
+                let dir = overlay.plane.getWorldDirection(new THREE.Vector3) 
+                if(dir.dot(camDir)>0 ){
+                    console.log('dir.dot(camDir)',dir.dot(camDir))
+                    return false
+                }
+                //可能看到背面。若能看到正面,视线方向和plane朝向必定为钝角
+            }
+
+
+        
+            let bound = overlay.bound.clone()
+            let insight = frustum.intersectsBox(bound )  
+            if(!insight)return false
+            bound.applyMatrix4(frustumMatrix); //project on screen
+            let boundSize = bound.getSize(new THREE.Vector3)
+            if(boundSize.x < min && boundSize.y < min){
+                //console.log('too small', boundSize)
+                return false
+            }
+            return true
+        }
+        
+        
+        viewer.scene.overlays.forEach(overlay=>{
+            if(overlay.mediaType != 'video')return
+            let shouldPlay = overlay.realVisible() && insight(overlay)
+            overlay.videoControl(shouldPlay)  
+        }) 
+    }
 }
 
 
+
+
+
+
+
  

+ 3 - 1
src/custom/potree.shim.js

@@ -1038,7 +1038,9 @@ Utils.combineImgs = async (imgs, compressRatio, width, height)=>{//拼合图片
     
 }
 
-
+Utils.tran4dkkVecInModel = (vec, model)=>{//将四维看看里的坐标转换成在此平台模型上的坐标(主要是3dtiles需要平移) 见load4dkkpanos
+    return Potree.math.convertVector.YupToZup(vec).applyMatrix4(model.posRot1MatrixInvert)  //若要全局坐标,可以直接像pano那样转换,多乘个matrix
+}
 
 
 BinaryLoader.prototype.load = function(node, callback){//解析点云

+ 35 - 1
src/custom/utils/Common.js

@@ -7,7 +7,7 @@ import '../../../libs/other/UPNG.js'
  
 
 var Common = {
-     
+    autoPlayList:[],
     
     sortByScore: function(list, request, rank){
         var i = request ? Common.filterAll(list, request) : list
@@ -604,6 +604,40 @@ var Common = {
  
     },
     
+    mobileAutoPlay(media, playFun){//移动端。不这么写video不会播放 . (2022.11.29: 可为何加了Hot.updateHots之后又会自动播了?https有关?
+        
+        
+        if(this.autoPlayList.includes(media))return
+        this.autoPlayList.push(media)
+        viewer.addEventListener       
+        let events = ['global_touchstart','global_mousedown']    
+        
+        let fun = ()=>{
+            let index = this.autoPlayList.indexOf(media)
+            if(index>-1){
+                
+                console.log( 'try autoplay '+ media.src)
+                playFun()
+                this.autoPlayList.splice(index,1)
+                events.forEach((eventName)=>{ 
+                    viewer.removeEventListener(eventName,fun)
+                })
+            }
+        }
+    
+        events.forEach((eventName)=>{ 
+            viewer.addEventListener(eventName,fun)
+        })
+ 
+        
+    },
+    
+    
+    
+    
+    
+    
+    
     /* changeShaderToWebgl2(vs, fs, matType, otherReplaces=[]){//部分shader要根据webgl版本作更改
         if(!Potree.settings.isWebgl2)return {vs, fs}
         let turnTo300 = matType != 'ShaderMaterial' && (vs.includes('gl_FragDepthEXT') || fs.includes('gl_FragDepthEXT') ) 

+ 12 - 0
src/custom/viewer/ViewerNew.js

@@ -886,6 +886,16 @@ export class Viewer extends ViewerBase{
             
             
         } 
+        
+        
+        if(Potree.settings.editType == 'merge'){
+            let updatePlayInSight = ()=>{ 
+                Common.intervalTool.isWaiting('updatePlayInSight', ()=>{   
+                     Overlay.updatePlayInSight()
+                },500)
+            }
+            this.addEventListener('camera_changed', updatePlayInSight)  
+        }
          
         this.modules.SiteModel?.bus.addEventListener('FloorChange',(e)=>{
              if(Potree.settings.editType == 'pano'){
@@ -5619,6 +5629,7 @@ export class Viewer extends ViewerBase{
 
     modelLoaded(object, fileInfo_={}, done){//普通模型加载完以后
         object.isModel = true
+        
         let boundingBox = new THREE.Box3()
         if(fileInfo_.parentInfo){
             object.name = fileInfo_.name   
@@ -6016,6 +6027,7 @@ export class Viewer extends ViewerBase{
             
             let overlay = new Overlay(fileInfo)
             overlay.unableEdit = true
+            this.scene.overlays.push(overlay)
             loadDone(overlay)
             
         }else if(fileInfo.fileType == '3dgs'){

+ 1 - 1
src/viewer/ExtendScene.js

@@ -31,7 +31,7 @@ class ExtendScene extends Scene{
         
         
         this.monitors = []
-
+        this.overlays = []
 	}
 
 	estimateHeightAt (position) {