xzw 1 năm trước cách đây
mục cha
commit
9b482861eb

+ 214 - 120
public/static/lib/potree/potree.js

@@ -71226,7 +71226,7 @@ void main()
 	                    
 	                    
 	                    
-	                    let r1 = Potree.Utils.getPos2d(center, camera, viewer.renderArea, e.viewport); 
+	                    let r1 = Potree.Utils.getPos2d(center, e.viewport, viewer.renderArea ); 
 	                    if(!r1.trueSide)return  Potree.Utils.updateVisible(this, 'unableCompute', false);// 但这句会使realVisible为false从而无法更新//console.error('!r1.trueSide') //中心点如果在背面直接不渲染了
 	                        
 	                    let r2, point2;
@@ -71235,7 +71235,7 @@ void main()
 	                    while(p2State != 'got' && p2StateHistory.length<10){ 
 	                        point2 = center.clone().add(lineDir.clone().multiplyScalar(len));
 	                         
-	                        r2 = Potree.Utils.getPos2d(point2, camera, viewer.renderArea, e.viewport);  
+	                        r2 = Potree.Utils.getPos2d(point2, e.viewport, viewer.renderArea);  
 	                        if(!r2.trueSide){ //很少遇到点2在背面的
 	                            if(!p2StateHistory.includes('tooLong-reverse')){
 	                                p2State = 'tooLong-reverse';  //先尝试反向
@@ -73440,13 +73440,12 @@ void main()
 
 	    return ray;
 	};
-
-	Utils.getPos2d = function(point, camera, dom, viewport){//获取一个三维坐标对应屏幕中的二维坐标
+	Utils.getPos2d = function(point, viewport , dom  ){//获取一个三维坐标对应屏幕中的二维坐标
 	    var pos;
-	    if(math.closeTo(camera.position, point, 1e-5) ){ //和相机位置重合时显示会四处飘,看是要改成一直显示中间还是隐藏?
+	    if(math.closeTo(viewport.camera.position, point, 1e-5) ){ //和相机位置重合时显示会四处飘,看是要改成一直显示中间还是隐藏?
 	        pos = new Vector3(0,0,1.5); //1.5是为了不可见
 	    }else { 
-	        pos = point.clone().project(camera);	//比之前hotspot的计算方式写得简单  project用于3转2(求法同shader); unproject用于2转3 :new r.Vector3(e.x, e.y, -1).unproject(this.camera);
+	        pos = point.clone().project(viewport.camera);	//比之前hotspot的计算方式写得简单  project用于3转2(求法同shader); unproject用于2转3 :new r.Vector3(e.x, e.y, -1).unproject(this.camera);
 	    }
 	    
 	    
@@ -75757,7 +75756,7 @@ void main()
 	    //showCompass : isTest,
 	    showAxis : isTest,
 	    //testCube : true,
-	    
+	    //adsorption:true, 
 	};
 	  
 	 
@@ -81149,7 +81148,7 @@ void main()
 	     
 	    update(){
 	        if(!this.position || this.elem.hasClass('unvisible'))return
-	        var p = Utils.getPos2d(this.position,this.camera,this.dom, viewer.mainViewport);
+	        var p = Utils.getPos2d(this.position,viewer.mainViewport,this.dom );
 	        if(!p.trueSide){
 	            this.elem.addClass("hide");  return;
 	        }
@@ -82069,7 +82068,7 @@ void main()
 	        //addMarkers:
 	       
 	        this.initData(prop);
-	        
+	        this.pointsPos2d = new Map; //屏幕上的二维坐标
 	         
 	        this.points_datasets || (this.points_datasets = []); //存每个点是哪个数据集
 
@@ -82368,10 +82367,16 @@ void main()
 	        marker.pickOrder = marker.renderOrder = 6; 
 	        marker.markerSelectStates = {}; 
 	        marker.addEventListener('startDragging',(e)=>{
-	            if(e.drag.dragViewport.name == 'MainView')viewer.inputHandler.dispatchEvent( {type: 'isMeasuring',v:true, cause:'startDragging'});
+	            viewer.inputHandler.dispatchEvent( {type: 'measuring',v:true, cause:'startDragging', situation:'dragging', object:this});
 	        });
 	        marker.addEventListener('drop',(e)=>{
-	            viewer.inputHandler.dispatchEvent({type: 'isMeasuring',  v:false, cause:'stopDragging'}  );
+	            viewer.inputHandler.dispatchEvent({type: 'measuring',  v:false, cause:'stopDragging', situation:'dragging', object:this}  );
+	            
+	            if(Potree.settings.adsorption){
+	                this.isNew || viewer.viewports.forEach((viewport)=>{
+	                    this.getPointsPos2d(viewport, true );//forceUpdate
+	                });  
+	            }
 	        });
 	        marker.measure = this;
 	        let edge;
@@ -82490,9 +82495,9 @@ void main()
 	        
 	        if(this.measureType == 'MulDistance_shape'){ 
 	            if(state == 'hover' && hoverObject == 'single'){
-	                marker.material = this.getMarkerMaterial('select'); //路径选中后marker是非选中状态, 但是颜色一样
+	                marker.material = this.getMarkerMaterial('select'); 
 	            }else {
-	                marker.material = this.getMarkerMaterial('default');
+	                marker.material = this.getMarkerMaterial('default'); //路径选中后marker是非选中状态, 但是颜色一样
 	            }  
 	             
 	        }else {
@@ -83022,7 +83027,26 @@ void main()
 			intersects.sort(function (a, b) { return a.distance - b.distance; });
 		};
 
-	    
+	    getPointsPos2d(viewport, update){//获取屏幕上的二维坐标
+	        let ps = this.pointsPos2d.get(viewport); 
+	        if(update || !ps){
+	            let points = this.points.slice();
+	            if(this.measureType == 'MulDistance_shape'){
+	                points.push(this.getCenter()); //中心点吸附
+	            }
+	            points = points.map(e=>{
+	                let p = Potree.Utils.getPos2d(e,  viewport, viewer.renderArea );
+	                p.pos3d = e.clone(),  p.object = this;
+	                return p
+	            }); 
+	            
+	            
+	            this.pointsPos2d.set(viewport, points);
+	            console.log('updatePointsPos2d',this.uuid,viewport.name);
+	        }
+	        
+	        return this.pointsPos2d.get(viewport) 
+	    }
 	    
 	    
 	    transformData(prop){
@@ -83161,8 +83185,8 @@ void main()
 	            this.area = {value:0};
 	            this.areaLabel && this.areaLabel.setVisible(false);
 	        }
-	        viewer.inputHandler.dispatchEvent( {type:'isMeasuring', v:true, cause:'reDraw'}  );
-		            
+	        viewer.inputHandler.dispatchEvent( {type:'measuring', v:true, cause:'reDraw',object:this, situation:'dragging'}  );
+		             
 	    }
 	    
 
@@ -83636,7 +83660,7 @@ void main()
 			}
 			 
 	        viewer.addEventListener('camera_changed',(e)=>{ 
-	            if(e.viewport == viewer.mainViewport ) this.update();
+	             this.update(e);
 	        });
 	        
 	        
@@ -83651,7 +83675,23 @@ void main()
 	        
 	        
 	        
-	        
+	        let texLoader = new TextureLoader();  
+	        if( Potree.settings.adsorption ){
+	            this.sorptionSign = new Sprite$2({mat:new DepthBasicMaterial({ 
+	                transparent: !0,
+	                opacity: 1,
+	                map: texLoader.load(Potree.resourcePath+'/textures/pic_point_s32.png' ), 
+	                replaceColor:new Color(Potree.config.measure.default.color),
+	                beReplacedRed: 0.184, 
+	                mapColorReplace:true,
+	            }), sizeInfo:   {
+	                width2d:30,
+	            }, name:"sorptionSign"} );
+	            viewer.scene.scene.add(this.sorptionSign); 
+	            this.sorptionSign.visible = false;
+	            //Potree.Utils.setObjectLayers(this.sorptionSign, 'measure' )
+	       
+	        }
 	        
 	        
 	        
@@ -83689,8 +83729,17 @@ void main()
 	    }
 	    
 	    
-		update(){ 
+		update(e){ 
 	        //add
+	        
+	        if(viewer.inputHandler.measuring && Potree.settings.adsorption){
+	            viewer.scene.measurements.forEach(measure=>{
+	                measure.getPointsPos2d(e.viewport, true); 
+	            });
+	            
+	        }
+	        
+	        
 	        viewer.scene.measurements.forEach(measure=>{
 	            
 	            let lastIndex = measure.points.length - 1; 
@@ -83978,7 +84027,7 @@ void main()
 	                type : "CursorChange", action : "remove",  name:"polygon_AtWrongPlace"
 	            });
 	            
-	            viewer.inputHandler.dispatchEvent({type:'isMeasuring',  v:false, cause:'stopInsertion'}  ); 
+	            viewer.inputHandler.dispatchEvent({type:'measuring',  v:false, cause:'stopInsertion', situation:'adding', object:measure}  ); 
 	            viewer.controls.setEnable(true); 
 	            
 	            //var isIntersectSelf = measure.atPlane && measure.closed && !measure.isRect && measure.point2dInfo && measure.intersectSelf(measure.point2dInfo.points2d.slice(0,measure.point2dInfo.points2d.length-1))//检测除了最后一个点的相交情况
@@ -84054,7 +84103,7 @@ void main()
 	          
 	            if(ifAtWrongPlace(e))return  
 	            if(e.clickElement || e.drag.object)return  //如点击label时focusOnObject, 或拖拽marker
-	            measure.focus({dontMoveCamera:true});
+	            measure.measureType == 'MulDistance_shape' &&  measure.focus({dontMoveCamera:true}); //多路径变为选中态
 
 
 	            
@@ -84123,7 +84172,7 @@ void main()
 	        
 	        //点击第n下拥有n+1个marker, n>0
 	        
-	        viewer.inputHandler.dispatchEvent({type: 'isMeasuring', v: true, cause:'startInsertion'});
+	        viewer.inputHandler.dispatchEvent({type: 'measuring', v: true, cause:'startInsertion', situation:'adding', object:measure});
 	        
 	            
 	        if( isMobile ){
@@ -89359,7 +89408,6 @@ void main()
 	 *
 	 */
 
-
 	let {Buttons} = Potree.defines;
 
 	class InputHandler extends EventDispatcher {
@@ -89437,12 +89485,28 @@ void main()
 	          
 	        
 	        {
-	            this.addEventListener('isMeasuring',(e)=>{ 
-	                //console.log('isMeasuring',e.v,e.cause)
-	                this.isMeasuring = e.v; 
+	            this.measuring = []; //正在编辑的measure
+	            //let mesureInfo = new THREE.EventDispatcher()
+	            this.addEventListener('measuring',(e)=>{ 
+	                //true优先级高于false, 正在添加时dropMarker也不会停止
+	                
+	                //Potree.Utils.updateVisible(mesureInfo, e.situation,  e.v, 0, e.v?'add':'cancel' )//借用该函数,使true优先级高于false,防止正在添加时dropMarker而停止
+	                if(e.v){
+	                    this.measuring.includes(e.object) || this.measuring.push(e.object);
+	                }else {
+	                    let index = this.measuring.indexOf(e.object);
+	                    index > -1 && this.measuring.splice(index, 1);
+	                }
+	                 
+	                if(this.measuring.length == 0 && this.measuring.length>0   ){
+	                    this.viewer.viewports.forEach((viewport)=>{
+	                        this.collectClosePoints(viewport, true );//forceUpdate
+	                    }); 
+	                } 
+	                //console.log('measuring',e.v, e.cause, e.situation, this.measuring.length )
 	            }); 
 	        }
-	        
+	             
 	        window.viewer.addEventListener('loopStart',()=>{
 	            this.interactHistory = {};  //清空
 	        });
@@ -89755,7 +89819,7 @@ void main()
 	        //if(isTouch || !Potree.settings.intersectWhenHover ){ 
 	        if(isTouch || !this.dragViewport.view.isFlying()){ 
 	            this.hoveredElements = this.getHoveredElements(); 
-	            this.intersect = this.getIntersect(viewport); //更新intersect,避免在没有mousemove但flyToPano后intersect未更新。
+	            this.intersect = this.getIntersect({viewport, clientX:e.clientX, clientY:e.clientY}); //更新intersect,避免在没有mousemove但flyToPano后intersect未更新。
 	            //this.intersect = this.getWholeIntersect()  
 	        } //isTouch必须更新 否则是旧的
 	        if(!viewport)return //why add this?
@@ -90115,47 +90179,64 @@ void main()
 
 
 	    ifBlockedByIntersect({point, margin=0, cameraPos, pickWindowSize, pano, useDepthTex}={}){//某点是否被遮挡(不允许camera修改位置, 因为depthTex不好置换)
-	          
-	        let intersect = this.getIntersect(this.hoverViewport, true, pickWindowSize, null, null, useDepthTex, {point, cameraPos, pano});
-	        let cameraPos_ = (!cameraPos && pano) ? pano.position : (cameraPos||this.hoverViewport.view.position);
+	        viewport = viewport || this.hoverViewport || viewer.mainViewport;
+	        let intersect = this.getIntersect({viewport, onlyGetIntersect:true, pickWindowSize,  useDepthTex,  point, cameraPos, pano });
+	        let cameraPos_ = (!cameraPos && pano) ? pano.position : (cameraPos||viewport.view.position);
 	        if(intersect && intersect.distance+margin <= point.distanceTo(cameraPos_)){
 	            return intersect //被遮挡
 	        }
 	        //点云模式,对没加载出的点云不准确。 尤其是需要修改相机位置时,因临时修改并不能使点云加载。
 	    }
 
-
-
-	    getIntersect(viewport,   onlyGetIntersect, pickWindowSize, dontIntersect, usePointcloud, useDepthTex, prop={}){// usePointcloud:必须使用点云
-	        let intersectPoint;  
+	    collectClosePoints(viewport, forceUpdate){//获取吸附点
+	        if(!Potree.settings.adsorption)return
+	    
+	        let point2ds = [];
+	        
+	        //吸附测量线端点
+	        
+	        viewer.scene.measurements.forEach(e=>{
+	            if(this.measuring.includes(e)) return//不吸附到正在拖拽的自身
+	            point2ds.push(...e.getPointsPos2d(viewport, forceUpdate));
+	        });
+	        viewer.fixPoints; 
+	        
+	        return point2ds
+	        
+	        
+	    }
+	    getIntersect({viewport, onlyGetIntersect, pickWindowSize, dontIntersect, usePointcloud, useDepthTex,  cameraPos,  point, pano, clientX, clientY}={}){// usePointcloud:必须使用点云
+	        let intersect, intersectPoint, intersectOnModel, allElements; 
 	        let camera = viewport.camera;
 	        let raycaster; 
-	        
+	         
+	       
 	        viewer.addTimeMark('getIntersect','start');
 	 
 	        let getByDepthTex = ()=>{ 
 	            let intersect;
-	            if(prop.point){
-	                let cameraPos = prop.pano ? prop.pano.position : camera.position;
-	                let dir = new Vector3().subVectors(prop.point, cameraPos).normalize(); 
+	            if(point){
+	                let cameraPos = pano ? pano.position : camera.position;
+	                let dir = new Vector3().subVectors(point, cameraPos).normalize(); 
 	                intersect = {dir}; 
 	            }else {
 	                intersect = Utils.getIntersect(camera, [viewer.images360.cube], this.pointer, raycaster); 
 	            } 
-	            intersectPoint = viewer.images360.depthSampler.sample(intersect, prop.pano, !!prop.point);  //可能不准确, 因pano可能未加载depthTex
+	            intersectPoint = viewer.images360.depthSampler.sample(intersect, pano, !!point);  //可能不准确, 因pano可能未加载depthTex
 	            if(intersectPoint && Potree.settings.depTexLocBindDataset){
-	                intersectPoint.pointcloud = (prop.pano || viewer.images360.currentPano).pointcloud;
+	                intersectPoint.pointcloud = ( pano || viewer.images360.currentPano).pointcloud;
 	                //在全景模式下,虽然深度图上的点可能对应别的pointcloud,但因为是在当前全景图处得到的,所以即使将原本对应的点云移走,该点也不移动是有道理的。它可以永远跟着该全景图。
 	            }
 	        };
 	        
-	        let getByCloud = ()=>{
-	            if(prop.point){//指定了目标点,而非只是用pointer所在位置
-	                prop.cameraPos && camera.position.copy(prop.cameraPos);
-	                camera.lookAt(prop.point);
+	        let getByCloud = ()=>{ 
+	            let pointer, mouse;
+	            if(point){//指定了目标点,而非只是用pointer所在位置
+	                cameraPos && camera.position.copy( cameraPos);
+	                camera.lookAt(point);
 	                camera.updateMatrixWorld();
-	                prop.pointer = this.pointer.clone();
-	                prop.mouse = this.mouse.clone();
+	                pointer = this.pointer.clone();
+	                mouse = this.mouse.clone();
 	                this.pointer.set(0,0);   //画布中心
 	                this.mouse.set(Math.round(viewport.resolution.x/2), Math.round(viewport.resolution.y/2));
 	            } 
@@ -90167,80 +90248,100 @@ void main()
 	                camera, 
 	                this.viewer, 
 	                this.viewer.scene.pointclouds,
-	                {pickClipped: true, isMeasuring: this.isMeasuring, pickWindowSize, cameraChanged: !!prop.point }  
+	                {pickClipped: true, measuring: this.measuring.length>0, pickWindowSize, cameraChanged: !!point }  
 	                
 	            );
 	            
 	        
 	            //恢复
-	            if(prop.point){
+	            if(point){
 	                viewport.view.applyToCamera(camera);
-	                this.pointer.copy(prop.pointer);
-	                this.mouse.copy(prop.mouse);
+	                this.pointer.copy(pointer);
+	                this.mouse.copy(mouse);
 	            }  
 	        };
 	        
+	        if(this.measuring.length && Potree.settings.adsorption ){//吸附
+	            let points = this.collectClosePoints(viewport);
+	            
+	            let points2 = points.filter(e=>e.trueSide && e.inSight 
+	               &&  math.closeTo(this.mouse, e.posInViewport, Potree.config.measure.adsorptMinDis)
+	            );
+	            
+	            let disArr = points2.map(e=> e.pos.distanceToSquared(this.mouse)  );
+	             
+	            let min = points2.slice().sort((a,b)=>disArr[points.indexOf(a)] - disArr[points.indexOf(b)]);
+	            if(min[0]){
+	                intersect = {
+	                    //hoveredElement  
+	                    location: min[0].pos3d,
+	                    //point: {normal: allElements[0].face.normal },
+	                    //normal 
+	                    //distance 
+	                    object: min[0].object,
+	                    adsorption:true
+	                };
+	                console.log('找到吸附点',    min[0].pos3d, min[0].object.uuid);
+	            } 
+	        } 
 	        
-	        
-	        let canUseDepthTex = !Potree.settings.unableUseDepTexPick && (Potree.settings.displayMode == 'showPanos' || useDepthTex)
-	            && viewer.images360.currentPano.pointcloud.hasDepthTex && viewport == viewer.mainViewport && !usePointcloud; 
-	        
-	        
-	        /* if(canUseDepthTex)getByDepthTex()
-	        else getByCloud()  */
-	        if(canUseDepthTex && !this.isMeasuring){
-	            getByDepthTex();
-	        }else {
-	            getByCloud(); 
-	            /* if(!intersectPoint && canUseDepthTex  ){  //若在测量,先尝试点云,再用全景 //后来发现有深度图的点云全景visibleNode为空,pick不到的//如果允许的话,裁剪掉的点云也会得到intersect
-	                getByDepthTex()
-	            } */
-	        }  
-	        
+	        if(!intersect){
+	            let canUseDepthTex = !Potree.settings.unableUseDepTexPick && (Potree.settings.displayMode == 'showPanos' || useDepthTex)
+	                && viewer.images360.currentPano.pointcloud.hasDepthTex && viewport == viewer.mainViewport && !usePointcloud; 
+	            
+	            
+	            /* if(canUseDepthTex)getByDepthTex()
+	            else getByCloud()  */
+	            if(canUseDepthTex && !this.isMeasuring){
+	                getByDepthTex();
+	            }else {
+	                getByCloud(); 
+	                /* if(!intersectPoint && canUseDepthTex  ){  //若在测量,先尝试点云,再用全景 //后来发现有深度图的点云全景visibleNode为空,pick不到的//如果允许的话,裁剪掉的点云也会得到intersect
+	                    getByDepthTex()
+	                } */
+	            }  
+	            
 	        
 	                   
 
 	         
 	        //console.log(viewport.name , intersectPoint &&  intersectPoint.location )
-	        let intersect;
-	        let intersectOnModel, allElements;
-	       
 	        
-	        if(Potree.settings.intersectOnObjs && !dontIntersect){
-	            if(prop.point){
-	                raycaster = new Raycaster(); 
-	                var dir = new Vector3().subVectors(prop.point, camera.position).normalize();
-	                raycaster.set(camera.position, dir); //var origin = new THREE.Vector3(pointer.x, pointer.y, -1).unproject(camera),
-	            }  
-	            
-	            
-	            allElements = this.getHoveredElements(viewer.objs.children, true, raycaster);
-	            
-	            
-	            if(allElements[0]){
-	                intersectOnModel = {//模拟点云的intersectPoint的结构写法
-	                    hoveredElement : allElements[0] ,
-	                    location: allElements[0].point,
-	                    //point: {normal: allElements[0].face.normal },
-	                    normal: allElements[0].face && allElements[0].face.normal,
-	                    distance: allElements[0].distance,
-	                    object: allElements[0].object
-	                }; 
+	            if(Potree.settings.intersectOnObjs && !dontIntersect){
+	                if(point){
+	                    raycaster = new Raycaster(); 
+	                    var dir = new Vector3().subVectors(point, camera.position).normalize();
+	                    raycaster.set(camera.position, dir); //var origin = new THREE.Vector3(pointer.x, pointer.y, -1).unproject(camera),
+	                }  
+	                
+	                
+	                allElements = this.getHoveredElements(viewer.objs.children, true, raycaster);
+	                
+	                
+	                if(allElements[0]){
+	                    intersectOnModel = {//模拟点云的intersectPoint的结构写法
+	                        hoveredElement : allElements[0] ,
+	                        location: allElements[0].point,
+	                        //point: {normal: allElements[0].face.normal },
+	                        normal: allElements[0].face && allElements[0].face.normal,
+	                        distance: allElements[0].distance,
+	                        object: allElements[0].object
+	                    }; 
+	                }
+	                
+	                 
 	            }
 	            
-	             
-	        }
-	        
-	        if(intersectPoint && intersectOnModel){
-	            if(intersectPoint.distance < intersectOnModel.distance){
-	                intersect = intersectPoint;
+	            if(intersectPoint && intersectOnModel){
+	                if(intersectPoint.distance < intersectOnModel.distance){
+	                    intersect = intersectPoint;
+	                }else {
+	                    intersect = intersectOnModel;
+	                } 
 	            }else {
-	                intersect = intersectOnModel;
-	            } 
-	        }else {
-	            intersect = intersectOnModel || intersectPoint;
-	        }                
-	          
+	                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朝外   
@@ -90328,30 +90429,20 @@ void main()
 	            let dontIntersect =  this.drag && viewport.alignment || isFlying; /* viewer.images360.flying */ // flying 时可能卡顿
 	            //console.log('dontIntersectPointcloud',dontIntersectPointcloud)
 	               
-	            intersect = this.getIntersect(viewport,  e.onlyGetIntersect, e.pickWindowSize, !!dontIntersect, e.whichPointcloud || e.usePointcloud || this.drag); //深度图不准,尽量用点云
+	            intersect = this.getIntersect(Object.assign({}, e, {viewport,  dontIntersect, clientX:e.clientX, clientY:e.clientY })); //数据集多的时候卡顿
 	             
 		                 
 	            //console.log('intersectPoint', intersectPoint)
 	        } 
 	        
 	        if(e.onlyGetIntersect){ 
-	            /* if(Potree.settings.intersectOnObjs){
-	                let hoveredElements = this.getHoveredElements() //应该不用发送mouseover事件吧
-	                let intersect = this.getWholeIntersect(hoveredElements, intersectPoint)
-	                return intersect
-	            }
-	         
-	            return intersectPoint */
+	          
 	            return intersect
 	        }
 	        e.preventDefault();
 	         
 	        
-	        /* if(intersectPoint && intersectPoint.pointcloud){
-	            console.log(intersectPoint.pointcloud.name)
-	        } */
-	            
-	        
+	       
 	        if (this.drag) {//有拖拽(不一定拖拽了物体, 也不一定按下了鼠标)
 	            this.drag.mouse = isTouch ? 1 : e.buttons; 
 	            //add:
@@ -90683,7 +90774,7 @@ void main()
 	                    }
 	                });
 	            }  
-			}  
+			}else interactables = interactables.filter(e=>e.visible);
 			 
 			let camera = this.hoverViewport.camera;
 	        if(!raycaster){ 
@@ -90708,7 +90799,7 @@ void main()
 	        //this.hoverViewport.beforeRender && this.hoverViewport.beforeRender()
 	        
 	        viewer.dispatchEvent( {type:'raycaster',  viewport: this.hoverViewport});//add
-			let intersections = raycaster.intersectObjects(interactables.filter(o => o.visible), true, null, true); //原本是false 检测不到children
+			let intersections = raycaster.intersectObjects(interactables , true, null, true); //原本是false 检测不到children
 	    
 	        let intersectionsCopy = intersections.slice();
 	        
@@ -98356,12 +98447,14 @@ ENDSEC
 	            return this.depthSampler.sample( {dir }, pano, true )
 	        }else {
 	            origin = origin || pano.position;
-	            return viewer.inputHandler.getIntersect(viewer.inputHandler.hoverViewport, true, null, null, true, {
+	            return viewer.inputHandler.getIntersect({
+	                viewport:viewer.inputHandler.hoverViewport, 
+	                onlyGetIntersect:true,  usePointcloud:true, 
 	                point: origin.clone().add(dir),
 	                cameraPos: origin
 	            })
 	        }
-	    }                           
+	    } 
 	                             
 	                                 
 	                                        
@@ -104174,7 +104267,7 @@ ENDSEC
 	         
 	        //自身位置 
 	        //let pos2d = viewer.inputHandler.pointer.clone();   //跟随鼠标 
-	        let pos2d = Potree.Utils.getPos2d(aimPos, playerCamera, viewer.renderArea, viewer.mainViewport).vector;   //更新目标点的实时二维位置
+	        let pos2d = Potree.Utils.getPos2d(aimPos, viewer.mainViewport, viewer.renderArea  ).vector;   //更新目标点的实时二维位置
 	        let margin = 0.4, maxY = 0.4;
 	        let screenPos = pos2d.clone().setY(pos2d.y + (pos2d.y>maxY ? -margin : margin ));
 	        
@@ -134732,6 +134825,7 @@ ENDSEC
 	            
 	            
 	            
+	            
 	            //-----------
 	            CursorDeal.init(this, this.mapViewer ? [this, this.mapViewer] : [this]);//ADD
 	           

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 1
public/static/lib/potree/potree.js.map


+ 27 - 13
src/sdk/laser/core/enter.js

@@ -122,6 +122,13 @@ var enter = ({
                 meterPerPixel,
             });
         }
+        
+        viewer.fixPoints.forEach(point=>{
+            point.pos2d = Potree.Utils.getPos2d(point, e.viewport, viewer.renderArea )
+        })
+        
+        
+        
     };
     viewer.addEventListener("camera_changed", cameraChange);
     viewer.addEventListener("shelterComputed", () => {
@@ -252,7 +259,7 @@ var enter = ({
         }); */
 
         measure.addEventListener("selected", (e) => {
-            bus.emit("selected", e.state);
+            bus.emit(isShape ? "selectMeasure":"selected", e.state) 
         });
 
 
@@ -503,7 +510,7 @@ var enter = ({
                 var dom = viewer.renderArea;
                 //Potree.Log('getScreenByPoint scene' , pos3d.toArray(), {font:{toFixed:2,fontSize:10}})
 
-                return Potree.Utils.getPos2d(pos3d, camera, dom, viewport);
+                return Potree.Utils.getPos2d(pos3d, viewport, dom );
             },
             getPointByScreen(pos2d) {
                 //获取当前画面鼠标所在位置的三维点(必须是点云点)
@@ -522,6 +529,8 @@ var enter = ({
                     //不使用当前鼠标所在位置的intersect,单独算
                     if (!pos2d) {
                         // needReGet
+                        intersect = Handler.getIntersect({viewport:Handler.hoverViewport, onlyGetIntersect:true, usePointcloud: true}) //数据集多的时候卡顿
+                         
                         intersect = Handler.getIntersect(
                                 Handler.hoverViewport,
                                 true,
@@ -733,7 +742,9 @@ var enter = ({
                 console.log('createFixPoint',measure, graph, pos, basePoint)
                 const bus = mitt(); 
                 let measureFun, fixPoint 
-   
+                let baseLineChanged = ()=>{
+                    updateMeasureForPoint(fixPoint)
+                }
                 if(graph){ //多线段
                     let info = {
                         measureType : 'MulDistance_shape', color : pointMeasureColor
@@ -746,7 +757,7 @@ var enter = ({
                         },
                         () => { 
                             bus.emit("quit", ret); //删除
-                        });
+                        }); 
                     }else{ 
                         info.points = graph;  
                         info.sid = Math.random()//sid;
@@ -756,24 +767,27 @@ var enter = ({
                     
                     measureFun = getMeasureFunction(measure, bus, true) 
                     //和普通MulDistance不同点:选中才能拖拽 非选中时不展示marker (clickSelected);选中后marker是非选中状态, 但是颜色一样
-                    
+                    //https://lanhuapp.com/web/#/item/project/stage?tid=de3e5e3e-a489-4b19-862a-7c87ce113467&pid=fa4ff928-d61e-438a-b8ee-f848048b7f52
                     
                 }else{
-                    fixPoint = new THREE.Vector3().copy(pos) 
-                    THREE.EventDispatcher.call(fixPoint) 
+                    fixPoint = new THREE.Vector3().copy(pos)  
                     fixPoint.bus = bus
                     fixPoint.basePoint = new THREE.Vector3().copy(basePoint)
-                      
+                    fixPoint.pos2d = Potree.Utils.getPos2d(fixPoint, viewer.mainViewport, viewer.renderArea )
+                    
                     if(measure){ 
                         createMeasureForPoint(fixPoint) 
                     }
-                    viewer.fixPoints.push(fixPoint)
+                    viewer.fixPoints.push(fixPoint) 
+                    viewer.addEventListener('baseLineChanged',baseLineChanged) 
+
+                    
+                    
                 }
                  
-                let baseLineChanged = ()=>{
-                    updateMeasureForPoint(fixPoint)
-                } 
-                viewer.addEventListener('baseLineChanged',baseLineChanged)  
+                
+
+                
                 const ret = {  
                     bus,
                     destroy : measureFun ? measureFun.clear : ()=>{