xzw 2 jaren geleden
bovenliggende
commit
13903f0973
2 gewijzigde bestanden met toevoegingen van 231 en 224 verwijderingen
  1. 230 223
      public/static/lib/potree/potree.js
  2. 1 1
      public/static/lib/potree/potree.js.map

+ 230 - 223
public/static/lib/potree/potree.js

@@ -90458,217 +90458,6 @@ void main()
 	    
 	}
 
-	class SplitScreen extends EventDispatcher{
-	    constructor (args = {}) {
-			super();
-	        
-	    }
-	    /* 
-	        viewport.targetPlane  // bound中心点处的plane,方向和view一致
-	        viewport.shiftTarget  // camera的位置project在targetPlane上的位置
-	        这两个参数的主要目的是为了getPosOutOfModel,以及rotateSideCamera时保持相对位置
-	    */
-	    splitStart(cameraProps){ 
-	        let viewports = [];
-	      
-	        let subViewports = [viewer.mainViewport];
-	        if(viewer.mapViewer){
-	            subViewports.push(viewer.mapViewer.viewports[0]);
-	        }
-	        
-	        let length = cameraProps.length;
-	        for(let i=0;i<length;i++){
-	            let prop = cameraProps[i];
-	            let viewport;
-	            let v = subViewports.find(e=>e.name == (prop.name2||prop.name)); 
-	            if(v){
-	                viewport = v;
-	                viewport.left = prop.left; viewport.bottom = prop.bottom; viewport.width = prop.width; viewport.height = prop.height;
-	            }
-	            
-	            if(!viewport){
-	                let view = new ExtendView();  
-	                if(prop.limitBound)view.limitBound = prop.limitBound;
-	                prop.direction && (view.direction = prop.direction);
-	                
-	                viewport = new Viewport(view , this.getOrthoCamera(), prop );
-	                if(prop.viewContainsPoints)viewport.viewContainsPoints = prop.viewContainsPoints;
-	                
-	                //viewport.unableDepth = true //depthBasicMaterial等在此viewport中不开启depth 
-	                
-	            }    
-	            if(viewport.camera.type == 'OrthographicCamera'  ){
-	                viewport.targetPlane = new Plane();
-	                viewport.shiftTarget = new Vector3; //project在targetPlane上的位置
-	            }
-	            viewport.fitMargin = prop.margin;
-	            viewports.push(viewport); 
-	        } 
-	        viewer.viewports = viewports;
-	        viewer.updateScreenSize({forceUpdateSize:true});
-	        viewports.forEach(viewport=>{
-	            if(viewport.name == 'MainView')return
-	            this.viewportFitBound(viewport, viewer.bound.boundingBox , viewer.bound.center , 0, viewport.fitMargin);
-	        }); 
-	        return viewports
-	    } 
-	    
-	    
-	    unSplit(){
-	        this.unfocusViewport();
-	        viewer.viewports = [viewer.mainViewport]; 
-	        viewer.mainViewport.width = 1;
-	        viewer.mainViewport.height = 1;
-	        viewer.mainViewport.left = 0;
-	        viewer.mainViewport.bottom = 0;   
-	        viewer.updateScreenSize({forceUpdateSize:true});        
-	    }
-	    
-	    
-	    viewportFitBound(viewport,  bound,  center, duration=0, margin){
-	        let view = viewport.view;
-	        let info = {bound}; 
-	                                                                  
-	         
-	        let {boundSize, boundCenter} = this.getViewBound(viewport, bound );
-	        
-	        //this.setShiftTarget(viewport, boundCenter)
-	     
-	        viewport.targetPlane.setFromNormalAndCoplanarPoint( view.direction.clone(), boundCenter );  
-	        viewport.targetPlane.projectPoint(center, viewport.shiftTarget);  //target转换到过模型中心的平面,以保证镜头一定在模型外 this.shiftTarget是得到的
-	         
-	        info.endPosition = this.getPosOutOfModel(viewport, boundSize); 
-	        
-	        //if(viewport.name == 'mapViewport')info.endPosition.z = Math.max(Potree.config.map.cameraHeight, info.endPosition.z) 
-	         
-	        info.margin = margin || {x:30, y:30};    
-	        view.moveOrthoCamera(viewport, info ,  duration   );
-	    } 
-	    
-	    
-	    getViewBound(viewport, boundingBox){
-	        if(boundingBox){
-	            boundSize = boundingBox.getSize(new Vector3);
-	            center = boundingBox.getCenter(new Vector3);
-	        }else {
-	            var {boundSize, center, boundingBox} = viewer.bound;
-	        }
-	        
-	        
-	        if(viewport.viewContainsPoints){//视野范围内必须要包含的点,直接算入模型区域。这时候得到的boundCenter和模型中心不重合
-	            boundingBox = boundingBox.clone();
-	            viewport.viewContainsPoints.forEach(point=>{
-	                boundingBox.expandByPoint(point);
-	            });
-	            boundSize = boundingBox.getSize(new Vector3);
-	            center = boundingBox.getCenter(new Vector3);
-	        }
-	         
-	        return {boundSize, boundCenter:center }  
-	    }
-	    
-	    getPosOutOfModel(viewport, boundSize){ 
-	        //let {boundSize, center} = viewer.bound
-	        boundSize = boundSize || this.getViewBound(viewport).boundSize;
-	        let expand = 10; 
-	        let radius = boundSize.length(); //    / 2  
-	        let position = viewport.shiftTarget.clone().sub(viewport.view.direction.clone().multiplyScalar(radius + expand));  
-	         
-	        return position 
-	    } 
-	    
-	    updateCameraOutOfModel(){//因为移动模型导致模型超出相机外,所以更新位置
-	        viewer.viewports.forEach((viewport, i )=>{
-	            if(viewport != viewer.mainViewport){
-	                let {boundSize, boundCenter} = this.getViewBound(viewport);
-	                /* viewport.targetPlane.setFromNormalAndCoplanarPoint( viewport.view.direction.clone(), boundCenter) 
-	                viewport.targetPlane.projectPoint(viewport.view.position, viewport.shiftTarget)  //target转换到过模型中心的平面,以保证镜头一定在模型外 this.shiftTarget是得到的
-	                */ 
-	                this.setShiftTarget(viewport, boundCenter);
-	                 let endPosition = this.getPosOutOfModel(viewport, boundSize); 
-	                 //if(viewport.name == 'mapViewport')endPosition.z = Math.max(Potree.config.map.cameraHeight, endPosition.z) 
-	                 viewport.view.position.copy(endPosition);
-	            } 
-	        });  
-	    }  
-	     
-	     
-	     
-	     
-	    setShiftTarget(viewport, center){
-	        if(!viewport.targetPlane ){
-	            viewport.targetPlane = new Plane();
-	            viewport.shiftTarget = new Vector3; //project在targetPlane上的位置
-	        }
-	         
-	        viewport.targetPlane.setFromNormalAndCoplanarPoint(viewport.view.direction, center ); 
-	        viewport.targetPlane.projectPoint(viewport.view.position,  viewport.shiftTarget );  //target转换到过模型中心的平面,以保证镜头一定在模型外
-	        
-	    }
-	     
-	    rotateSideCamera(viewport, angle){//侧视图绕模型中心水平旋转
-	         
-	        //let {boundSize, center} = viewer.bound
-	        let {boundSize, boundCenter } = this.getViewBound(viewport);  
-	        let center = this.focusCenter || boundCenter; //旋转中心,一般是所有模型的中心,除非想指定中心点
-	        this.setShiftTarget(viewport, center);
-	        //找到平移向量
-	        let vec = new Vector3().subVectors(center, viewport.shiftTarget);//相对于中心的偏移值,旋转后偏移值也旋转
-	        
-	        //旋转
-	        var rotMatrix = new Matrix4().makeRotationAxis(new Vector3(0,0,1), angle); 
-	        
-	        viewport.view.direction = viewport.view.direction.applyMatrix4(rotMatrix);
-	         
-	         
-	        vec.applyMatrix4(rotMatrix);
-	        viewport.shiftTarget.subVectors(center,vec); //新的
-	        
-	        
-	        viewport.view.position = this.getPosOutOfModel(viewport, boundSize);
-	        
-	    }
-	    
-	    getOrthoCamera(){
-	        let camera = new OrthographicCamera(-100, 100, 100, 100, 0.01, 10000);
-	        camera.up.set(0,0,1);
-	        return camera
-	    } 
-	    
-	    focusOnViewport(name){//全屏
-	        viewer.viewports.forEach((viewport, i )=>{
-	            if(viewport.name == name){
-	                this.focusInfo = {
-	                    name,
-	                    left : viewport.left, bottom : viewport.bottom, height : viewport.height, width : viewport.width
-	                };
-	                viewport.left = 0;  viewport.bottom = 0;   viewport.height = 1;  viewport.width = 1;  
-	                
-	            }else {
-	                viewport.active = false;
-	            }
-	        });
-	         
-	        viewer.updateScreenSize({forceUpdateSize:true}); 
-	    } 
-	    
-	    unfocusViewport(){
-	        if(!this.focusInfo)return
-	        viewer.viewports.forEach((viewport, i )=>{ 
-	            if(this.focusInfo.name == viewport.name){//全屏的恢复 
-	                viewport.left = this.focusInfo.left;
-	                viewport.bottom = this.focusInfo.bottom;
-	                viewport.height = this.focusInfo.height;
-	                viewport.width = this.focusInfo.width;
-	            }
-	            viewport.active = true; 
-	        }); 
-	        viewer.updateScreenSize({forceUpdateSize:true}); 
-	        this.focusInfo = null;
-	    } 
-	    
-	}
-
 	/**
 	 * @author mschuetz / http://mschuetz.at
 	 *
@@ -91819,8 +91608,7 @@ void main()
 	        }) ];
 	        
 	        this.cube = new NavigationCube(this.scene,  w/2 );
-	        this.splitScreen = new SplitScreen();
-	         
+	        
 	        
 	        viewer.addEventListener('camera_changed', e => {
 	            if (e.viewport == listenViewport && (/* e.changeInfo.positionChanged ||  */e.changeInfo.quaternionChanged)) {
@@ -91855,7 +91643,7 @@ void main()
 	                viewContainsPoints:[new Vector3(0,0,0)],
 	                margin:{x:300, y:250} ,
 	            } ];
