xzw %!s(int64=3) %!d(string=hai) anos
pai
achega
336f7de081
Modificáronse 3 ficheiros con 414 adicións e 176 borrados
  1. 32 12
      public/lib/potree/potree.js
  2. 1 1
      public/lib/potree/potree.js.map
  3. 381 163
      src/sdk/cover/index.js

+ 32 - 12
public/lib/potree/potree.js

@@ -63082,7 +63082,11 @@ void main() {
         let pointcloud = o.pointcloud || viewer.scene.pointclouds.find(e=>e.dataset_id == o.datasetId);
         let tranMatrix; 
         if(pointcloud){ 
-            tranMatrix = o.fromDataset ? pointcloud.transformMatrix : pointcloud.transformInvMatrix; 
+            if(Potree.settings.editType == 'merge'){
+                tranMatrix = o.fromDataset ? pointcloud.matrixWorld : new Matrix4().copy(pointcloud.matrixWorld).invert(); 
+            }else {
+                tranMatrix = o.fromDataset ? pointcloud.transformMatrix : pointcloud.transformInvMatrix; 
+            }
         }else { 
             if(Potree.settings.intersectOnObjs){
                 let object = viewer.objs.children.find(e=>e.dataset_id == o.datasetId);
@@ -63222,7 +63226,6 @@ void main() {
         //viewer.setPointBudget(pointDensity.pointBudget);
         viewer.loadSettingsFromURL(); 
         
-      
         
         if(!Potree.settings.isOfficial){ 
             viewer.loadGUI(() => {
@@ -63652,7 +63655,7 @@ void main() {
         Potree.settings.intersectOnObjs = true;
         Potree.settings.boundAddObjs = true;
         Potree.settings.unableNavigate = true;
-        
+       
         
         
         let viewer = new Potree.Viewer(dom );
@@ -63671,6 +63674,9 @@ void main() {
             
             viewer.transformationTool.setModeEnable('scale',false);
             viewer.ssaaRenderPass.sampleLevel = 1; //  sampleLevel为1 的话,ground就不会变黑
+            
+            viewer.inputHandler.fixSelection = true; //不通过点击屏幕而切换transfrom选中状态
+      
         }
         
         Potree.settings.sizeFitToLevel = true;//当type为衰减模式时自动根据level调节大小。每长一级,大小就除以2
@@ -63793,7 +63799,7 @@ void main() {
                     viewer.addEventListener('global_mousemove', moveModel); 
                     viewer.addEventListener('global_click', confirmPos, 3);
                 }else {
-                    MergeEditor.setModelBtmHeight(model, prop.btmHeight || 0); //默认离地高度为0
+                    MergeEditor.setModelBtmHeight(model, prop.bottom || 0); //默认离地高度为0
                     modelEditing = null;
                 }
                 {//transform
@@ -85521,7 +85527,7 @@ void main() {
             e.preventDefault();
             
             
-            let hoveredElements = [];
+            
             
             
             /* if(intersectPoint && intersectPoint.pointcloud){
@@ -85572,7 +85578,7 @@ void main() {
             if(!isTouch || e.touches.length == 1){ 
             
                 if(!this.drag || this.drag.notPressMouse ){
-                    hoveredElements = this.getHoveredElements(); 
+                    let hoveredElements = this.getHoveredElements(); 
                     if(hoveredElements.length > 0){
                         let names = hoveredElements.map(h => h.object.name).join(", ");
                         if (this.logMessages) console.log(`${this.constructor.name}: onMouseMove; hovered: '${names}'`);
@@ -85612,11 +85618,11 @@ void main() {
                             });
                         }
                     }
-
+                    this.hoveredElements = hoveredElements;
                 }
                 
                 
-                this.hoveredElements = hoveredElements;
+                
                 this.intersect = this.getWholeIntersect();
                 
                 
@@ -114970,6 +114976,10 @@ ENDSEC
             
             
             viewer.addEventListener('global_click',(e)=>{
+                if(viewer.inputHandler.selection[0]){//正在平移和旋转,不允许更换
+                    return
+                }
+                
                 if(e.intersect){
                     let object = e.intersect.object || e.intersect.pointcloud;
                     let objects = this.getAllObjects();
@@ -115017,7 +115027,7 @@ ENDSEC
             viewer.objs.remove(model);
         },
         
-        selectModel(model, state=true, by2d){
+        selectModel(model, state=true, ifFocus, by2d){
             if(!model) {
                 model = this.selected;
                 state = false;
@@ -115026,10 +115036,10 @@ ENDSEC
             if(state){
                 if(this.selected){
                     if(this.selected == model) return
-                    else this.selectModel(this.selected, false, by2d);
+                    else this.selectModel(this.selected, false, ifFocus, by2d);
                 }
                 this.selected = model;
-                MergeEditor.focusOnSelect(model);  
+                ifFocus && MergeEditor.focusOnSelect(model);     //通过在场景里点击模型的话,不focus
                 viewer.outlinePass.selectedObjects = [model];
                 
                 if(model.isPointcloud){
@@ -127079,10 +127089,20 @@ ENDSEC
         
         //调试时显示transformControl来调节object
         transformObject(object){
+            let seleted = viewer.inputHandler.selection[0];
+            if(!object){//取消 
+                seleted && viewer.inputHandler.toggleSelection(seleted);
+                return
+            }
+            
+            if(seleted && seleted != object){//要更换,先取消
+                return this.transformObject(null)
+            }
+            
             if(!object.boundingBox){
                 object.boundingBox = new Box3(); //任意大小 只是为了显示黄色外框
                 //??? computeBoundingBox
-            }
+            } 
             if(!viewer.inputHandler.selection.includes(object)){
                 viewer.inputHandler.toggleSelection(object);   
             }

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
public/lib/potree/potree.js.map


+ 381 - 163
src/sdk/cover/index.js

@@ -14,191 +14,409 @@ export const enter = (dom) => {
     let MergeEditor = viewer.modules.MergeEditor
     
   
-    
-    
-    let getPositionByScreen = (pos2d, mustModelId )=>{//通过屏幕坐标获取真实坐标 . mustModelId: 如果指定了模型,modelId必须为mustModelId才有效
-        let worldPos, localPos, modelId,  intersect
-        let Handler = viewer.inputHandler
-        
-        let reGet = ()=>{//不使用当前鼠标所在位置的intersect,单独算
-            pos2d.clientX = pos2d.x
-            pos2d.clientY = pos2d.y
-            pos2d.onlyGetIntersect = true
-            pos2d.whichPointcloud = true
-            if(mustModelId != void 0){//隐藏其他的模型
-                let models = MergeEditor.getAllObjects()
-                models.forEach(model=>{
-                    viewer.updateVisible(model, 'forPick', model.dataset_id == mustModelId)
-                }) 
+    let sdk = {
+        getPositionByScreen(pos2d, mustModelId ){//通过屏幕坐标获取真实坐标 . mustModelId: 如果指定了模型,modelId必须为mustModelId才有效
+            let worldPos, localPos, modelId,  intersect
+            let Handler = viewer.inputHandler
+            
+            let reGet = ()=>{//不使用当前鼠标所在位置的intersect,单独算
+                pos2d.clientX = pos2d.x
+                pos2d.clientY = pos2d.y
+                pos2d.onlyGetIntersect = true
+                pos2d.whichPointcloud = true
+                if(mustModelId != void 0){//隐藏其他的模型
+                    let models = MergeEditor.getAllObjects()
+                    models.forEach(model=>{
+                        viewer.updateVisible(model, 'forPick', model.dataset_id == mustModelId)
+                    }) 
+                }
+                intersect = Handler.onMouseMove(pos2d)
+                if(mustModelId != void 0){//恢复
+                    let models = MergeEditor.getAllObjects()
+                    models.forEach(model=>{
+                        viewer.updateVisible(model, 'forPick', true)
+                    }) 
+                }
             }
-            intersect = Handler.onMouseMove(pos2d)
-            if(mustModelId != void 0){//恢复
-                let models = MergeEditor.getAllObjects()
-                models.forEach(model=>{
-                    viewer.updateVisible(model, 'forPick', true)
-                }) 
+            if (pos2d && pos2d.inDrag) {  
+                reGet() 
+            } else {
+                intersect = Handler.intersect
+                if(intersect){
+                    modelId = intersect.pointcloud ? intersect.pointcloud.dataset_id : intersect.object.dataset_id
+                    if(mustModelId != void 0 && modelId != mustModelId){
+                        reGet()
+                    } 
+                }
             }
-        }
-        if (pos2d && pos2d.inDrag) {  
-            reGet() 
-        } else {
-            intersect = Handler.intersect
-            if(intersect){
+
+            if (intersect && intersect.location) {
                 modelId = intersect.pointcloud ? intersect.pointcloud.dataset_id : intersect.object.dataset_id
                 if(mustModelId != void 0 && modelId != mustModelId){
-                    reGet()
+                    return null
                 } 
-            }
-        }
-
-        if (intersect && intersect.location) {
-            modelId = intersect.pointcloud ? intersect.pointcloud.dataset_id : intersect.object.dataset_id
-            if(mustModelId != void 0 && modelId != mustModelId){
-                return null
-            } 
-            worldPos = intersect.location.clone()
-            localPos = Potree.Utils.datasetPosTransform({ toDataset: true, datasetId:modelId, position:worldPos })
-        } else return null
+                worldPos = intersect.location.clone()
+                localPos = Potree.Utils.datasetPosTransform({ toDataset: true, datasetId:modelId, position:worldPos })
+            } else return null
+            
+            return { worldPos, modelId, localPos }
+        },
         
-        return { worldPos, modelId, localPos }
-    }
-    
-    
-    
-    
-    
-    
-    let getScreenByPosition = (pos3d, modelId)=>{//通过模型局部坐标获取屏幕坐标 
-        let isLocal = modelId != void 0 
-        pos3d = new THREE.Vector3().copy(pos3d)
-        let worldPos = isLocal ? Utils.datasetPosTransform({ fromDataset: true, dataset_id: modelId, position:pos3d}) : pos3d
-       
-        var viewport = viewer.mainViewport
-        var camera = viewport.camera
-        var dom = viewer.renderArea
-        //console.log('getScreenByPoint ' + pos3d.toArray())
-        return Potree.Utils.getPos2d(worldPos, camera, dom, viewport)
-    }
-    
-    
-    
-    let addModel = (props)=> { 
-        let bus = mitt()  
-        console.log('addModel',props)
-        /* type = 'laser' url就是场景码
-        props = { 
-          select: boolean,
-          scale: number,
-          opacity: number,
-          bottom: number,
-          position: { x, y, z},
-          rotation: {x, y, z}
-        }
-        addModel({ url, type, props }) */
         
-        let model
-        let done = (model_)=>{
-            model = model_
-            props.opacity != void 0 && result.changeOpacity(props.opacity) 
-            
-            model.addEventListener('changeSelect',(e)=>{
-                bus.emit('changeSelect',e.selected)
-            }) 
-            model.addEventListener('transformChanged',(e)=>{
-                bus.emit('transformChanged', {
-                    position : model.position.clone(),
-                    scale: model.scale.x,
-                    rotation: model.rotation.clone(),
-                    bottom: model.btmHeight
-                })
+        
+        
+        
+        
+        getScreenByPosition(pos3d, modelId){//通过模型局部坐标获取屏幕坐标 
+            let isLocal = modelId != void 0 
+            pos3d = new THREE.Vector3().copy(pos3d)
+            let worldPos = isLocal ? Potree.Utils.datasetPosTransform({ fromDataset: true, datasetId: modelId, position:pos3d}) : pos3d
+            if(!worldPos)return
+            var viewport = viewer.mainViewport
+            var camera = viewport.camera
+            var dom = viewer.renderArea
+            //console.log('getScreenByPoint ' + pos3d.toArray())
+            return Potree.Utils.getPos2d(worldPos, camera, dom, viewport)
+        },
+        
+        screenshot: (width, height) => {
+            //截图 
+            var promise = viewer.startScreenshot({ type: 'default' }, width, height)
+            promise.done(() => {
+ 
             })
+            return promise
+        },
+        getPose() {//获取当前点位和朝向
+            const camera = viewer.scene.getActiveCamera()
+            const target = viewer.scene.view.getPivot()
+            const position = viewer.scene.view.position
+            return { position, target }
+        },
+        comeTo(o = {}) {
+            //飞到某个点   
+            let deferred = $.Deferred()
+             
+            viewer.scene.view.setView($.extend({},o, {
+                duration: o.dur,
+                callback:()=>{
+                    o.callback && o.callback()
+                    deferred.resolve(true)
+                }
+            }))
+            return deferred.promise()
+        },
+        /* getPose(o={}) {
+            //获取相对于第一个数据集的初始画面。(当数据集校准后,如果初始画面设置在被修改的数据集上,且该数据集非初始数据集的话,还是会偏移的)
+            var deferred = o.deferred || $.Deferred();
+            console.log('getPose')
+            if(viewer.mainViewport.view.isFlying()){ 
+                let f = ()=>{
+                    this.getPose(o)
+                    viewer.mainViewport.view.removeEventListener('flyingDone', f)
+                } 
+                viewer.mainViewport.view.addEventListener('flyingDone', f) //once 
+                o.deferred = deferred
+                return deferred.promise()
+            }
             
-            /* model.addEventListener('positionChanged',(e)=>{
-                bus.emit('positionChanged', e.position) //点云不是直接使用
-            })
-            model.addEventListener('scaleChanged',(e)=>{
-                bus.emit('scaleChanged', model.scale.x)
-            })
-            model.addEventListener('rotationChanged',(e)=>{
-                bus.emit('rotationChanged', model.rotation)
-            })
-            model.addEventListener('bottomChanged',(e)=>{
-                bus.emit('bottomChanged', model.btmHeight)
-            }) */
-            bus.emit('loadDone')
-            console.log('loadDone' )
-        }
-        let progressFun = (progress)=>{
-            bus.emit('loadProgress',progress)
-        }
-        if(props.type == "glb"){////////////////////////////test
-            props.url = '/lib/potree/resources/models/glb/coffeemat.glb'  
-        }
-        Potree.addModel(props,  done , progressFun)
+            var camera = viewer.scene.getActiveCamera()
+            var rotation = camera.rotation
+            var pos_In_dataset = Potree.Utils.datasetPosTransform({ toDataset: true, position: camera.position.clone(), datasetId: Potree.settings.originDatasetId })
+            var rot_In_dataset = Potree.Utils.datasetRotTransform({ toDataset: true, rotation, getRotation: true, datasetId: Potree.settings.originDatasetId }) //拿第一个数据集
+
+            var view = viewer.scene.view.clone()
+            view.rotation = rot_In_dataset //获取yaw pitch
+
+            var pose = {
+                //displayMode: Potree.settings.displayMode,
+                position: pos_In_dataset,
+                yaw: view.yaw,
+                pitch: view.pitch,
+                displayMode : Potree.settings.displayMode,
+                panoSid: viewer.images360.currentPano.sid
+            }
+            //return pose
+            
+            setTimeout(()=>{
+                deferred.resolve(pose)
+                console.log('getPose resolve',pose)
+            },1)
+            
+            
+            return deferred.promise()
+            
+            
+        },
         
-        let result = {  
-            bus,
-            changeShow(show){ 
-                if(model){
-                    viewer.updateVisible(model, 'changeShow', show)
+
+        setPose(o = {}, duration=0) {
+            //设置相机位置和朝向 
+            var deferred = o.deferred || $.Deferred();
+            console.warn('setPose 初始画面', o)
+            var quaternion 
+            let view = viewer.scene.view.clone()
+              
+            if(viewer.mainViewport.view.isFlying()){ 
+                let f = ()=>{
+                    this.setPose(o, duration)
+                    viewer.mainViewport.view.removeEventListener('flyingDone', f)
                 } 
-            },
-            changeSelect(state){
-                if(model){
-                    MergeEditor.selectModel(model, state, true)
+                viewer.mainViewport.view.addEventListener('flyingDone', f) //once 
+                o.deferred = deferred
+                return deferred.promise()
+            }
+            
+            var getQuaternion = ()=>{  
+                view.pitch = o.pitch
+                view.yaw = o.yaw
+ 
+                quaternion = Potree.Utils.datasetRotTransform({ fromDataset: true, rotation: view.rotation, getQuaternion: true, datasetId: Potree.settings.originDatasetId }) //拿第一个数据集
+                   
+            }
+            
+             
+            
+            viewer.images360.cancelFlyToPano()//防止旧的在之后继续执行
+            let pano 
+            if(o.panoSid != void 0){//好像都不存这个
+                pano = viewer.images360.panos.find(e=>e.sid == o.panoSid)
+                if(pano == void 0)return deferred.reject('没有找到该panoSid').promise()
+                getQuaternion() 
+                viewer.images360.flyToPano({pano, duration, quaternion},()=>{
+                    deferred.resolve()
+                })
+            }else{
+                if(Potree.settings.displayMode == 'showPanos'){
+                    return   deferred.reject('全景模式下不允许设置位置').promise()
                 }
-            },
-            changeScale(s){
-                if(model){
-                    model.scale.set(s,s,s)
-                    model.dispatchEvent("scale_changed")
+                
+                
+                let position = Potree.Utils.datasetPosTransform({ fromDataset: true, position: o.position, datasetId: Potree.settings.originDatasetId })
+                //view.position.copy(position)
+                getQuaternion()   
+                
+                pano = viewer.images360.panos.find(e=>Potree.math.closeTo(e.position, position))
+                
+                if(pano){//如果原来在某pano上最好也使currentPano为此pano,否则isAtPano会返回false
+                    viewer.images360.flyToPano({pano, duration, quaternion},()=>{
+                        deferred.resolve()
+                    })
+                }else{
+                    
+                    viewer.scene.view.setView({position,quaternion,duration, callback:()=>{ 
+                        //setTimeout(()=>{
+                            deferred.resolve()
+                            console.log('setPose resolve')
+                        //},1) 
+                    } })  
+                    viewer.mapViewer.moveTo(position, null, duration)  //初始位置在地图居中
+                    
                 }
-            },
-            changeOpacity(opacity){
-                if(model){
-                    if(model.isPointcloud){
-                        model.material.opacity = opacity
-                    }else{
-                        model.traverse(e=>e.material && (e.material.opacity = opacity))
+                
+                
+                  
+            }
+              
+            
+            
+            
+            return deferred.promise()
+        },
+        */
+     
+        
+        enterSceneGuide(data){//导览
+        
+            console.log(data)
+        
+            /* type SceneGuidePath = {
+              position: {x,y,z}
+              target: {x,y,z}
+              time: number
+              speed: number
+            }
+            sceneGuide = enterSceneGuide(sceneGuidePaths)
+
+            type SceneGuide = {
+
+              bus: Emitter<{ changePoint: number; playComplete: void }>
+              addPoint: (index: number, path: SceneGuidePath) => void
+              deletePoint: (index: number) => void
+              play: () => void
+              pause: () => void
+              clear: () => void
+            }
+            } */
+            
+            
+            let editor = viewer.modules.CamAniEditor
+            let posTran = function (position, target) {
+                position = Potree.Utils.datasetPosTransform({ fromDataset: true, position: position, datasetId: Potree.settings.originDatasetId })
+                target = Potree.Utils.datasetPosTransform({ fromDataset: true, position: target, datasetId: Potree.settings.originDatasetId })
+                return { position, target }
+            }
+            if (data) {
+                data.points.forEach(e => {
+                    let { position, target } = posTran(e.position, e.target)
+                    e.position = position
+                    e.target = target
+                })
+            }
+            let animation = editor.createAnimation(data)
+            //注:最多只存在一条导览
+
+            let bus = mitt()
+
+            //播放完成
+            animation.addEventListener('playDone', () => {
+                bus.emit('playComplete')
+            })
+            //切换点
+            animation.addEventListener('updateCurrentIndex', e => {
+                bus.emit('changePoint', e.currentIndex + 1)
+            })
+
+            return {
+                bus,
+                addPoint(index, position_, target_) {
+                    let { position, target } = posTran(position_, target_)
+                    animation.createControlPoint(index, { position, target })
+                    animation.changeCallback()
+                },
+                deletePoint(index) {
+                    animation.removeControlPoint(index)
+                    animation.changeCallback()
+                },
+                play() {
+                    /* var modeOld = Potree.settings.displayMode;
+                    Potree.settings.displayMode = 'showPointCloud' */
+                    animation.play()
+                },
+                pause() {
+                    animation.pause()
+                },
+                setDuration(dur) {
+                    animation.setDuration(dur)
+                },
+                clear() {
+                    //删除
+                    editor.removeAnimation(animation)
+                },
+            } 
+            
+        },
+        
+        
+        addModel(props){ 
+            let bus = mitt()  
+            console.log('addModel',props)
+            
+            
+            let model
+            let done = (model_)=>{
+                model = model_
+                props.opacity != void 0 && result.changeOpacity(props.opacity) 
+                
+                model.addEventListener('changeSelect',(e)=>{
+                    bus.emit('changeSelect',e.selected)
+                }) 
+                model.addEventListener('transformChanged',(e)=>{
+                    bus.emit('transformChanged', {
+                        position : model.position.clone(),
+                        scale: model.scale.x,
+                        rotation: model.rotation.clone(),
+                        bottom: model.btmHeight
+                    })
+                })
+                
+                
+                bus.emit('loadDone')
+                console.log('loadDone' )
+            }
+            let progressFun = (progress)=>{
+                bus.emit('loadProgress',progress)
+            }
+            if(props.type == "glb"){////////////////////////////test
+                props.url = '/lib/potree/resources/models/glb/coffeemat.glb'  
+            }
+            Potree.addModel(props,  done , progressFun)
+            
+            let result = {  
+                bus,
+                changeShow(show){ 
+                    if(model){
+                        viewer.updateVisible(model, 'changeShow', show)
+                    } 
+                },
+                changeSelect(state){
+                    if(model){
+                        MergeEditor.selectModel(model, state, false, true)
+                        if(state && viewer.inputHandler.selection[0]){
+                            viewer.transformObject(model); //交换
+                        }
                     }
-                }
+                },
+                changeScale(s){
+                    if(model){
+                        model.scale.set(s,s,s)
+                        model.dispatchEvent("scale_changed")
+                    }
+                },
+                changeOpacity(opacity){
+                    if(model){
+                        if(model.isPointcloud){
+                            model.material.opacity = opacity
+                        }else{
+                            model.traverse(e=>e.material && (e.material.opacity = opacity))
+                        }
+                    }
+                     
+                },
+                changeBottom(z){
+                    model && MergeEditor.setModelBtmHeight(model,z)
+                },
+                enterRotateMode(){
+                    if(model){
+                        viewer.transformObject(model);
+                        viewer.transformationTool.setModeEnable('rotation',true)
+                        viewer.transformationTool.setModeEnable('translation',false)
+                    }
+                }, 
+                enterMoveMode(){
+                    if(model){
+                        viewer.transformObject(model);
+                        viewer.transformationTool.setModeEnable('rotation',false)
+                        viewer.transformationTool.setModeEnable('translation',true)
+                    }
+                },
+                leaveTransform(){ 
+                    viewer.transformObject(null); 
+                },
                  
-            },
-            changeBottom(z){
-                model && MergeEditor.setModelBtmHeight(model,z)
-            },
-            enterRotateMode(){
-                if(model){
-                    viewer.transformObject(model);
-                    viewer.transformationTool.setModeEnable('rotation',true)
-                    viewer.transformationTool.setModeEnable('translation',false)
-                }
-            }, 
-            enterMoveMode(){
-                if(model){
-                    viewer.transformObject(model);
-                    viewer.transformationTool.setModeEnable('rotation',false)
-                    viewer.transformationTool.setModeEnable('translation',true)
+                destroy(){
+                    MergeEditor.removeModel(model) 
                 }
-            },
-            destroy(){
-                MergeEditor.removeModel(model) 
-            }
-            /* leaveRotateMode(){
-                
-            } */
+                 
+            } 
+            
+            return result
         } 
+            
+    
         
-        return result
-    } 
+    }
+   
+ 
+      
+
+    
+    
      
     
       
      
-    return {
-        addModel, getPositionByScreen, 
-        getScreenByPosition
-    }
+    return sdk 
 }
 
 export default enter