瀏覽代碼

触屏时点云模式可以缩放前进啦! 地图可以缩放平移。

xzw 3 年之前
父節點
當前提交
28785474de

+ 4 - 4
src/PointCloudOctree.js

@@ -1177,23 +1177,23 @@ export class PointCloudOctree extends PointCloudTree {
         } else {
             this.temp.pointSize = num
         }
-
+        
         if(Potree.settings.sizeFitToLevel){//按照点云质量来调整的版本:
             let base = this.material.spacing / Math.pow(2, this.maxLevel) //点云大小在level为0时设置为spacing,每长一级,大小就除以2
             base *= this.nodeMaxLevel > 0 ? Math.max(0.1, Math.pow(this.maxLevel / this.nodeMaxLevel, 1.3)) : 0.1 //低质量的缩小点,因为视觉上看太大了。navvis是不铺满的,我们也留一点缝隙
 
-            this.material.size = base * 3 * num  
+            this.material.size = base * 3 * num * window.devicePixelRatio
             //在t-8BCqxQAr93 会议室 和 t-e2Kb2iU 隧道 两个场景里调节,因为它们的spacing相差较大,观察会议室墙壁的龟裂程度
             
             
         }else{
             let base = this.material.spacing / Math.pow(2, this.nodeMaxLevel) //点云大小在level为0时设置为spacing,每长一级,大小就除以2
             
-            this.material.size = base * 4 * num 
+            this.material.size = base * 4 * num * window.devicePixelRatio 
         }
         
         
-        //console.log('changePointSize ' + this.dataset_id + ', num : ' + num + ' , size : ' + this.material.size, this.material.spacing)
+        console.log('changePointSize  '  + this.dataset_id + '  , num : ' + num + ' , size : ' + this.material.size, this.material.spacing)
 
          
     }  

+ 9 - 3
src/materials/PointCloudMaterial.js

@@ -280,14 +280,20 @@ export class PointCloudMaterial extends THREE.RawShaderMaterial {
 		} else if (this.pointSizeType === PointSizeType.ADAPTIVE) {
 			defines.push('#define adaptive_point_size');
 		}