-	            this.splitScreen.splitStart(viewportProps);
+	            viewer.splitScreen.splitStart(viewportProps);
 	            
 	            
 	            viewer.images360.addEventListener('beginChangeMode',(e)=>{
@@ -91947,7 +91735,7 @@ void main()
 	                this.controls.setEnable(false);
 	                 
 	                //假设保持到目前中心的视角范围不变
-	                this.splitScreen.setShiftTarget(viewer.mainViewport, viewer.bound.center);
+	                viewer.splitScreen.setShiftTarget(viewer.mainViewport, viewer.bound.center);
 	                let dis = new Vector3().subVectors(viewer.mainViewport.shiftTarget,  viewer.scene.cameraO.position).length() ;   //-nearestPano[0].score
 		                    
 	                //根据2d->3d的式子逆求zoom
@@ -91984,9 +91772,7 @@ void main()
 	                
 	                //假设保持到目前中心的视角范围不变
 	                
-	                this.splitScreen.setShiftTarget(viewer.mainViewport, viewer.bound.center);
-	                viewer.mainViewport.targetPlane.setFromNormalAndCoplanarPoint( view.direction.clone(), viewer.bound.center );  
-	                viewer.mainViewport.targetPlane.projectPoint(view.position, viewer.mainViewport.shiftTarget );  
+	                viewer.splitScreen.setShiftTarget(viewer.mainViewport, viewer.bound.center);
 	                 
 	                let halfHeight = viewer.scene.cameraO.top/viewer.scene.cameraO.zoom; 
 	                let dis = halfHeight / Math.tan( MathUtils$1.degToRad(viewer.scene.cameraP.fov/2)); 
@@ -92090,7 +91876,7 @@ void main()
 	    
 	    
 	    rotateSideCamera(angle){
-	        this.splitScreen.rotateSideCamera(viewer.mainViewport,angle);
+	        viewer.splitScreen.rotateSideCamera(viewer.mainViewport,angle);
 	    }
 	    
 	}
@@ -102615,6 +102401,217 @@ ENDSEC
 	     
 	};
 
