xzw 1 rok temu
rodzic
commit
f16b149cfd

+ 8 - 3
libs/three.js/3dtiles/three-loader-3dtiles.esm.js

@@ -41,9 +41,14 @@ const maxDepth = 100
 function getGpuMemoryUsage(win = window){//总的
     let c = 0
     viewer.objs.children.filter(e=>{
-        if(e.fileType == '3dTiles'){
-            let tileset3D = e.runtime.getTileset()
-            c += tileset3D.gpuMemoryUsageInBytes
+        if(e.fileType == '3dTiles'){ 
+           e.traverse(child=>{
+                if(child.runtime){
+                    let tileset3D = child.runtime.getTileset()
+                    c += tileset3D.gpuMemoryUsageInBytes
+                    return {stopContinue:true} 
+                }
+            }) 
         }
     })
     

+ 8 - 1
src/ExtendPointCloudOctree.js

@@ -22,6 +22,11 @@ export class ExtendPointCloudOctree extends PointCloudOctree{
         this.boundingBox = this.pcoGeometry.tightBoundingBox//this.pcoGeometry.boundingBox;  //boundingBox是正方体,所以换掉
 		this.boundingSphere = this.boundingBox.getBoundingSphere(new THREE.Sphere());
         this.nodeMaxLevel = 0;//add
+        if (!this.pcoGeometry.loader.version.equalOrHigher('1.5')) {//las 一级一级增长的,但是testNodeMaxLevel时需要大于0
+            this.nodeMaxLevel = 1;//add
+        }
+        
+        
         this.maxLevel = Infinity;
         this.temp = { sizeFitToLevel:{}, opacity:{}}//add
         //add 
@@ -78,7 +83,9 @@ export class ExtendPointCloudOctree extends PointCloudOctree{
              
              console.log('updateNodeMaxLevel ' + this.dataset_id + " : "+ this.nodeMaxLevel)                
               
-            this.setPointLevel()//重新计算
+            setTimeout(()=>{
+               this.setPointLevel()//重新计算    延迟是因为testNodeMax会变回旧的
+            },1)
              
             if(!Potree.settings.sizeFitToLevel){
                 this.changePointSize() 

+ 1 - 0
src/PointCloudOctreeGeometry.js

@@ -133,6 +133,7 @@ export class PointCloudOctreeGeometryNode extends PointCloudTreeNode{
 				this.loadPoints();
 			}
 		} else {
+            this.pcoGeometry.dispatchEvent({type:'updateNodeMaxLevel',level:this.level});//add
 			this.loadPoints();
 		}
 	}

+ 3 - 0
src/Potree.js

@@ -2,6 +2,9 @@
 //export * from "./Potree_update_visibility.js";  //因加载顺序问题,该文件直接在shim中重写
 export * from "./custom/start.js";
 export {settings, config} from './custom/settings.js'  
+export * from './custom/viewer/map/MapViewer.js'  
+   
+   
    
 export * from "./Actions.js"; 
 export * from "./Annotation.js";

+ 47 - 0
src/custom/modules/mergeModel/MergeEditor.js

@@ -654,6 +654,7 @@ let MergeEditor = {
         
         model.lastMatrixWorld = model.matrixWorld.clone()
         viewer.dispatchEvent('content_changed')
+        viewer.mapViewer && Potree.settings.showObjectsOnMap && viewer.mapViewer.dispatchEvent('content_changed')
     },
     
     
@@ -765,6 +766,52 @@ let MergeEditor = {
         
         
     },
+    
+    
+    setGroundPlaneImg(src,scale){//设置地面图
+        
+        this.goundScale = scale
+        let oldSrc = this.curGroundImgSrc
+        this.curGroundImgSrc = src
+        const ratio = 0.04
+        
+        
+        if(src){
+            if(oldSrc == src && this.groundPlane.material.map.image){ //仅修改大小
+                const s = ratio * this.goundScale
+                let {width, height} = this.groundPlane.material.map.image
+                this.groundPlane.scale.set(width*s, height*s)  
+                viewer.dispatchEvent('content_changed')
+                
+                return
+            }
+            
+            let map = texLoader.load(src,(tex)=>{
+                if(this.curGroundImgSrc == src){
+                    const s = ratio * this.goundScale
+                    this.groundPlane.scale.set(tex.image.width*s, tex.image.height*s)  
+                    viewer.dispatchEvent('content_changed')
+                } 
+            })
+            Potree.Utils.makeTexDontResize(map)          
+            if(!this.groundPlane){
+                this.groundPlane = new THREE.Mesh(new THREE.PlaneBufferGeometry(1,1,1), new THREE.MeshBasicMaterial({
+                    map,  
+                    side : 2,
+                    
+                }))
+                viewer.scene.scene.add(this.groundPlane)
+                this.groundPlane.position.z = -1
+            }else{
+                this.groundPlane.material.map = map
+            }
+            
+            Potree.Utils.updateVisible(this.groundPlane,'show',true )
+        }else{
+            this.groundPlane && Potree.Utils.updateVisible(this.groundPlane,'show',false )
+        }  
+    }
+    
 }   
     
     

+ 6 - 3
src/custom/objects/tool/Measure.js

@@ -376,7 +376,9 @@ export class Measure extends ctrlPolygon{
         
     getArea(){ 
         let area
-        if(this.point2dInfo){
+        if(this._area != void 0){
+            area = this._area
+        }else if(this.point2dInfo){
             area = Math.abs(math.getArea(this.point2dInfo.points2d))//this.getArea();
         }else{//mulDistance Ring 2d面
             area = Math.abs(math.getArea(this.points))
@@ -1159,13 +1161,14 @@ export class Measure extends ctrlPolygon{
                 side:THREE.DoubleSide,
                 opacity:0.2,
                 transparent:true,
-                useDepth:true 
+                useDepth:true,             
             })), 
             selected: new THREE.MeshBasicMaterial({
                 color:  color ,
                 side:THREE.DoubleSide,
                 opacity:0.3,
                 transparent:true, 
+                //wireframe:true                
             })
         },Measure.planeMats = planeMats)
         return super.createAreaPlane(planeMats.default)
@@ -1257,7 +1260,7 @@ export class Measure extends ctrlPolygon{
                    
         }else if(prop.measureType == 'Area'){
             prop.showDistances = true,  
-            prop.atPlane = true,                
+            Potree.settings.areaAtNotPlane || (prop.atPlane = true)                
             prop.showEdges = true,
             prop.closed = true, 
             prop.minMarkers = 3  

+ 94 - 23
src/custom/objects/tool/ctrlPolygon.js

@@ -1,9 +1,7 @@
 import * as THREE from "../../../../libs/three.js/build/three.module.js";
 
-
-
-
-
+//import  "../../../../libs/d3/d3-delaunay.js";
+ 
 import {LineDraw, MeshDraw} from "../../utils/DrawUtil.js";
 import math from "../../utils/math.js";
 
@@ -22,7 +20,7 @@ export class ctrlPolygon extends THREE.Object3D {
         this.type = type
         
         this.maxMarkers = Number.MAX_SAFE_INTEGER;
-      
+       
          
         this.transformData(prop);
         for(let i in prop){
@@ -547,10 +545,13 @@ export class ctrlPolygon extends THREE.Object3D {
     
     }
     
-    getPoint2dInfo(points){ //在更新areaplane之前必须更新过point2dInfo
-        if(this.facePlane && this.atPlane){ 
+    getPoint2dInfo(points){ //在更新areaplane之前必须更新过point2dInfo (针对所有点在同一平面上的)
+        if(this.facePlane && (this.atPlane || Potree.settings.areaAtNotPlane)){
+ 
+            let facePlane = this.getFacePlane()  
+            
             var originPoint0 = points[0].clone() 
-            var qua = math.getQuaBetween2Vector(this.facePlane.normal, new THREE.Vector3(0,0,1), new THREE.Vector3(0,0,1));
+            var qua = math.getQuaBetween2Vector(facePlane.normal, new THREE.Vector3(0,0,1), new THREE.Vector3(0,0,1));
             let points2d = points.map(e=>e.clone().applyQuaternion(qua))  
         
             this.point2dInfo = {
@@ -652,31 +653,101 @@ export class ctrlPolygon extends THREE.Object3D {
          
         
         if(this.points.length>2){
-            if(this.point2dInfo){
-                this.areaPlane.geometry = MeshDraw.getShapeGeo(this.point2dInfo.points2d)
-                let center = math.getCenterOfGravityPoint(this.point2dInfo.points2d) //重心 
-                      
-                let firstPos =  this.point2dInfo.points2d[0].clone()
-                firstPos.z = 0                  //因为shape只读取了xy,所以位移下, 再算出最终位置,得到差距
-                firstPos.applyQuaternion(this.point2dInfo.quaInverse)
-                let vec = this.point2dInfo.originPoint0.clone().sub(firstPos)
-                center = new THREE.Vector3(center.x, center.y, 0)
-                center.applyQuaternion(this.point2dInfo.quaInverse)
-                this.areaPlane.quaternion.copy(this.point2dInfo.quaInverse) 
-                this.areaPlane.position.copy(vec)       
-                center.add(vec)
-                this.center = center 
-            }else{//prism 
             
+            if(this.isPrism){
                 let z = this.horizonZ || 0
                 let points2d = this.points.map(e=>e.clone().setZ(z))
                 this.areaPlane.geometry = MeshDraw.getShapeGeo(points2d) //z=0
                 let center = math.getCenterOfGravityPoint(points2d) //重心 
                 this.areaPlaneCenter = new THREE.Vector3(center.x, center.y, z)
                 this.areaPlane.position.z = z
+            }else if(this.point2dInfo){
+            
+                if(Potree.settings.areaAtNotPlane){
+                    //测点不在同一平面的面积.   (缺点:容易出现三角缺块, 以及搭错线导致超出理想边界外。故暂不开放) //测试桥面 SG-arqnGgAR7om&formal
+                    //参考 http://indoor.popsmart.cn:8084/sxswsw-sx/   找到场景中面积测量线的方法:window.scene.children[18].children[0].material.color.r = 1
+                    let geometry = new THREE.Geometry 
+                    let faceArray = [], triangles
+                    
+                     /* if(window.used3){ //更差 
+                        const xyPoints = this.points.map(d => d.toArray());
+                        const mesh2D = d3.Delaunay.from(xyPoints);  
+                        triangles = []
+                        for(let i=0;i<mesh2D.triangles.length/3;i++){
+                            triangles.push([mesh2D.triangles[i*3],mesh2D.triangles[i*3+1],mesh2D.triangles[i*3+2]])
+                        } 
+                    }else{  */
+                        triangles = THREE.ShapeUtils.triangulateShape(this.point2dInfo.points2d, [] );
+                    //}
+                     
+                    
+                    if(triangles.length == 0)return
+                    this._area = 0
+                    for( var i = 0; i < triangles.length; i++ ){
+                        faceArray[i] = new THREE.Face3( triangles[i][0], triangles[i][1], triangles[i][2] )
+                        let nor = new THREE.Vector3().crossVectors(
+                            new THREE.Vector3().subVectors(this.points[triangles[i][0]], this.points[triangles[i][2]] ),
+                            new THREE.Vector3().subVectors(this.points[triangles[i][1]], this.points[triangles[i][2]])
+                        ) 
+                        this._area += nor.length() / 2;
+                        nor.normalize()
+                        faceArray[i].normal.copy(nor)
+                    }
+                    geometry.vertices = this.points;
+                    geometry.faces = faceArray;
+                   
+
+                    this.areaPlane.geometry = new THREE.BufferGeometry().fromGeometry(geometry) //不知道为何不转为bufferGeometry显示不出
+                    
+                    //this.center
+                    //参考getFacePlane  在这里建立_normal?
+                    
+                    
+                    
+                    
+                    /* let center = this.getCenter()
+                          
+                    let firstPos =  this.point2dInfo.points2d[0].clone()
+                    firstPos.z = 0                  //因为shape只读取了xy,所以位移下, 再算出最终位置,得到差距
+                    firstPos.applyQuaternion(this.point2dInfo.quaInverse)
+                    let vec = this.point2dInfo.originPoint0.clone().sub(firstPos)
+                    center = new THREE.Vector3(center.x, center.y, 0)
+                    center.applyQuaternion(this.point2dInfo.quaInverse)
+                    this.areaPlane.quaternion.copy(this.point2dInfo.quaInverse) 
+                    this.areaPlane.position.copy(vec)       
+                    center.add(vec)
+                    this.center = center
+                     */
+                    
+                    
+                    
+                    
+                }else{
+                    //if(this.point2dInfo){//旧的。 之前的规定点要在同一平面
+                        this.areaPlane.geometry = MeshDraw.getShapeGeo(this.point2dInfo.points2d)
+                        let center = math.getCenterOfGravityPoint(this.point2dInfo.points2d) //重心 
+                              
+                        let firstPos =  this.point2dInfo.points2d[0].clone()
+                        firstPos.z = 0                  //因为shape只读取了xy,所以位移下, 再算出最终位置,得到差距
+                        firstPos.applyQuaternion(this.point2dInfo.quaInverse)
+                        let vec = this.point2dInfo.originPoint0.clone().sub(firstPos)
+                        center = new THREE.Vector3(center.x, center.y, 0)
+                        center.applyQuaternion(this.point2dInfo.quaInverse)
+                        this.areaPlane.quaternion.copy(this.point2dInfo.quaInverse) 
+                        this.areaPlane.position.copy(vec)       
+                        center.add(vec)
+                        this.center = center
+                    
+                    //}
+                    
+                }
                 
+          
+             
+                 
             }
         }else{
+             
             this.areaPlane.geometry = new THREE.Geometry()
             
         } 

+ 2 - 2
src/custom/potree.shim.js

@@ -38,7 +38,7 @@ KeyCodes.BACKSPACE = 8
 //注意,这时候Potree.js中export的内容还不在Potree变量中
 
 var texLoader = new THREE.TextureLoader()
-
+    texLoader.crossOrigin = "anonymous" 
 {//defines:
     Potree.defines = {}
     Potree.defines.Buttons = {// MouseEvent.buttons
@@ -407,7 +407,7 @@ Utils.getMousePointCloudIntersection = function(viewport, mouse, pointer, camera
             pointcloud: selectedPointcloud,
             point: closestPoint,
             pointclouds: allPointclouds, //add  
-            normal:new THREE.Vector3().fromArray(closestPoint.normal ).applyMatrix4(selectedPointcloud.rotateMatrix)//add
+            normal: closestPoint.normal && new THREE.Vector3().fromArray(closestPoint.normal ).applyMatrix4(selectedPointcloud.rotateMatrix)//add
         };
     } else {
         return null;

+ 1 - 1
src/custom/settings.js

@@ -473,7 +473,7 @@ let settings = {//设置   可修改
     pickFrontPointRatio:config.pickFrontPointRatio, //默认pick点云时选中靠近镜头的点的偏向
     dragPolyBeyondPoint: browser.urlHasValue('dragPolyBeyondPoint'),  //ctrlPolygon是否可以拖拽到没点云的地方
     panoZoomByPointer: false,//全景图是否定点缩放
-
+    areaAtNotPlane: false
 }
 
 

+ 4 - 4
src/custom/start.js

@@ -864,7 +864,7 @@ export function panoEditStart(dom, number, fileServer){
 
   
 
-export function mergeEditStart(dom){
+export function mergeEditStart(dom, mapDom){
     Potree.settings.editType = 'merge' 
     Potree.settings.intersectOnObjs = true
     Potree.settings.boundAddObjs = true
@@ -872,7 +872,7 @@ export function mergeEditStart(dom){
    
     
     
-    let viewer = new Potree.Viewer(dom );
+    let viewer = new Potree.Viewer(dom, mapDom );
    
     let Alignment = viewer.modules.Alignment
      
@@ -1177,7 +1177,7 @@ export function mergeEditStart(dom){
             
             
             
-        }else if(prop.type == 'obsg' || prop.type == 'b3dm'){  //3d tiles  
+        }else if(prop.type == 'osgb' || prop.type == 'b3dm'){  //3d tiles  
         
             let callback = (object)=>{
                  
@@ -1211,7 +1211,7 @@ export function mergeEditStart(dom){
             
         }else{  
             
-             //else if(prop.type == 'las' || prop.type == 'ply')
+             //else if(prop.type == 'las' || prop.type == 'ply' || prop.type == 'laz' ) 
  
             Potree.loadPointCloudScene(prop.url, prop.type, prop.modelId, prop.title, (pointcloud)=>{  
                 pointcloud.matrixAutoUpdate = true

+ 73 - 51
src/custom/viewer/ViewerNew.js

@@ -245,7 +245,7 @@ export class Viewer extends ViewerBase{
                 //add
                 { 
                     $(domElement).append($("<div id='potree_labels'></div>"));
-                    if(!mapArea && Potree.settings.editType != 'merge'){
+                    if(!mapArea && (Potree.settings.editType != 'merge' /* || Potree.settings.showObjectsOnMap */)){
                         mapArea = $("<div id='mapGaode'></div>");
                         $(domElement).append(mapArea);
                         mapArea = mapArea[0];
@@ -473,7 +473,7 @@ export class Viewer extends ViewerBase{
                 this.scene.scene.add(this.reticule)
                 
                 
-                if(Potree.settings.editType != "pano" && Potree.settings.editType != 'merge'){
+                if(Potree.settings.editType != "pano" && (Potree.settings.editType != 'merge' /* || Potree.settings.showObjectsOnMap */)){
                     this.mapViewer = new MapViewer(mapArea/* $('#mapGaode')[0] */)
                 }
                 
@@ -2359,7 +2359,7 @@ export class Viewer extends ViewerBase{
 	}
 
 	loadGUI(callback){
-
+        
 		if(callback){
 			this.onGUILoaded(callback);
 		}
@@ -2872,10 +2872,10 @@ export class Viewer extends ViewerBase{
         
  	
         if(Potree.settings.editType != 'pano' && Potree.settings.editType != 'merge'){
-            this.modules.ParticleEditor.update(delta) 
-            this.mapViewer.update(delta)     //地图更新       
+            this.modules.ParticleEditor.update(delta)  
         }
-    
+        this.mapViewer && this.mapViewer.update(delta)     //地图更新
+        
 		this.dispatchEvent({ type: 'update', delta: delta, timestamp: timestamp});  //在有sidebar时耗高cpu,占本update函数80%
          
 		 
@@ -4871,11 +4871,17 @@ export class Viewer extends ViewerBase{
 		this.update(deltaTime, timestamp);
         this.magnifier.render();
         this.render(); 
-         
+          
         
         this.objs.children.forEach(e=>{
             if(e.fileType == '3dTiles'){
-                e.runtime.update(deltaTime, this.renderer, this.mainViewport.camera)
+                e.traverse(child=>{
+                    if(child.runtime){
+                        child.runtime.update(deltaTime, this.renderer, this.mainViewport.camera)
+                        return {stopContinue:true}
+                    }
+                })
+                
             }
         }) 
          
@@ -5161,7 +5167,7 @@ export class Viewer extends ViewerBase{
             fileInfo_.parentInfo.loadedCount ++
             fileInfo_.parentInfo.modelGroup.add(object) 
             if(fileInfo_.parentInfo.loadedCount == fileInfo_.parentInfo.url.length){ 
-                return loadDone(fileInfo_.parentInfo.modelGroup, fileInfo_.parentInfo)
+                return this.modelLoaded(fileInfo_.parentInfo.modelGroup, fileInfo_.parentInfo, done)
             }else{ 
                 return
             }   
@@ -5183,57 +5189,73 @@ export class Viewer extends ViewerBase{
           
            
         if(fileInfo_.fileType == '3dTiles'){
-            let tileset = object.runtime.getTileset()
-           
-            //TileHeader: tileset.root 
-            //参见另一个工程 TileRenderer.js  preprocessNode //这个坐标位置几万…… let data = boundingVolume.halfAxes  //但这个似乎是premultiply( transform );过后的,可能需还原下
+            let children = object.runtime ? [object] : object.children
             
-            let json = tileset.tileset   
-            let box = json.root.boundingVolume.box
-             
-            if(box){
-                let center = new THREE.Vector3(box[0],box[1],box[2])
-                let boundSize = new THREE.Vector3( )  
-                 
-                // get the extents of the bounds in each axis
-                let vecX = new THREE.Vector3( box[ 3 ], box[ 4 ], box[ 5 ] )
-                let vecY = new THREE.Vector3( box[ 6 ], box[ 7 ], box[ 8 ] );
-                let vecZ = new THREE.Vector3( box[ 9 ], box[ 10 ], box[ 11 ] );
-
-                const scaleX = vecX.length();
-                const scaleY = vecY.length();
-                const scaleZ = vecZ.length();
-                /* boundingBox.expandByPoint(center);
-                boundingBox.expandByVector(new THREE.Vector3(scaleX,scaleY,scaleZ)) */
-                 
+            
+            children.forEach(object =>{
+                let boundingBox_ = new THREE.Box3()
+                
                 
-                boundingBox.min.set( - scaleX, - scaleY, - scaleZ );
-                boundingBox.max.set( scaleX, scaleY, scaleZ );
+                let tileset = object.runtime.getTileset()
+           
+                //TileHeader: tileset.root 
+                //参见另一个工程 TileRenderer.js  preprocessNode //这个坐标位置几万…… let data = boundingVolume.halfAxes  //但这个似乎是premultiply( transform );过后的,可能需还原下
                 
-            }else if(json.root.boundingVolume.sphere){
-                let sphereData = json.root.boundingVolume.sphere
-                let center = new THREE.Vector3(...sphereData)
-                let radius = sphereData[3] / 2
-                /* let sphere = new THREE.Sphere(center, radius) 
-                let box = sphere.getBoundingBox()
-                boundingBox.copy(box) */
+                let json = tileset.tileset   
+                let box = json.root.boundingVolume.box
                  
-                boundingBox.min.set( - radius, - radius, - radius );
-                boundingBox.max.set( radius, radius, radius );
+                if(box){
+                    let center = new THREE.Vector3(box[0],box[1],box[2])
+                    let boundSize = new THREE.Vector3( )  
+                     
+                    // get the extents of the bounds in each axis
+                    let vecX = new THREE.Vector3( box[ 3 ], box[ 4 ], box[ 5 ] )
+                    let vecY = new THREE.Vector3( box[ 6 ], box[ 7 ], box[ 8 ] );
+                    let vecZ = new THREE.Vector3( box[ 9 ], box[ 10 ], box[ 11 ] );
+
+                    const scaleX = vecX.length();
+                    const scaleY = vecY.length();
+                    const scaleZ = vecZ.length();
+                    /* boundingBox.expandByPoint(center);
+                    boundingBox.expandByVector(new THREE.Vector3(scaleX,scaleY,scaleZ)) */
+                     
+                    
+                    boundingBox_.min.set( - scaleX, - scaleY, - scaleZ );
+                    boundingBox_.max.set( scaleX, scaleY, scaleZ );
+                    
+                }else if(json.root.boundingVolume.sphere){
+                    let sphereData = json.root.boundingVolume.sphere
+                    let center = new THREE.Vector3(...sphereData)
+                    let radius = sphereData[3] / 2
+                    /* let sphere = new THREE.Sphere(center, radius) 
+                    let box = sphere.getBoundingBox()
+                    boundingBox.copy(box) */
+                     
+                    boundingBox_.min.set( - radius, - radius, - radius );
+                    boundingBox_.max.set( radius, radius, radius );
+                    
+                    
+                    
+                }else{
+                    return console.error('json boundingVolume 缺少信息') 
+                }
                 
+                //中心点居然没用。可能是漏用了什么信息,也许这和LVBADUI_qp是散的有关。
+                console.log('3d tiles json',json)
                 
+                json.root.refine = 'ADD';
+                json.refine = 'ADD';
+                    
                 
-            }else{
-                return console.error('json boundingVolume 缺少信息') 
-            }
+                boundingBox.union(boundingBox_)
+                
+            })
+            
+            
             
-            //中心点居然没用。可能是漏用了什么信息,也许这和LVBADUI_qp是散的有关。
-            console.log('3d tiles json',json)
             
-            json.root.refine = 'ADD';
-            json.refine = 'ADD';
         }else { 
-            Potree.Utils.setObjectLayers(object,'model')  
+            Potree.Utils.setObjectLayers(object, Potree.settings.showObjectsOnMap ? 'bothMapAndScene' : 'model')  
             
             
             object.traverse( ( child )=>{ 
@@ -5418,7 +5440,7 @@ export class Viewer extends ViewerBase{
                 }
             });
             tileset.addEventListener('tileLoaded',(e)=>{ //每一个tile加载完要更改透明度
-                let opacity = result.model.opacity
+                let opacity = result.model.parent ? result.model.parent.opacity : result.model.opacity //最多两层
                 MergeEditor.changeOpacity(e.tileContent,opacity)
                 //set Layers ?
             })

+ 2 - 2
src/custom/viewer/map/MapViewer.js

@@ -767,9 +767,9 @@ export class MapViewer extends ViewerBase{
         //绘制其他物体
         Potree.Utils.setCameraLayers(this.camera, ['mapObjects'  , 'bothMapAndScene'  ])
         viewer.dispatchEvent({type: "render.begin",  viewer: this, viewport:this.viewports[0], params }); 
-        renderer.render(this.scene, this.camera);
-        this.attachedToViewer || renderer.render(viewer.scene.scene, this.camera); //类同renderOverlay
         
+        this.attachedToViewer || renderer.render(viewer.scene.scene, this.camera); //类同renderOverlay
+        renderer.render(this.scene, this.camera);
         if(!this.attachedToViewer && this.renderMeasure){//在未attach到主页面时也要渲染测量线
             viewer.dispatchEvent({type: "render.pass.perspective_overlay", camera:this.camera, /* screenshot:params.screenshot, */viewport:this.viewports[0], renderer});
         }

+ 6 - 3
src/loader/LasLazLoader.js

@@ -29,7 +29,7 @@ export class LasLazLoader {
 
 	}
 
-	load (node) {
+	load (node, callback) {
 		if (node.loaded) {
 			return;
 		}
@@ -48,7 +48,7 @@ export class LasLazLoader {
 			if (xhr.readyState === 4) {
 				if (xhr.status === 200 || xhr.status === 0) {
 					let buffer = xhr.response;
-					this.parse(node, buffer);
+					this.parse(node, buffer, callback);
 				} else {
 					console.log('Failed to load file! HTTP status: ' + xhr.status + ', file: ' + url);
 				}
@@ -58,7 +58,7 @@ export class LasLazLoader {
 		xhr.send(null);
 	}
 
-	async parse(node, buffer){
+	async parse(node, buffer, callback){//add callback
 		let lf = new LASFile(buffer);
 		let handler = new LasLazBatcher(node);
 
@@ -106,11 +106,14 @@ export class LasLazLoader {
 			await lf.close();
 
 			lf.isOpen = false;
+            
 		}catch(e){
 			console.error("failed to close las/laz file!!!");
 			
 			throw e;
 		}
+        
+        callback() //add
 	}
 
 	handle (node, url) {

+ 1 - 1
src/navigation/InputHandlerNew.js

@@ -1430,7 +1430,7 @@ export class InputHandler extends THREE.EventDispatcher {
         
         //raycaster.layers.enableAll()//add
         Potree.Utils.setCameraLayers(raycaster,   //设置能识别到的layers(如空间模型里只有mapViewer能识别到marker)
-            ['sceneObjects','mapObjects','measure',  'transformationTool', 'model'],
+            ['sceneObjects','mapObjects','measure',  'transformationTool', 'model', 'bothMapAndScene'],
             this.hoverViewport && this.hoverViewport.extraEnableLayers
         )
         //this.hoverViewport.beforeRender && this.hoverViewport.beforeRender()

+ 6 - 4
src/viewer/ExtendView.js

@@ -212,7 +212,7 @@ class ExtendView extends View {
             
             let f = ()=>{ 
                 this.position.copy(endPosition)  //因为延时1后control的update会导致位置改变
-                info.callback && info.callback()  
+                info.callback && info.callback()   
                 this.dispatchEvent('flyingDone')  
             }
             if(info.duration){
@@ -225,15 +225,17 @@ class ExtendView extends View {
         
         let endPosition = new THREE.Vector3().copy(info.position)
         let startPosition = this.position.clone();
-		let startQuaternion, endQuaternion, endTarget = null,  
+		let startQuaternion, endQuaternion, endTarget = info.target && new THREE.Vector3().copy(info.target)  ,  
             endYaw, startYaw, endPitch, startPitch ;
         
         
         this.restrictPos(endPosition)
          
+         
+         
+         
         if(info.endYaw == void 0){
-            if(info.target ){
-                endTarget = new THREE.Vector3().copy(info.target)  
+            if(info.target ){ 
                 endQuaternion = math.getQuaFromPosAim(endPosition,endTarget) //若为垂直,会自动偏向x负的方向
            
             }else if(info.quaternion){