xzw 3 years ago
parent
commit
ace7481b45
3 changed files with 110 additions and 31 deletions
  1. 74 26
      public/lib/potree/potree.js
  2. 1 1
      public/lib/potree/potree.js.map
  3. 35 4
      src/sdk/cover/index.js

+ 74 - 26
public/lib/potree/potree.js

@@ -599,12 +599,9 @@
             siteModeSideVisi:14,//只有侧面可见
         },
         
-        /* renderOrders:{ //会影响到绘制、pick时的顺序。
-            measureLine: 1,
-            measureLabel: 2,
-            model: 
-            ground:  
-        }, */
+        renderOrders:{ //会影响到绘制、pick时的顺序。
+            model:10
+        }, 
         siteModel:{
             names:{
                 'building': '建筑',
@@ -56902,6 +56899,17 @@ void main() {
             return this.visible_ 
         }
         
+        realVisible(){
+            let parent = this;
+            while(parent){
+                if(parent.visible === false){
+                    return false 
+                }
+                parent = parent.parent;
+            }
+            return true
+        }
+        
         update(e){
             if(!e){
                 (this.viewports || viewer.viewports).forEach(view=>{
@@ -56909,7 +56917,7 @@ void main() {
                 });
                 return;
             }
-            if(!this.visible || !this.root)return
+            if(!this.root || ! this.realVisible() /* this.visible */ )return
             if(this.viewports && !this.viewports.includes(e.viewport) )return
             if(e.viewport.name == 'magnifier')return
             
@@ -56955,7 +56963,7 @@ void main() {
             if(!e)e = {viewport:viewer.mainViewport};//随便写一个viewport
             if(e.viewport.name == 'magnifier')return
             if(this.viewports && !this.viewports.includes(e.viewport) )return
-            if(!this.visible || !this.root)return
+            if( !this.root || !this.realVisible()  )return
             
             var matrix = this.matrixMap.get(e.viewport);
               
@@ -63864,6 +63872,13 @@ void main() {
                     MergeEditor.setModelBtmHeight(model, prop.bottom || 0); //默认离地高度为0
                     modelEditing = null;
                 }
+                
+                
+                if(model.isPointcloud){
+                    model.renderOrder = Potree.config.renderOrders.model;  //same as glb
+                }
+                
+                
                 {//transform
                     let updateBound = ()=>{ 
                         model.updateMatrixWorld();
@@ -85584,7 +85599,8 @@ void main() {
               
             //console.log(viewport.name , intersectPoint &&  intersectPoint.location )
             let intersect;
-            let intersectOnModel;
+            let intersectOnModel, allElements;
+           
             
             if(Potree.settings.intersectOnObjs && !dontIntersect){
                 if(prop.point){
@@ -85594,17 +85610,17 @@ void main() {
                 }  
                 
                 
-                let intesects = this.getHoveredElements(viewer.objs.children, true, raycaster);
+                allElements = this.getHoveredElements(viewer.objs.children, true, raycaster);
                 
                 
-                if(intesects[0]){
+                if(allElements[0]){
                     intersectOnModel = {//模拟点云的intersectPoint的结构写法
-                        hoveredElement : intesects[0] ,
-                        location: intesects[0].point,
-                        //point: {normal: intesects[0].face.normal },
-                        normal: intesects[0].face.normal,
-                        distance: intesects[0].distance,
-                        object: intesects[0].object
+                        hoveredElement : allElements[0] ,
+                        location: allElements[0].point,
+                        //point: {normal: allElements[0].face.normal },
+                        normal: allElements[0].face.normal,
+                        distance: allElements[0].distance,
+                        object: allElements[0].object
                     }; 
                 }
             }
@@ -85618,7 +85634,7 @@ void main() {
             }else {
                 intersect = intersectOnModel || intersectPoint;
             }                
-             
+              
             
             if(viewport.camera.type == 'OrthographicCamera'/*  == 'mapViewport' */){ 
                 let pos3d = new Vector3(this.pointer.x,this.pointer.y,-1).unproject(viewport.camera); //z:-1朝外   
@@ -85628,6 +85644,14 @@ void main() {
                 }   
                 intersect.orthoIntersect = pos3d.clone(); 
             } 
+             
+            //记录全部hover到的:
+            if(intersect){
+                intersect.allElements = allElements;
+                intersect.pointclouds = intersectPoint ? intersectPoint.pointclouds : [];
+            }
+            
+            
             if(onlyGetIntersect){ 
                 return intersect
             }
@@ -117422,17 +117446,20 @@ ENDSEC
                 //再加两条线否则在正侧边看不到
                 let line1 = LineDraw.createLine([new Vector3(-10000, 0, 0),new Vector3(10000, 0, 0) ], {color:'#666', dontAlwaysSeen:true});
                 let line2 = LineDraw.createLine([new Vector3(0, -10000, 0),new Vector3(0, 10000, 0) ], {mat:line1.material});
-                ground.renderOrder = line1.renderOrder + 1;  //要比模型低,否则模型透明时效果不对
+                ground.renderOrder = Potree.config.renderOrders.model + 1;//line1.renderOrder + 1  //要比模型低,否则模型透明时效果不对
                 ground.add(line1);
                 ground.add(line2);
                  
                 ground.material.polygonOffset = true; //多边形偏移(视觉上没有移动模型位置),防止闪烁
                 ground.material.polygonOffsetFactor = 100; //多边形偏移因子
-    			ground.material.polygonOffsetUnits = 10; //多边形偏移单位   
+    			ground.material.polygonOffsetUnits = 10; //多边形偏移单位  
+                ground.material.depthWrite = false;            
                 //ground.material.depthTest = false
                 line1.material.polygonOffset = true;
                 line1.material.polygonOffsetFactor = 130;  
     			line1.material.polygonOffsetUnits = 10;  
+                line1.material.depthWrite = false;   
+                //见笔记:透明物体的材质设置
             }
             
             
@@ -117510,7 +117537,9 @@ ENDSEC
                 let drag = (e)=>{ 
                     if(this.split && e.dragViewport.name == 'top' && this.selected && this.transformState ){ 
                         if(e.type == 'global_mousedown' ){ //开始
-                            if((e.intersect.object || e.intersect.pointcloud) == this.selected){
+                            //if((e.intersect.object || e.intersect.pointcloud) == this.selected){
+                            if(e.intersect.pointclouds.includes(this.selected) || e.intersect.allElements.some(e=>e.object == this.selected)){
+       
                                 dragInfo = {};  
                             }  
                         }
@@ -117554,7 +117583,9 @@ ENDSEC
                 viewer.addEventListener('global_drag', drag, 10);
                 viewer.addEventListener('global_mousemove', (e)=>{
                     if(this.split && e.hoverViewport.name == 'top' && this.transformState && !e.drag ){
-                        let mouseover = (e.intersect.object || e.intersect.pointcloud) == this.selected;
+                        
+                        let mouseover =  e.intersect.pointclouds.includes(this.selected) || e.intersect.allElements.some(e=>e.object == this.selected);
+                        //let mouseover = (e.intersect.object || e.intersect.pointcloud) == this.selected
                         if(mouseover){
                             if(this.transformState == 'translate'){
                                 viewer.dispatchEvent({
@@ -117764,8 +117795,25 @@ ENDSEC
             if(fitBound){
                 viewer.focusOnObject({boundingBox}, 'boundingBox', duration, {dontLookUp}); 
             }else { 
+            
+                /* 
+                let position = viewer.inputHandler.intersect ? viewer.inputHandler.intersect.location : boundingBox.getCenter(new THREE.Vector3)
+                position && viewer.focusOnObject({position},  'point', duration, {dontChangePos: true})
+                 */
                 let position = viewer.inputHandler.intersect ? viewer.inputHandler.intersect.location : boundingBox.getCenter(new Vector3);
-                position && viewer.focusOnObject({position},  'point', duration, {dontChangePos: true});
+                if(!position)return
+                
+                
+                /* let targetOld = viewer.mainViewport.view.getPivot()
+                
+                let projected1 = targetOld.clone().project(viewer.mainViewport.camera);
+                let projected2 = position.clone().project(viewer.mainViewport.camera); //使用其z
+    			let targetNew = projected1.clone().setZ(projected2.z).unproject(viewer.mainViewport.camera); 
+                viewer.mainViewport.view.lookAt(targetNew) */
+                
+                
+                viewer.mainViewport.view.radius = viewer.mainViewport.camera.position.distanceTo(position);
+                //为了不改画面,不调节方向了,只能调调radius,一定程度将target靠近model
             }
                
              
@@ -117833,10 +117881,10 @@ ENDSEC
                        
                     }
                 });
-                if(changed){
+                if(changed){//仿transformByPointcloud
                     measure.getPoint2dInfo(measure.points);
                     measure.update(); 
-                    measure.setSelected(false);//隐藏edgelabel
+                    measure.setSelected(false);//隐藏edgelabel  
                 }
             });
             
@@ -129965,7 +130013,7 @@ ENDSEC
                 
                 object.traverse( ( child )=>{ 
                     if ( child instanceof Mesh ) { 
-                        child.renderOrder = 10;
+                        child.renderOrder = Potree.config.renderOrders.model;
                         if(Potree.settings.boundAddObjs){
                             child.geometry.computeBoundingBox();
                             //console.log(child.matrixWorld.clone())

File diff suppressed because it is too large
+ 1 - 1
public/lib/potree/potree.js.map


+ 35 - 4
src/sdk/cover/index.js

@@ -618,11 +618,30 @@ export const enter = (dom, isLocal) => {
                 changeOpacity(opacity){ 
                     if(opacity == void 0)opacity = 100
                     opacity/=100
+                    
+                    let setOp = (mesh)=>{//见笔记:透明物体的材质设置
+                        if(model.isPointcloud){
+                            mesh.changePointOpacity(opacity)  
+                        }else{
+                            mesh.material.opacity = opacity
+                        }
+                        
+                        if(opacity<1){
+                            mesh.material.transparent = true
+                            mesh.renderOrder = Potree.config.renderOrders.model+1 
+                            mesh.material.depthWrite = false
+                        }else{
+                            mesh.material.transparent = false
+                            mesh.renderOrder = Potree.config.renderOrders.model
+                            mesh.material.depthWrite = true
+                        }
+                    }
+                    
                     if(model){
                         if(model.isPointcloud){
-                            model.material.opacity = opacity
+                            setOp(model)  
                         }else{
-                            model.traverse(e=>e.material && (e.material.opacity = opacity))
+                            model.traverse(e=>e.material && setOp(e, opacity))
                         }
                     }
                      
@@ -632,10 +651,19 @@ export const enter = (dom, isLocal) => {
                     model.dispatchEvent('transformChanged') //改了position
                 },
                 changePosition(pos){//校准取消时执行
+                    if(MergeEditor.selected == model){
+                        console.log('pos',pos.x, pos.y, pos.z)
+                    }
+                    
                     model && model.position.copy(pos)
                     model.dispatchEvent({type:'transformChanged'}) 
                 }, 
                 changeRotation(rot){//校准取消时执行
+                
+                    if(MergeEditor.selected == model){
+                        console.log('rot', rot.x, rot.y, rot.z)
+                    }
+                
                     model && model.rotation.setFromVector3(rot)
                     model.dispatchEvent({type:'transformChanged'}) //通知measure
                 },
@@ -660,7 +688,9 @@ export const enter = (dom, isLocal) => {
                         } 
                     }
                 },
-                leaveTransform(){ 
+                leaveTransform(){
+                    
+                    
                     if(MergeEditor.split){//分屏校准
                         MergeEditor.setTransformState(null)
                     }else{ 
@@ -671,7 +701,7 @@ export const enter = (dom, isLocal) => {
                 enterAlignment(){//开始校准
                     MergeEditor.enterSplit()
                     result.leaveTransform()
-                     
+                    console.log('enterAlignment',model.position, model.rotation)
                     let bus = new mitt()
                     
                     return { 
@@ -679,6 +709,7 @@ export const enter = (dom, isLocal) => {
                     } 
                 },
                 leaveAlignment(){
+                    console.log('leaveAlignment',model.position, model.rotation)
                     MergeEditor.leaveSplit() 
                 },