+	class SplitScreen extends EventDispatcher{
+	    constructor (args = {}) {
+			super();
+	        
+	    }
+	    /* 
+	        viewport.targetPlane  // bound中心点处的plane,方向和view一致
+	        viewport.shiftTarget  // camera的位置project在targetPlane上的位置
+	        这两个参数的主要目的是为了getPosOutOfModel,以及rotateSideCamera时保持相对位置
+	    */
+	    splitStart(cameraProps){ 
+	        let viewports = [];
+	      
+	        let subViewports = [viewer.mainViewport];
+	        if(viewer.mapViewer){
+	            subViewports.push(viewer.mapViewer.viewports[0]);
+	        }
+	        
+	        let length = cameraProps.length;
+	        for(let i=0;i<length;i++){
+	            let prop = cameraProps[i];
+	            let viewport;
+	            let v = subViewports.find(e=>e.name == (prop.name2||prop.name)); 
+	            if(v){
+	                viewport = v;
+	                viewport.left = prop.left; viewport.bottom = prop.bottom; viewport.width = prop.width; viewport.height = prop.height;
+	            }
+	            
+	            if(!viewport){
+	                let view = new ExtendView();  
+	                if(prop.limitBound)view.limitBound = prop.limitBound;
+	                prop.direction && (view.direction = prop.direction);
+	                
+	                viewport = new Viewport(view , this.getOrthoCamera(), prop );
+	                if(prop.viewContainsPoints)viewport.viewContainsPoints = prop.viewContainsPoints;
+	                
+	                //viewport.unableDepth = true //depthBasicMaterial等在此viewport中不开启depth 
+	                
+	            }    
+	            if(viewport.camera.type == 'OrthographicCamera'  ){
+	                viewport.targetPlane = new Plane();
+	                viewport.shiftTarget = new Vector3; //project在targetPlane上的位置
+	            }
+	            viewport.fitMargin = prop.margin;
+	            viewports.push(viewport); 
+	        } 
+	        viewer.viewports = viewports;
+	        viewer.updateScreenSize({forceUpdateSize:true});
+	        viewports.forEach(viewport=>{
+	            if(viewport.name == 'MainView')return
+	            this.viewportFitBound(viewport, viewer.bound.boundingBox , viewer.bound.center , 0, viewport.fitMargin);
+	        }); 
+	        return viewports
+	    } 
+	    
+	    
+	    unSplit(){
+	        this.unfocusViewport();
+	        viewer.viewports = [viewer.mainViewport]; 
+	        viewer.mainViewport.width = 1;
+	        viewer.mainViewport.height = 1;
+	        viewer.mainViewport.left = 0;
+	        viewer.mainViewport.bottom = 0;   
+	        viewer.updateScreenSize({forceUpdateSize:true});        
+	    }
+	    
+	    
+	    viewportFitBound(viewport,  bound,  center, duration=0, margin){
+	        let view = viewport.view;
+	        let info = {bound}; 
+	                                                                  
+	         
+	        let {boundSize, boundCenter} = this.getViewBound(viewport, bound );
+	        
+	        //this.setShiftTarget(viewport, boundCenter)
+	     
+	        viewport.targetPlane.setFromNormalAndCoplanarPoint( view.direction.clone(), boundCenter );  
+	        viewport.targetPlane.projectPoint(center, viewport.shiftTarget);  //target转换到过模型中心的平面,以保证镜头一定在模型外 this.shiftTarget是得到的
+	         
+	        info.endPosition = this.getPosOutOfModel(viewport, boundSize); 
+	        
+	        //if(viewport.name == 'mapViewport')info.endPosition.z = Math.max(Potree.config.map.cameraHeight, info.endPosition.z) 
+	         
+	        info.margin = margin || {x:30, y:30};    
+	        view.moveOrthoCamera(viewport, info ,  duration   );
+	    } 
+	    
+	    
+	    getViewBound(viewport, boundingBox){
+	        if(boundingBox){
+	            boundSize = boundingBox.getSize(new Vector3);
+	            center = boundingBox.getCenter(new Vector3);
+	        }else {
+	            var {boundSize, center, boundingBox} = viewer.bound;
+	        }
+	        
+	        
+	        if(viewport.viewContainsPoints){//视野范围内必须要包含的点,直接算入模型区域。这时候得到的boundCenter和模型中心不重合
+	            boundingBox = boundingBox.clone();
+	            viewport.viewContainsPoints.forEach(point=>{
+	                boundingBox.expandByPoint(point);
+	            });
+	            boundSize = boundingBox.getSize(new Vector3);
+	            center = boundingBox.getCenter(new Vector3);
+	        }
+	         
+	        return {boundSize, boundCenter:center }  
+	    }
+	    
+	    getPosOutOfModel(viewport, boundSize){ 
+	        //let {boundSize, center} = viewer.bound
+	        boundSize = boundSize || this.getViewBound(viewport).boundSize;
+	        let expand = 10; 
+	        let radius = boundSize.length(); //    / 2  
+	        let position = viewport.shiftTarget.clone().sub(viewport.view.direction.clone().multiplyScalar(radius + expand));  
+	         
+	        return position 
+	    } 
+	    
+	    updateCameraOutOfModel(){//因为移动模型导致模型超出相机外,所以更新位置
+	        viewer.viewports.forEach((viewport, i )=>{
+	            if(viewport != viewer.mainViewport){
+	                let {boundSize, boundCenter} = this.getViewBound(viewport);
+	                /* viewport.targetPlane.setFromNormalAndCoplanarPoint( viewport.view.direction.clone(), boundCenter) 
+	                viewport.targetPlane.projectPoint(viewport.view.position, viewport.shiftTarget)  //target转换到过模型中心的平面,以保证镜头一定在模型外 this.shiftTarget是得到的
+	                */ 
+	                this.setShiftTarget(viewport, boundCenter);
+	                 let endPosition = this.getPosOutOfModel(viewport, boundSize); 
+	                 //if(viewport.name == 'mapViewport')endPosition.z = Math.max(Potree.config.map.cameraHeight, endPosition.z) 
+	                 viewport.view.position.copy(endPosition);
+	            } 
+	        });  
+	    }  
+	     
+	     
+	     
+	     
+	    setShiftTarget(viewport, center){
+	        if(!viewport.targetPlane ){
+	            viewport.targetPlane = new Plane();
+	            viewport.shiftTarget = new Vector3; //project在targetPlane上的位置
+	        }
+	         
+	        viewport.targetPlane.setFromNormalAndCoplanarPoint(viewport.view.direction, center ); 
+	        viewport.targetPlane.projectPoint(viewport.view.position,  viewport.shiftTarget );  //target转换到过模型中心的平面,以保证镜头一定在模型外
+	        
+	    }
+	     
+	    rotateSideCamera(viewport, angle){//侧视图绕模型中心水平旋转
+	         
+	        //let {boundSize, center} = viewer.bound
+	        let {boundSize, boundCenter } = this.getViewBound(viewport);  
+	        let center = this.focusCenter || boundCenter; //旋转中心,一般是所有模型的中心,除非想指定中心点
+	        this.setShiftTarget(viewport, center);
+	        //找到平移向量
+	        let vec = new Vector3().subVectors(center, viewport.shiftTarget);//相对于中心的偏移值,旋转后偏移值也旋转
+	        
+	        //旋转
+	        var rotMatrix = new Matrix4().makeRotationAxis(new Vector3(0,0,1), angle); 
+	        
+	        viewport.view.direction = viewport.view.direction.applyMatrix4(rotMatrix);
+	         
+	         
+	        vec.applyMatrix4(rotMatrix);
+	        viewport.shiftTarget.subVectors(center,vec); //新的
+	        
+	        
+	        viewport.view.position = this.getPosOutOfModel(viewport, boundSize);
+	        
+	    }
+	    
+	    getOrthoCamera(){
+	        let camera = new OrthographicCamera(-100, 100, 100, 100, 0.01, 10000);
+	        camera.up.set(0,0,1);
+	        return camera
+	    } 
+	    
+	    focusOnViewport(name){//全屏
+	        viewer.viewports.forEach((viewport, i )=>{
+	            if(viewport.name == name){
+	                this.focusInfo = {
+	                    name,
+	                    left : viewport.left, bottom : viewport.bottom, height : viewport.height, width : viewport.width
+	                };
+	                viewport.left = 0;  viewport.bottom = 0;   viewport.height = 1;  viewport.width = 1;  
+	                
+	            }else {
+	                viewport.active = false;
+	            }
+	        });
+	         
+	        viewer.updateScreenSize({forceUpdateSize:true}); 
+	    } 
+	    
+	    unfocusViewport(){
+	        if(!this.focusInfo)return
+	        viewer.viewports.forEach((viewport, i )=>{ 
+	            if(this.focusInfo.name == viewport.name){//全屏的恢复 
+	                viewport.left = this.focusInfo.left;
+	                viewport.bottom = this.focusInfo.bottom;
+	                viewport.height = this.focusInfo.height;
+	                viewport.width = this.focusInfo.width;
+	            }
+	            viewport.active = true; 
+	        }); 
+	        viewer.updateScreenSize({forceUpdateSize:true}); 
+	        this.focusInfo = null;
+	    } 
+	    
+	}
+
 	const FEET_TO_INCHES_FACTOR = 12;
 	const EIGHTHS_SYMBOLS = ["", "⅛", "¼", "⅜", "½", "⅝", "¾", "⅞"];//eighths 八分之……
 