-
+        
+        if(!viewer.supportExtFragDepth && this.shape === PointShape.PARABOLOID){
+            this.shape = PointShape.SQUARE ;//强行替换
+        }
+        
+        
 		if (this.shape === PointShape.SQUARE) {
 			defines.push('#define square_point_shape');
 		} else if (this.shape === PointShape.CIRCLE) {
 			defines.push('#define circle_point_shape');
-		} else if (this.shape === PointShape.PARABOLOID) {
+		}  else if (this.shape === PointShape.PARABOLOID) { 
 			defines.push('#define paraboloid_point_shape');
-		}
+		}  
+        //console.log('this.shape PARABOLOID', this.shape, this.shape === PointShape.PARABOLOID)
 
 		if (this._useEDL || this.fakeEDL) {
 			defines.push('#define use_edl');

+ 132 - 36
src/navigation/FirstPersonControls.js

@@ -66,7 +66,8 @@ export class FirstPersonControls extends EventDispatcher {
 		this.translationWorldDelta = new THREE.Vector3(0, 0, 0);
 
 		this.tweens = [];
-
+        this.dollyStart = new THREE.Vector2
+        this.dollyEnd = new THREE.Vector2
         //this.enableChangePos = true
         
         this.viewer.addEventListener('camera_changed',(e)=>{
@@ -79,7 +80,13 @@ export class FirstPersonControls extends EventDispatcher {
             let viewport = e.drag.dragViewport;
             if(!viewport)return
             let camera = viewport.camera 
-            let mode = e.buttons === Buttons.LEFT && (!e.drag.dragViewport || e.drag.dragViewport.name == 'MainView') ? 'rotate' : 'pan'
+            let mode 
+            if(e.isTouch){
+                mode = e.touches.length == 1 ? (!e.drag.dragViewport || e.drag.dragViewport.name == 'MainView') ? 'rotate' : 'pan'  : 'scale'
+            }else{
+                mode = e.buttons === Buttons.LEFT && (!e.drag.dragViewport || e.drag.dragViewport.name == 'MainView') ? 'rotate' : 'pan'
+            }
+            console.log('mode  ',mode )
             let moveSpeed = this.currentViewport.getMoveSpeed();
             if (e.drag.startHandled === undefined) {///???????
 				e.drag.startHandled = true;
@@ -87,15 +94,20 @@ export class FirstPersonControls extends EventDispatcher {
 				this.dispatchEvent({type: 'start'});
 			}
             
-			if (mode == 'rotate') {//旋转   (为什么开启调试时旋转很慢?)
+                
+            if (mode.includes('rotate')) {//旋转   (为什么开启调试时旋转很慢?)
 				
                 //来自panoramaControl updateRotation
+                 
+                if(!this.pointerDragStart){
+                   return this.pointerDragStart = e.pointer.clone()
+                }
                 
                 let _matrixWorld = camera.matrixWorld
                 camera.matrixWorld = new THREE.Matrix4;//unproject 前先把相机置于原点 
                 
-                var e1 = new THREE.Vector3(e.drag.pointerDragStart.x,e.drag.pointerDragStart.y,-1).unproject(camera)
-                  , t = new THREE.Vector3(e.drag.pointer.x,e.drag.pointer.y,-1).unproject(camera)
+                var e1 = new THREE.Vector3(this.pointerDragStart.x,this.pointerDragStart.y,-1).unproject(camera)
+                  , t = new THREE.Vector3(e.pointer.x,e.pointer.y,-1).unproject(camera)
                   , i = Math.sqrt(e1.x * e1.x + e1.z * e1.z)
                   , n = Math.sqrt(t.x * t.x + t.z * t.z)
                   , o = Math.atan2(e1.y, i)
@@ -109,14 +121,23 @@ export class FirstPersonControls extends EventDispatcher {
                 
                 if(!isNaN(s)){
                     var yawDelta = s    //左右旋转 
-                    e.drag.pointerDragStart.x > e.drag.pointer.x && (yawDelta *= -1) 
+                    this.pointerDragStart.x > e.pointer.x && (yawDelta *= -1) 
                     this.yawDelta += yawDelta
                 } 
-                e.drag.pointerDragStart.copy(e.drag.pointer)
+                
+                
+                console.log('rotate:', this.pitchDelta, e.pointer.toArray(), this.pointerDragStart.toArray())
+                
+                
+                this.pointerDragStart.copy(e.pointer)
                  
                 camera.matrixWorld = _matrixWorld ;
-              
-			} else if (mode == 'pan') {//平移 
+                
+                
+                
+			} 
+            
+            if (mode.includes('pan')) {//平移 
                 if(viewport.unableChangePos)return
                 if(camera.type == "OrthographicCamera"){
                    
@@ -150,13 +171,13 @@ export class FirstPersonControls extends EventDispatcher {
                     
                 }else{  
                     if(e.drag.intersectStart){//如果拖拽着点云 
-                         
+                        console.log('pan 1') 
                         if(e.drag.z == void 0){//拖拽开始
                             let pointerStartPos2d = e.drag.intersectStart.location.clone().project(camera);//识别到的点云点的位置
                             e.drag.z = pointerStartPos2d.z //记录z,保持拖拽物体到屏幕距离不变,所以z深度不变
                             e.drag.projectionMatrixInverse = camera.projectionMatrixInverse.clone()
                             //防止吸附到最近点上(因为鼠标所在位置并非识别到的点云点的位置,需要得到鼠标所在位置的3d坐标。)
-                            let pointerStartPos2dReal = new THREE.Vector3(e.drag.pointerDragStart.x,e.drag.pointerDragStart.y, e.drag.z);
+                            let pointerStartPos2dReal = new THREE.Vector3(this.pointerDragStart.x,this.pointerDragStart.y, e.drag.z);
                             e.drag.translateStartPos = pointerStartPos2dReal.clone().unproject(camera);
                             /* this.viewer.dispatchEvent({ 
                                 type: 'dragPanBegin', 
@@ -168,7 +189,7 @@ export class FirstPersonControls extends EventDispatcher {
                         camera.projectionMatrixInverse = e.drag.projectionMatrixInverse;
                         
                         
-                        let newPos2d = new THREE.Vector3(e.drag.pointer.x,e.drag.pointer.y,   e.drag.z );
+                        let newPos2d = new THREE.Vector3(e.pointer.x,e.pointer.y,   e.drag.z );
                         let newPos3d = newPos2d.clone().unproject(camera);
                         let moveVec = newPos3d.clone().sub( e.drag.translateStartPos  /*  e.drag.intersectStart.location  */ );//移动相机,保持鼠标下的位置永远不变,所以用鼠标下的新位置减去鼠标下的原始位置
                         
@@ -177,7 +198,7 @@ export class FirstPersonControls extends EventDispatcher {
                         this.translationWorldDelta.copy(moveVec.negate())  //这里没法用add,原因未知,会跳动
                           
                     }else{ //如果鼠标没有找到和点云的交点,就假设移动整个模型(也可以去扩大范围寻找最近点云)
-                         
+                        console.log('pan 2')  
                         /* let center = viewer.scene.pointclouds[0].position;
                         let radius = camera.position.distanceTo(center);
                         let ratio = radius * Math.tan(THREE.Math.degToRad(camera.fov)/2) / 1000 */
@@ -199,6 +220,24 @@ export class FirstPersonControls extends EventDispatcher {
                 } 
                 
 			}
+            
+            
+            if(mode.includes('scale')){
+                this.dollyEnd.subVectors(e.touches[0].pointer, e.touches[1].pointer);
+                //if(!this.dollyStart)return
+                var scale = this.dollyEnd.length() / this.dollyStart.length()
+
+                //console.log('scale ',scale)
+                 
+                let pointer = new THREE.Vector2().addVectors(e.touches[0].pointer, e.touches[1].pointer).multiplyScalar(0.5);//两个指头的中心点
+                
+                dolly({
+                    pointer,
+                    scale, camera
+                })
+                this.dollyStart.copy(this.dollyEnd);
+                
+            }
             //最好按ctrl可以变为dollhouse的那种旋转
 		};
 
@@ -207,23 +246,30 @@ export class FirstPersonControls extends EventDispatcher {
 			this.dispatchEvent({type: 'end'});
 		};
 
-		let scroll = (e) => {
-            if(!this.enabled)return   
-            this.setCurrentViewport(e)            
+
+        let dolly = (e={})=>{
+                       
             if(this.currentViewport.unableChangePos){//全景时 
                 return 
             }
-            let camera = e.hoverViewport.camera
-            let speed = this.currentViewport.getMoveSpeed() || 1 
+            
+            let camera = e.camera
+            
+            
             if(camera.type == "OrthographicCamera"){
                 let ratio
-                if(e.delta == 0){//mac
-                   return 
-                }else if (e.delta < 0) {
-                    ratio = 0.9 
-                } else if (e.delta > 0) {
-                    ratio = 1.1
-                } 
+                if(e.delta != void 0){//滚轮缩放
+                    if(e.delta == 0){//mac
+                       return 
+                    }else if (e.delta < 0) {
+                        ratio = 0.9 
+                    } else if (e.delta > 0) {
+                        ratio = 1.1
+                    } 
+                }else{
+                    ratio = e.scale //触屏缩放
+                }
+                
                 let zoom = camera.zoom * ratio
                 let limit = Potree.config.OrthoCameraLimit.zoom
                 zoom = THREE.Math.clamp(zoom, limit.min,limit.max )
@@ -243,18 +289,42 @@ export class FirstPersonControls extends EventDispatcher {
                 this.translationWorldDelta.add(moveVec.negate()) 
                 
             }else{
-                //var direction = this.currentViewport.view.direction.clone();
-                let direction = this.viewer.inputHandler.getMouseDirection().direction  //定点缩放
+                let speed , direction
                  
-                var vec = direction.multiplyScalar(speed * 7)
-                if (e.delta < 0) {
-                    this.translationWorldDelta.copy(vec.negate())
-                } else if (e.delta > 0) {
-                    this.translationWorldDelta.copy(vec)
-                } 
+                
+                if(e.delta != void 0){//滚轮缩放 
+                    speed = (this.currentViewport.getMoveSpeed() || 1) * 7
+                    
+                    //var direction = this.currentViewport.view.direction.clone();
+                    direction = this.viewer.inputHandler.getMouseDirection().direction  //定点缩放
+                 
+                    
+                    if(e.delta == 0){//mac
+                        return 
+                    }else if (e.delta < 0) {
+                        speed *= -1
+                    } 
+                }else{
+                    const constantDis =  this.currentViewport.getMoveSpeed() * 500 //constantDis = 10;//常量系数,当放大一倍时前进的距离。可以调整
+                    speed = (e.scale-1)*constantDis //触屏缩放
+                    //pointer = new THREE.Vector2().addVectors().multiplyScalar(0.5);//两个指头的中心点
+                    direction = this.viewer.inputHandler.getMouseDirection(e.pointer).direction  //定点缩放
+                }
+                 
+               
+                var vec = direction.multiplyScalar(speed )
+                this.translationWorldDelta.copy(vec)
+                
             }
-            
-            
+        }
+
+		let scroll = (e) => {
+            if(!this.enabled)return 
+            this.setCurrentViewport(e)
+          
+                
+            e.camera = e.hoverViewport.camera                
+            dolly(e) 
 		};
 
 		let dblclick = (e) => { 
@@ -266,11 +336,37 @@ export class FirstPersonControls extends EventDispatcher {
 		};
 
 		this.viewer.addEventListener('global_drag', drag);
+        this.viewer.addEventListener('global_touchmove', (e)=>{ 
+            if(e.touches.length>1){//单指的就触发上一句 
+                //console.log('global_touchmove' )
+                drag(e)
+            }
+        });
 		this.viewer.addEventListener('global_drop', drop);
 		this.viewer.addEventListener('global_mousewheel', scroll);
 		this.viewer.addEventListener('global_dblclick', dblclick);
         
-        this.viewer.addEventListener('startDragging', this.setCurrentViewport.bind(this))
+        this.viewer.addEventListener('startDragging', (e)=>{
+            this.setCurrentViewport(e)
+            this.pointerDragStart = e.pointer.clone()
+        })
+        this.viewer.addEventListener('global_touchstart', (e)=>{
+            if(e.touches.length==2){//只监听开头两个指头
+                this.dollyStart.subVectors(e.touches[0].pointer, e.touches[1].pointer);
+            }
+        })
+        this.viewer.addEventListener('global_touchend', (e)=>{
+            if(e.touches.length==1){//停止scale,开始rotate
+                this.pointerDragStart = e.pointer.clone()  
+                //this.pointerDragStart = null
+                console.log('只剩一个', e.pointer.toArray())
+                
+            }
+        })
+       
+        
+        
+        
         /* this.viewer.addEventListener('enableChangePos', (e)=>{
             if(!this.enabled)return
             this.enableChangePos = e.canLeavePano 

+ 168 - 133
src/navigation/InputHandler.js

@@ -48,7 +48,7 @@ export class InputHandler extends EventDispatcher {
 		}
         
         
-     
+        this.touches = []
 
 
         
@@ -94,66 +94,133 @@ export class InputHandler extends EventDispatcher {
 			return ib - ia;
 		});
 	} */
-
+    //统一跟第一个触碰的viewport相同
+    updateTouchesInfo(e){
+        var   viewport, pointer, camera  
+        let oldTouches = this.touches
+        
+        this.touches = Array.from(e.touches).map(touch=>{
+            let touch_ = oldTouches.find(a=>a.touch.identifier == touch.identifier)
+            let pointer = touch_ && touch_.pointer  //复制原先的值
+            return { 
+                touch,   pointer, 
+            }
+        }) 
+        if(e.touches.length > 0){ 
+            Array.from(e.changedTouches).forEach(touch=>{   //修改changedTouches的 
+                let touch_ = this.touches.find(a=>a.touch.identifier == touch.identifier)
+                if(touch_){
+                    var a = this.getPointerInViewport(touch.pageX, touch.pageY, this.dragViewport||viewport, new THREE.Vector2) 
+                    touch_.pointer = a.pointer.clone()
+                    viewport = a.viewport;  camera = a.camera
+                }
+                
+            })
+            
+            this.pointer = this.touches[0].pointer.clone() //更新,使用当前touches中的第一个
+            //console.log('更新pointer1',this.pointer.toArray())
+            return  {viewport,  camera/* , pointer:this.pointer  */}
+        }
+        //console.log(this.touches)
+    }
+    
 	onTouchStart (e) {
 		if (this.logMessages) console.log(this.constructor.name + ': onTouchStart');
 
 		e.preventDefault(); 
-
-		if (e.touches.length === 1) { //changedTouches?
+       
+		if (e.touches.length === 1 || !this.drag) { //!this.drag代表一次性下了两个指头
 			let rect = this.domElement.getBoundingClientRect();
 			let x = e.touches[0].pageX 
-			let y = e.touches[0].pageY  
-			 
-            this.dealPointerDown(x,y,e,true)
-          
-		}
-
+			let y = e.touches[0].pageY   
+            this.dealPointerDown(x,y,e,true) 
+		}else{
+            this.updateTouchesInfo(e)
+        } 
+           
+        
 		
-		this.viewer.dispatchEvent({
-            type: /* "global_"+ */e.type, // global_ 是否加上
-            touches: e.touches,
-            changedTouches: e.changedTouches
-        });
+		this.viewer.dispatchEvent($.extend(  
+            this.getEventDesc(e,true),
+            {
+                type: 'global_' + e.type,
+                changedTouches: e.changedTouches                
+            }
+        )); 
 	
-        
-        //add
-        this.mouseDownMouse = this.mouse.clone()
+        /* console.log('targetTouches :', Array.from(e.targetTouches).map(e=>'| identifier: '+ e.identifier), 
+            'changedTouches :', Array.from(e.changedTouches).map(e=>'| identifier: '+ e.identifier)
+        ) */
+        //console.log('')
 	}
     
     
     
     
+	onTouchMove (e) {
+		if (this.logMessages) console.log(this.constructor.name + ': onTouchMove');
+
+		e.preventDefault();
+        
+		if (e.touches.length === 1) {
+			let rect = this.domElement.getBoundingClientRect();
+			let x = e.touches[0].pageX;
+			let y = e.touches[0].pageY;
+            console.log('onTouchMove touches.length === 1')
+            this.dealPointerMove(x, y, e, true)
+            
+		}else{
+            this.updateTouchesInfo(e)
+        }
+        
+        
+        
+        
+		this.viewer.dispatchEvent($.extend(  
+            this.getEventDesc(e,true),
+            {
+                type: 'global_' + e.type,
+                changedTouches: e.changedTouches                
+            }
+        )); 
+         
+         
+        /* console.log('targetTouches :', Array.from(e.targetTouches).map(e=>'| identifier: '+ e.identifier), 
+            'changedTouches :', Array.from(e.changedTouches).map(e=>'| identifier: '+ e.identifier)
+        ) */
+	}
+    
+    
 
 	onTouchEnd (e) {
 		if (this.logMessages) console.log(this.constructor.name + ': onTouchEnd');
 
 		e.preventDefault();
+        //console.log('onTouchEnd')
+		this.updateTouchesInfo(e) 
 
-		/*  this.viewer.dispatchEvent({
-				type: 'global_drop',
-				drag: this.drag,
-				viewer: this.viewer
-			});
-		 
-
-		this.drag = null;
 
-		 this.viewer.dispatchEvent({
-				type: 'global_' + e.type,
-				touches: e.touches,
-				changedTouches: e.changedTouches
-			}); */
+        
         if (e.touches.length === 0) {
 			let rect = this.domElement.getBoundingClientRect();
 			let x = e.changedTouches[0].pageX   //万一一次松开两个指头的怎么办
 			let y = e.changedTouches[0].pageY  
-			 
+			
             this.dealPointerUp(x,y,e,true)
              
-		}  
-         
-		 
+		}else if(e.touches.length == 1){ 
+            this.drag.end.copy(this.pointer)
+            
+            
+        }  
+        
+        this.viewer.dispatchEvent($.extend(  
+            this.getEventDesc(e,true),
+            {
+                type: 'global_' + e.type, 
+            }
+        ));  
+        console.log('touchend length '+e.touches.length, this.touches.length)
 	}
 
 
@@ -161,64 +228,9 @@ export class InputHandler extends EventDispatcher {
 
 
 
-	onTouchMove (e) {
-		if (this.logMessages) console.log(this.constructor.name + ': onTouchMove');
 
-		e.preventDefault();
-    
-		if (e.touches.length === 1) {
-			let rect = this.domElement.getBoundingClientRect();
-			let x = e.touches[0].pageX;
-			let y = e.touches[0].pageY;
-			//this.mouse.set(x, y);
-            
-            
-            this.dealPointerMove(x, y, e, true)
-            
-            
-            /* var  {  camera, viewport  } = this.getPointerInViewport(x, y ) 
-            this.hoverViewport = viewport
-            if(!viewport)return 
-            
-            
-			if (this.drag) {
-				this.drag.mouse = 1; //why??非左键也非右键的意思?
-
-				this.drag.pointerDelta.set(this.pointer.x - this.drag.end.x, this.pointer.y - this.drag.end.y  );
-				this.drag.end.set(this.pointer.x, this.pointer.y);
-
-				 
-
-				if (this.logMessages) console.log(this.constructor.name + ': drag: ');
-				this.viewer.dispatchEvent({
-						type: 'global_drag',
-						drag: this.drag,
-						viewer: this.viewer
-					});
-				
-			} */
-		}
 
-		/* for (let inputListener of this.getSortedListeners()) {
-			inputListener. */this.viewer.dispatchEvent({
-				type: e.type,
-				touches: e.touches,
-				changedTouches: e.changedTouches
-			});
-		//}
 
-		// DEBUG CODE
-		// let debugTouches = [...e.touches, {
-		//	pageX: this.domElement.clientWidth / 2,
-		//	pageY: this.domElement.clientHeight / 2}];
-		// for(let inputListener of this.getSortedListeners()){
-		//	inputListener.dispatchEvent({
-		//		type: e.type,
-		//		touches: debugTouches,
-		//		changedTouches: e.changedTouches
-		//	});
-		// }
-	}
 
 	onKeyDown (e) {
 		if (this.logMessages) console.log(this.constructor.name + ': onKeyDown');
@@ -299,12 +311,21 @@ export class InputHandler extends EventDispatcher {
 
 
     dealPointerDown(x,y,e,isTouch){
+        e.preventDefault(); 
+        
         //重新获取一下pointer, 因点击了浏览器的按钮展开列表时 move回来不会触发onmousemove,所以pointer是旧的
-        var  {  camera, viewport  } = this.getPointerInViewport(x, y ) 
+        
+        if(isTouch){
+            var  {  camera, viewport  } = this.updateTouchesInfo(e) 
+        }else{
+            var  {  camera, viewport  } = this.getPointerInViewport(x, y ) 
+        }
+        
+        
 		this.hoverViewport = viewport
         if(!viewport)return 
     
-		e.preventDefault(); 
+		
          
         //this.onMouseMove(e)//add 重新获取一下mouse, 因在此前canvas可能失去侦听(不记得是什么了。如果一定要的话再写个加侦听的函数,但是直接调用mousemove的话会发送drag,导致magnifier停止渲染)
         
@@ -350,8 +371,8 @@ export class InputHandler extends EventDispatcher {
 		}
         
          
-        //add
-        this.drag.pointerDragStart = this.pointer.clone()
+       
+       
         this.drag.intersectStart = this.intersectPoint;
         this.mouseDownMouse = this.mouse.clone()
         this.dragViewport = this.hoverViewport;
@@ -370,19 +391,26 @@ export class InputHandler extends EventDispatcher {
 
 
     getEventDesc(e,isTouch){//搜集dispatchEvent要给的一般数据 
-        return {
+        let o = {
             viewer: this.viewer,
             mouse: this.mouse, 
             pointer:this.pointer,
-            drag :this.drag,
-            isAtDomElement: e.target == this.domElement,
+            drag :this.drag,  
             dragViewport : this.dragViewport,
             hoverViewport: this.hoverViewport,
-            button: isTouch ? 0 : e.button,
-            buttons: isTouch ? e.touches.length : e.buttons,
+           // button: isTouch ? 0 : e.button,
             isTouch,
         }
-        
+        if(e){
+            o.isAtDomElement = e.target == this.domElement 
+        } 
+        if(isTouch){
+            o.touches = this.touches 
+        }else if(e){
+            o.button = e.button 
+            o.buttons = e.buttons
+        }
+        return o;
     }
 
 
@@ -496,7 +524,7 @@ export class InputHandler extends EventDispatcher {
 				});
 			} */
             this.drag = null;
-            
+             
 		}
 
         this.dragViewport = null
@@ -534,13 +562,13 @@ export class InputHandler extends EventDispatcher {
 
 
 
-    getPointerInViewport(clientX, clientY, viewForceAt ){
+    getPointerInViewport(clientX, clientY, viewForceAt, pointer ){
         let rect = this.domElement.getBoundingClientRect();
         let x = clientX - rect.left;
         let y = clientY - rect.top;
         let camera 
         let viewport 
-        
+        pointer = pointer ||this.pointer
         //if(this.viewer.viewports || viewForceAt){
             var getDimension = (view)=>{
                 var left = Math.floor(this.domElement.clientWidth * view.left)
@@ -552,7 +580,8 @@ export class InputHandler extends EventDispatcher {
             }
             var getView = (view, left, bottom, width, height, top)=>{
                 this.mouse.set(x-left, y - top )
-                Utils.convertScreenPositionToNDC(this.pointer, this.mouse, width, height);
+                Utils.convertScreenPositionToNDC(pointer, this.mouse, width, height);
+                //console.log('更新pointer2',this.pointer.toArray())
                 camera = view.camera;
                 viewport = view 
             }
@@ -582,13 +611,9 @@ export class InputHandler extends EventDispatcher {
                   
                 
             } 
-        /*} else{
-            camera = this.viewer.scene.getActiveCamera()
-            this.mouse.set(x , y )
-            Utils.convertScreenPositionToNDC(this.pointer, this.mouse, this.domElement.clientWidth, this.domElement.clientHeight);
-        }  */
+       
         return { 
-            camera, viewport 
+            camera, viewport, pointer 
         }
     }
 
@@ -598,8 +623,12 @@ export class InputHandler extends EventDispatcher {
     }
 
     dealPointerMove(x, y, e, isTouch){ 
-    
-        var  {  camera, viewport  } = this.getPointerInViewport(x, y,  this.dragViewport) 
+        if(isTouch){
+            var  {  camera, viewport  } = this.updateTouchesInfo(e) 
+        }else{
+            var  {  camera, viewport  } = this.getPointerInViewport(x, y ,  this.dragViewport) 
+        }
+         
 		this.hoverViewport = viewport
         if(!viewport)return//刚变化viewport时会找不到
         
@@ -609,7 +638,7 @@ export class InputHandler extends EventDispatcher {
 			let names = hoveredElements.map(h => h.object.name).join(", ");
 			if (this.logMessages) console.log(`${this.constructor.name}: onMouseMove; hovered: '${names}'`);
 		}
- 
+        
         //add
         let intersectPoint = viewport.noPointcloud? null : Utils.getMousePointCloudIntersection(
             viewport,
@@ -638,9 +667,9 @@ export class InputHandler extends EventDispatcher {
  
 		if (this.drag) {//有拖拽(不一定拖拽了物体, 也不一定按下了鼠标)
 			this.drag.mouse = isTouch ? 1 : e.buttons; 
-            this.drag.hoverViewport = this.hoverViewport
-            this.drag.pointerDelta.set(this.pointer.x - this.drag.end.x, this.pointer.y - this.drag.end.y  )
-			this.drag.end.set(this.pointer.x, this.pointer.y);
+            this.drag.hoverViewport = this.hoverViewport 
+            this.drag.pointerDelta.subVectors(this.pointer,  this.drag.end)
+			this.drag.end.copy(this.pointer)
             
             
 			if (this.drag.object && (e.buttons == Buttons.NONE || !this.drag.notPressMouse )){//add notPressMouse 如果标记是不需要按鼠标的拖拽,则一旦按下鼠标,就暂停拖拽物体(改为拖拽场景):(如添加测量时突然拖拽画面)
@@ -805,7 +834,13 @@ export class InputHandler extends EventDispatcher {
 		let ndelta = Math.sign(delta);
 
 		// this.wheelDelta += Math.sign(delta);
-
+        
+        
+        if(!this.hoverViewport){//调试手机版时会无
+            var  {   viewport  } = this.getPointerInViewport(e.clientX, e.clientY ) 
+            this.hoverViewport = viewport
+        }
+        
 		if (this.hoveredElement) {
 			this.hoveredElement.object.dispatchEvent($.extend(  
                 this.getEventDesc(e,isTouch),
@@ -841,23 +876,22 @@ export class InputHandler extends EventDispatcher {
             dragViewport :  this.hoverViewport, //开始之后就不会变了
             hoverViewport: this.hoverViewport   //会变化
 		};
-        
-        
-        this.viewer.dispatchEvent({
-            type: "startDragging",
-            drag: this.drag,
-            hoverViewport: this.hoverViewport
-        })
-        /* console.log('startDragging')
-        console.log(this.drag.end) */
-
-
-
-		if (args) {
+        if (args) {
 			for (let key of Object.keys(args)) {
 				this.drag[key] = args[key];
 			}
 		}
+        
+        this.viewer.dispatchEvent($.extend(  
+            this.getEventDesc(/*e ,true */),
+            {
+                type: 'startDragging' 
+            }
+        )); 
+        
+         
+
+		
 	}
 
 	/* getMousePointCloudIntersection (mouse) {
@@ -1065,10 +1099,11 @@ export class InputHandler extends EventDispatcher {
 		return mouseDelta;
 	} */
     
-    getMouseDirection() {//add 
+    getMouseDirection(pointer) {//add 
+        pointer = pointer || this.pointer
 		let camera = this.hoverViewport.camera
-        var t = new THREE.Vector3(this.pointer.x, this.pointer.y, -1).unproject(camera),
-            i = new THREE.Vector3(this.pointer.x, this.pointer.y, 1).unproject(camera);
+        var t = new THREE.Vector3(pointer.x, pointer.y, -1).unproject(camera),
+            i = new THREE.Vector3(pointer.x, pointer.y, 1).unproject(camera);
             
         return {origin: t, direction:i.clone().sub(t).normalize() }    
          

+ 1 - 0
src/viewer/sidebar.html

@@ -291,6 +291,7 @@ Thanks to all the companies and institutions funding Potree:
                 <button name='building'>创建建筑</button>
                 <button name='floor'>添加楼层</button>
                 <button name='room'>创建房间</button>
+                <button name='digHole'>挖洞</button>
             </li> 
             <li name='edit'>
                 <button name='removeLastMarker'>去除最后一个点</button>

+ 7 - 1
src/viewer/sidebar.js

@@ -144,10 +144,16 @@ export class Sidebar{
         pannel.find('button[name="building"] ').on('click', SiteModel.startInsertion.bind(SiteModel,'building'))
         pannel.find('button[name="floor"] ').on('click', ()=>{
             SiteModel.addFloor(SiteModel.buildings[0], SiteModel.buildings[0].buildChildren[0])
-        } )
+        } )  
         pannel.find('button[name="room"] ').on('click', ()=>{
             SiteModel.startInsertion('room', SiteModel.buildings[0].buildChildren[0])
         })
+        /* pannel.find('button[name="digHole"] ').on('click', ()=>{
+            SiteModel.startInsertion('room', SiteModel.buildings[0].buildChildren[0])
+        }) */
+        
+        
+        
         pannel.find('button[name="selectBuilding"] ').on('click', ()=>{
             SiteModel.selectEntity(SiteModel.buildings[0] )
         } )

+ 21 - 3
src/viewer/viewer.js

@@ -82,6 +82,8 @@ export class Viewer extends ViewerBase{
         mapArea = mapArea_
 		//-------------
         
+        this.supportExtFragDepth = !!this.renderer.getContext().getExtension('EXT_frag_depth') ;//iphoneX居然不支持
+        console.log('this.supportExtFragDepth ',this.supportExtFragDepth)
         
         
 		this.guiLoaded = false;
@@ -420,7 +422,23 @@ export class Viewer extends ViewerBase{
 			this.onCrash(e);
 		}
         
-        {//add
+        //-----------------------add----------------------------------------------------
+        
+        
+        {
+            let ratio
+            this.addEventListener('resize',(e)=>{
+                if(ratio != e.deviceRatio){ //因为devicePixelRatio会影响到点云大小,所以改变时计算下点云大小
+                    viewer.scene.pointclouds.forEach(p => {
+                        p.changePointSize()
+                    })
+                }
+                ratio = e.deviceRatio
+                
+            }) 
+        }
+        
+        { 
             let pointDensity = ''
             Object.defineProperty(Potree.settings , "pointDensity",{ 
                 get: function() {
@@ -508,7 +526,7 @@ export class Viewer extends ViewerBase{
             
         }
         
-        
+         
 	}
 
     
@@ -2379,7 +2397,7 @@ export class Viewer extends ViewerBase{
 		 
 	}
 
-
+    
 
 	renderDefault(params_={}){
 		let pRenderer = this.getPRenderer();

+ 2 - 2
src/viewer/viewerBase.js

@@ -165,14 +165,14 @@ export class ViewerBase extends EventDispatcher{
                 view.camera.updateProjectionMatrix();
             })
         }
-        this.emitResizeMsg({viewport:this.viewports[0]})
+        this.emitResizeMsg({viewport:this.viewports[0],  deviceRatio:devicePixelRatio})
 		//this.emitResizeMsg({resolution:this.viewports[0].resolution2, left:this.viewports[0].left, bottom:this.viewports[0].bottom}) //如果多个的话,render时会一直发送的
        
     } 
     
     emitResizeMsg(e){//切换viewport渲染时就发送一次, 通知一些材质更新resolution。  
         if(!e.viewport.resolution.equals(this.oldResolution)){ 
-            this.dispatchEvent({viewport:e.viewport, type:'resize'})
+            this.dispatchEvent($.extend(e, {type:'resize'})) 
         }
         this.oldResolution.copy(e.viewport.resolution)