@@ -106322,7 +106319,7 @@ ENDSEC
 	            
 	            this.position.copy(playerPos.clone().add(dir));
 	        }else {
-	            viewer.navCubeViewer.splitScreen.setShiftTarget(viewer.mainViewport, viewer.bound.center);
+	            viewer.splitScreen.setShiftTarget(viewer.mainViewport, viewer.bound.center);
 	            viewer.mainViewport.targetPlane.setFromNormalAndCoplanarPoint( viewer.mainViewport.view.direction.clone(), viewer.bound.center );  
 	            viewer.mainViewport.targetPlane.projectPoint(newPos, viewer.mainViewport.shiftTarget );  
 	            this.position.copy(viewer.mainViewport.shiftTarget.clone() ); 
@@ -136099,7 +136096,8 @@ ENDSEC
 	        }
 	         
 	  
-	        
+	        this.splitScreen = new SplitScreen();
+	         
 	        this.navigateMode = 'free'; // 'panorama'; 'free'自由模式是只显示点云或者未进入到漫游点, 
 	        this.isEdit = true;
 	        this.waitQueue = [];  
@@ -139506,7 +139504,13 @@ ENDSEC
 	                boundSize.y = Math.max(min, boundSize.y);
 	            }
 	            if(camera.type == 'OrthographicCamera'){
-	                dis = boundSize.length();  
+	                //dis = boundSize.length()   
+	                o.dontChangeCamDir = true; //强制不改方向
+	                //必须在模型外部
+	                this.mainViewport.targetPlane.setFromNormalAndCoplanarPoint(this.mainViewport.view.direction, this.bound.center ); 
+	                this.mainViewport.targetPlane.projectPoint(target,  this.mainViewport.shiftTarget ); //得到target在中心面的投影
+	                let pos = this.splitScreen.getPosOutOfModel(this.mainViewport, this.bound.size);  //得到观察位置(shiftTarget投影到模型外部)
+	                dis = pos.distanceTo(target);   
 	            }else {
 	                let aspect = boundSize.x / boundSize.y;
 	                if(camera.aspect > aspect){//视野更宽则用bound的纵向来决定
@@ -139523,8 +139527,11 @@ ENDSEC
 	            //三个顶点以上的由于measure的中心不等于bound的中心,所以点会超出bound外。 且由于视椎近大远小,即使是两个点的,bound居中后线看上去仍旧不居中.
 	             
 	            //获得相机最佳位置
+	            
+	           
+	            
 	            let dir; 
-	            if(o.dontChangeCamDir){
+	            if(o.dontChangeCamDir){ 
 	                dir = viewer.mainViewport.view.direction.negate();
 	            }else {
 	                dir = new Vector3().subVectors(cameraPos, target).normalize();  

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