소스 검색

Revert "fix: 1"

This reverts commit 88d4006de3385a6b96f27ed7b4f6472beb74b423.

# Conflicts:
#	src/utils/MeasuringTool.js
xzw 3 년 전
부모
커밋
2b7a8b8acd

+ 7 - 1
libs/three.js/build/three.module.js

@@ -17448,7 +17448,13 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
 			const fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );
 
 			console.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), '35715', gl.getProgramParameter( program, 35715 ), 'gl.getProgramInfoLog', programLog, vertexErrors, fragmentErrors );
-
+            //add:
+            if(fragmentErrors){
+                console.log(fragmentGlsl.split("\n").map((a, i) => `${i + 1}`.padEnd(5) + a).join("\n") )
+            }else{
+                console.log(vertexGlsl.split("\n").map((a, i) => `${i + 1}`.padEnd(5) + a).join("\n") )
+            }
+            
 		} else if ( programLog !== '' ) {
 
 			console.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );

+ 38 - 33
libs/three.js/lines/LineMaterial.js

@@ -345,40 +345,7 @@ var LineMaterial = function ( parameters ) {
 
 	this.dashed = false;
     
-    //add
-    this.updateDepthParams()
-    
-    viewer.addEventListener('camera_changed', (e)=>{
-        if(e.viewport.name != 'mapViewport') this.updateDepthParams(e) 
-    })   
-
-    let setSize = (e)=>{ 
-        let viewport = e.viewport
-        let viewportOffset = viewport.offset || new Vector2() 
-        this.uniforms.resolution.value.copy(viewport.resolution2) 
-        this.uniforms.viewportOffset.value.copy(viewportOffset) 
-         
-    }
-    
-    let viewport = viewer.mainViewport;
-     
-    setSize({viewport})
-
-
-    viewer.addEventListener('resize',(e)=>{
-        if(!e.viewport || e.viewport.name != 'mapViewport'){
-            setSize(e)
-            //console.log(this.name +  viewportOffset.toArray())     
-        } 
-    })  
-    
     
-    /* viewer.addEventListener("render.begin", (e)=>{//before render  如果有大于两个viewport的话可能要
-        if(e.viewport.name != 'mapViewport') this.updateDepthParams({camera:e.viewport.camera})
-    }) */
-
-
-
 
 
 	Object.defineProperties( this, {
@@ -571,6 +538,44 @@ var LineMaterial = function ( parameters ) {
 	} );
 
 	this.setValues( parameters );
+ 
+
+    //add
+    this.updateDepthParams()
+    
+    viewer.addEventListener('camera_changed', (e)=>{
+        if(e.viewport.name != 'mapViewport') this.updateDepthParams(e) 
+    })   
+
+    let setSize = (e)=>{ 
+        let viewport = e.viewport
+        let viewportOffset = viewport.offset || new Vector2() 
+        this.uniforms.resolution.value.copy(viewport.resolution2) 
+        this.uniforms.viewportOffset.value.copy(viewportOffset) 
+         
+    }
+    
+    let viewport = viewer.mainViewport;
+     
+    setSize({viewport})
+
+
+    viewer.addEventListener('resize',(e)=>{
+        if(!e.viewport || e.viewport.name != 'mapViewport'){
+            setSize(e)
+            //console.log(this.name +  viewportOffset.toArray())     
+        } 
+    })  
+    
+    
+    /* viewer.addEventListener("render.begin", (e)=>{//before render  如果有大于两个viewport的话可能要
+        if(e.viewport.name != 'mapViewport') this.updateDepthParams({camera:e.viewport.camera})
+    }) */
+
+
+
+
+
 
 };
 

+ 66 - 8
note.txt

@@ -7,14 +7,21 @@ npm start
 应用navvis : 
  https://testlaser.4dkankan.com/maxkk/t-iksBApb/?image=1&vlon=4.91&vlat=-0.13&fov=100.0
 https://hq.iv.navvis.com/?site=1493761991057195&vlon=1.12&vlat=-0.52&fov=100.0&image=16902
+http://139.224.42.18:8080/siemens/?pc=true&vlon=2.59&vlat=-0.03&fov=100.0&lon=116.46694741&lat=39.98387332&z=1.807
 
-重算 http://120.25.146.52:9294/indoor/{sceneCode}/api/initRecount
-
-
+navvis:
+http://indoor.popsmart.cn:8084/sxswsw-sx/?vlon=5.25&vlat=0.03&fov=100.0&pc=true&lon=120.58634810&lat=29.99135414&z=2.002
 
 用户名:admin
 密码:ipadmin
 
+
+
+
+重算 http://120.25.146.52:9294/indoor/{sceneCode}/api/initRecount
+
+
+
 地图贴图
 https://hq.iv.navvis.com/?fov=100.0&site=1493761991057195&hsCtaTracking=8ca25304-e9e7-49a2-8543-fcd4d6cb6df2%7C1108fea0-c576-4606-adbd-64471b0f92a6&vlon=5.90&vlat=-0.30&image=16830
 
@@ -46,16 +53,67 @@ PointCloudOctreeGeometryNode-geometry
 
 ==============
 
-点云和全景不一定对的上,尤其是移动的物体,还有拍摄时间不同的话。
-
+ 
 添加数据集登录4dkk
 18666146601
 Aa123456
 
+===============
+
+
+待完善:
+
+---------
+优化:  |
+---------
+加载深度图(因为一开始用的全景)
+setView 旋转改成4dkk那种
+
+热点可能需要再次矫正
+飞向object的bound和距离
+四屏透明度不好调整
+
+
+
+
+---------
+Bug	|
+---------
+
+qq浏览器灰白:见pointcloud.vs:暂时注释掉   applyBackfaceCulling直接返回false或者注释color = vec3(0.);都没问题
+
+隐藏数据集后再全景
+截图时map为何闪一下
+ 
+
+dataset校准导致导航问题、控制点?
+导航的开始点和结束点是怎么定的
+
+
+
+地图focus页面会黑屏、 =t-8KbK1JjubE#/floorpan  平面图页面卡顿
+ 
+502 Bad Gateway 就会一直加载 没有处理错误
+
+ 
+点击其他ui再回来会错位
+
+
+这里要显示的是自定义的平面图,但是如果没有自定义的,应该是不显示这个选项的
+
+
+
+
+
+
+漫游模式的点云有问题。 可能是 float getLOD(){ 中的  但是为何只在贴图后才有问题。 点是如何放大的
+
+
+
+
+
 
-  
-label再改回mesh,因为需要遮挡。 (或者能够算出是否遮挡住了。navvis怎么多重遮挡的?)
 
-热点可能也要遮挡。。。。
 
 
+ 

+ 2 - 24
src/LRU.js

@@ -140,35 +140,13 @@ class LRU{
 			return;
 		}
 
-		/* while (this.numPoints > Potree.pointLoadLimit) {
+		while (this.numPoints > Potree.pointLoadLimit) {
 			let element = this.first;
 			let node = element.node;
 			this.disposeDescendants(node);
-		} */ 
-        
-        //改成navvis的,使用pointBudget,否则四屏点云闪烁。
-        for (; this.numPoints > viewer.viewports.length * 2 * Potree.pointBudget;  ) {//要根据屏幕数量来增加pointBudget
-            var node = this.getLRUItem();
-            node && this.disposeSubtree(node)
-        }
-        
-        
+		}
 	}
 
-    disposeSubtree(t) {//add from navvis 25.js
-        var e = [t];
-        t.traverse((function(t) {
-            t.loaded && e.push(t)
-        }
-        ));
-        for (var n = 0, i = e; n < i.length; n++) {
-            var o = i[n];
-            o.dispose(),
-            this.remove(o)
-        }
-    }
-
-
 	disposeDescendants(node){
 		let stack = [];
 		stack.push(node);

+ 1 - 11
src/PointCloudOctreeGeometry.js

@@ -263,17 +263,7 @@ export class PointCloudOctreeGeometryNode extends PointCloudTreeNode{
 			this.oneTimeDisposeHandlers = [];
 		}
 	}
-    
-	traverse(t, e){//add from navvis 25.js
-        void 0 === e && (e = !0);
-        for (var n, i = e ? [this] : []; void 0 !== (n = i.pop()); ) {
-            t(n);
-            for (var o = 0, r = n.children; o < r.length; o++) {
-                var a = r[o];
-                null !== a && i.push(a)
-            }
-        }
-    }
+	
 }
 
 PointCloudOctreeGeometryNode.IDCount = 0;

+ 4 - 5
src/Potree_update_visibility.js

@@ -28,7 +28,7 @@ export function updatePointClouds(pointclouds,camera, areaSize /* renderer */){
 		pointcloud.updateVisibleBounds();
 	}
 
-	exports.lru.freeMemory();//即Potree.lru 能看到所有在加载的node
+	exports.lru.freeMemory();
 
 	return result;
 };
@@ -157,8 +157,7 @@ export function updateVisibility(pointclouds, camera, areaSize){
 	}
 
 	while (priorityQueue.size() > 0) {
-		let element = priorityQueue.pop();//其实是拿第一个, 再把最后一个放到前面
-         
+		let element = priorityQueue.pop();
 		let node = element.node;
 		let parent = element.parent;
 		let pointcloud = pointclouds[element.pointcloud];
@@ -395,7 +394,7 @@ export function updateVisibility(pointclouds, camera, areaSize){
 		}
 	}// end priority queue loop
 
-	{ // update DEM  这是什么
+	{ // update DEM
 		let maxDEMLevel = 4;
 		let candidates = pointclouds.filter(p => (p.generateDEM && p.dem instanceof Potree.DEM));
 		for (let pointcloud of candidates) {
@@ -403,7 +402,7 @@ export function updateVisibility(pointclouds, camera, areaSize){
 			pointcloud.dem.update(updatingNodes);
 		}
 	}
-    //加载点云
+
 	for (let i = 0; i < Math.min(Potree.maxNodesLoading, unloadedGeometry.length); i++) {
 		unloadedGeometry[i].load();
 	}

+ 1 - 1
src/materials/PointCloudMaterial.js

@@ -268,7 +268,7 @@ export class PointCloudMaterial extends THREE.RawShaderMaterial {
 
 	getDefines () {
 		let defines = [];
- 
+
 		if (this.pointSizeType === PointSizeType.FIXED) {
 			defines.push('#define fixed_point_size');
 		} else if (this.pointSizeType === PointSizeType.ATTENUATED) {

+ 1 - 1
src/materials/shaders/pointcloud.fs

@@ -116,7 +116,7 @@ void main() {
 
 	
  
-    #if defined color_type_indices    //pick point recognize
+    #if defined color_type_indices    //pick point 识别
 		gl_FragColor = vec4(color, uPCIndex / 255.0);
 	#else
 		gl_FragColor = vec4(color, vOpacity);

+ 6 - 7
src/materials/shaders/pointcloud.vs

@@ -601,7 +601,6 @@ vec3 getNormal(){
 }
 bool applyBackfaceCulling() {
 	// Black not facing vertices / Backface culling
-      
 	vec3 e = normalize(vec3(modelViewMatrix * vec4( position, 1. )));
 	vec3 n = getNormal(); // normalize( vec3(modelViewMatrix * vec4( normal, 0.0 )) );
 
@@ -704,10 +703,10 @@ vec3 getColor(){
 		color = getExtra();
 	#endif
 	
-	if (backfaceCulling && applyBackfaceCulling()){
-        //color = vec3(0.);
-    }
-    //applyBackfaceCulling直接返回false或者注释color = vec3(0.);都没问题
+	if (backfaceCulling && applyBackfaceCulling()) {
+		color = vec3(0.);
+	}
+
 	return color;
 }
 
@@ -996,8 +995,8 @@ void main() {
    
     //-------------------        
 
-    //数据集校准时,相机拉远后随着点云密集需降低透明度 
-    #ifdef attenuated_opacity  
+     
+    #ifdef attenuated_opacity //数据集校准时,相机拉远后随着点云密集需降低透明度
         vOpacity = uOpacity * exp(-length(-mvPosition.xyz) / 1000.0);  //opacityAttenuation = 1000
     #else
         vOpacity = uOpacity;

+ 4 - 11
src/modules/Images360/Images360.js

@@ -284,18 +284,16 @@ export class Images360 extends EventDispatcher{
                         viewer.mainViewport.unableChangePos = !config.canLeavePano
                         
                         if(mode == 'showPanos'){  
-                            camera.far = viewer.farWhenShowPano  //修改far
+                            camera.far = viewer.farWhenShowPano 
                             Potree.settings.pointDensity = 'panorama'
                         }else{
-                            if(camera.limitFar)   camera.far = Potree.settings.cameraFar;//修改far
+                            if(camera.limitFar)   camera.far = Potree.settings.cameraFar;
                             Potree.settings.pointDensity = Potree.settings.UserPointDensity    
                         }  
                         camera.updateProjectionMatrix() 
 
                         
                         displayMode = mode
-                        
-                        
                         if(this.elDisplayModel){
                             this.elDisplayModel.value = mode == 'showPointCloud' ? ">>全景" : '>>点云'
                         }
@@ -1509,15 +1507,10 @@ export class Images360Loader{
                 images360.panos.push(pano);
 
             })
-            viewer.setObjectLayers(images360.node, 'marker'/* 'sceneObjects' */)
             
             
-            images360.panos.forEach(e=>{
-                e.label && viewer.setObjectLayers(e.label, 'bothMapAndScene') 
-            })
-
-
-            
+            viewer.setObjectLayers(images360.node, 'marker'/* 'sceneObjects' */)
+             
             viewer.images360 = window.images360 = images360//add
             images360.tileDownloader.setPanoData(images360.panos, [] /* , Potree.settings.number */);
 

+ 5 - 1
src/modules/Images360/Panorama.js

@@ -58,7 +58,11 @@ class Panorama extends EventDispatcher{
         this.images360 = images360
         this.transform =  transform
         this.visible = true  //for viewer updateVisible
-         
+        //this.position.set(this.position.x, -this.position.z, this.position.y) //4dkk的坐标绕x旋转90°
+
+        /* this.longitude = o.location[0]
+        this.latitude = o.location[1]
+        this.altitude = o.location[2]  */
         this.originPosition = new THREE.Vector3().fromArray(o.dataset_location) 
         this.originFloorPosition = new THREE.Vector3().fromArray(o.dataset_floor_location)
         

+ 1 - 1
src/modules/datasetAlignment/Alignment.js

@@ -93,7 +93,7 @@ var Alignment = {
         
         
         SplitScreen.splitScreen4Views({alignment:true})
-        viewer.viewports.find(e=>e.name == 'mapViewport').alignment = {rotate:true,translate:true};
+        viewer.viewports.find(e=>e.name == 'Top').alignment = {rotate:true,translate:true};
         viewer.viewports.find(e=>e.name == 'Right').alignment = {translate:true};
         viewer.viewports.find(e=>e.name == 'Back').alignment = {translate:true};
         

+ 2 - 4
src/navigation/FirstPersonControls.js

@@ -217,9 +217,7 @@ export class FirstPersonControls extends EventDispatcher {
             let speed = this.currentViewport.getMoveSpeed() || 1 
             if(camera.type == "OrthographicCamera"){
                 let ratio
-                if(e.delta == 0){//mac
-                   return 
-                }else if (e.delta < 0) {
+                if (e.delta < 0) {
                     ratio = 0.9 
                 } else if (e.delta > 0) {
                     ratio = 1.1
@@ -233,7 +231,7 @@ export class FirstPersonControls extends EventDispatcher {
                     camera.updateProjectionMatrix()
                 }
                 
-                console.log('zoom') 
+                
                 
             }else{
                 var direction = this.currentViewport.view.direction.clone();

+ 1 - 5
src/navigation/InputHandler.js

@@ -537,7 +537,7 @@ export class InputHandler extends EventDispatcher {
 
 	onMouseMove (e) {
          
-		
+		e.preventDefault();
        
         var  {  camera, viewport  } = this.getPointerInViewport(e.clientX, e.clientY,  this.dragViewport) 
 		this.hoverViewport = viewport
@@ -570,10 +570,6 @@ export class InputHandler extends EventDispatcher {
             intersectPoint.orthoIntersect = pos3d.clone()
                
         }    
-        if(e.onlyGetIntersect){
-            return intersectPoint
-        }
-        e.preventDefault();
         
  
 		if (this.drag) {//有拖拽(不一定拖拽了物体, 也不一定按下了鼠标)

+ 24 - 79
src/navigation/RouteGuider.js

@@ -18,7 +18,8 @@ const sphereSizeInfo = {
 export class RouteGuider extends EventDispatcher{
     constructor () {
 		super();
-        
+        this._routeStart = null
+        this._routeEnd = null
         this.route = [];
         this.curve = []
         this.sceneMeshGroup = new THREE.Object3D;
@@ -186,11 +187,13 @@ export class RouteGuider extends EventDispatcher{
     }
     
     
-    /* get routeStart(){
+    get routeStart(){
         return this._routeStart && this._routeStart.clone()
     }
     
-    set routeStart(pos){ 
+    set routeStart(pos){
+        console.log('routeStart' )
+        console.log(pos)
         if(this._routeStart && pos && this._routeStart.equals(pos)) return //可能重复设置
         this._routeStart = pos && new THREE.Vector3().copy(pos) 
          
@@ -201,39 +204,20 @@ export class RouteGuider extends EventDispatcher{
         return this._routeEnd && this._routeEnd.clone() 
     }
     
-    set routeEnd(pos){ 
+    set routeEnd(pos){
+        console.log('routeEnd' )
+        console.log(pos)
         if(this._routeEnd && pos && this._routeEnd.equals(pos)) return 
         this._routeEnd = pos && new THREE.Vector3().copy(pos)  
         this.generateRoute()
-    } */
-    setRouteStart(pos, ifReset){
-        if(this.routeStart && pos && this.routeStart.equals(pos)) return //可能重复设置
-        this.routeStart = pos && new THREE.Vector3().copy(pos) 
-        //    console.log('setRouteStart',ifReset,this.routeStart&&this.routeStart.toArray()) 
-        ifReset || this.generateRoute()
-    }
-    setRouteEnd(pos, ifReset){ 
-        if(this.routeEnd && pos && this.routeEnd.equals(pos)) return 
-        this.routeEnd = pos && new THREE.Vector3().copy(pos)
-        //    console.log('setRouteEnd',ifReset,this.routeEnd&&this.routeEnd.toArray())        
-        ifReset || this.generateRoute()
     }
     
-    getSourceProjectionIndex(route) {//真正的起始
-        var e = route.findIndex(function(t) {
-            return t.instruction && t.instruction.type === 'source_projection_to_navgraph'
-        });
-        return e < 0 ? 0 : e
-    }
-    getDestinationProjectionIndex(route) {//真正的终点
-        var e = route.findIndex(function(t) {
-            return t.instruction && t.instruction.type === "destination_projection_to_navgraph"
-        });
-        return e < 0 ? route.length - 1 : e
-    }
+    
+    
     
     generateRoute(){
-        if(!this.routeStart || !this.routeEnd){ 
+        if(!this.routeStart || !this.routeEnd){
+            this.clearRoute()
             return
         }
         
@@ -289,37 +273,14 @@ export class RouteGuider extends EventDispatcher{
             
             Potree.fileServer.get(url).then((data)=>{
                 console.log(data.data)
-                if(!this.routeStart || !this.routeEnd)return 
+                if(!this.routeStart || !this.routeEnd && !data.data)return 
                 
-                if(!data.data){
-                    console.log('没有数据')
-                    return this.generateDeferred && this.generateDeferred.resolve('没有数据')
-                }
-                 
-                  
-                this.clearRoute()
-                let length = data.data.length
+                data.data.forEach(item=>{
+                    let pos = viewer.transform.lonlatToLocal.forward(item.location.slice(0))
+                    pos = new THREE.Vector3().fromArray(pos)
+                    this.route.push(pos)
+                })
                 
-                if(length == 0){//可能距离太短
-                    console.log('路径点数为0,直接取起点和终点连线')
-                    this.route = [this.routeStart, this.routeEnd];
-                }else{ 
-                    let startIndex = this.getSourceProjectionIndex(data.data)
-                    let endIndex = this.getDestinationProjectionIndex(data.data)
-                    
-                    
-                    let effectiveItems = data.data.slice(startIndex, endIndex + 1 );//只要点云范围内的点
-                    effectiveItems.forEach((item,i)=>{ 
-                        let pos = viewer.transform.lonlatToLocal.forward(item.location.slice(0))
-                        pos = new THREE.Vector3().fromArray(pos)
-                        this.route.push(pos)
-                    })
-                    
-                    console.log(this.route)
-                    
-                    this.setRouteStart(this.route[0],true) 
-                    this.setRouteEnd(this.route[this.route.length-1],true) 
-                }
                 create()
                 /*
                     distance: 0.17581000000000116
@@ -348,7 +309,6 @@ export class RouteGuider extends EventDispatcher{
                 this.route.push(new THREE.Vector3().addVectors(lastOne,dir))
             }
             this.route.splice(0,1) //route不用包含收尾 */
-            this.clearRoute()
             this.route = [this.routeStart, this.routeEnd]
             create()
             
@@ -380,23 +340,20 @@ export class RouteGuider extends EventDispatcher{
     
     
     
-    
-    
     displayRoute(o={}){
         if(!o.resetMap){ 
             this.sceneMeshGroup.visible = true 
             this.mapMeshGroup.visible = true
-            this.poleStart.position.copy(this.routeStart)
-            this.poleEnd.position.copy(this.routeEnd)
-            this.mapMarkStart.position.copy(this.routeStart).setZ(0)
-            this.mapMarkEnd.position.copy(this.routeEnd).setZ(0)
+            this.poleStart.position.copy(this.route[0])
+            this.poleEnd.position.copy(this.route[this.route.length-1])
+            this.mapMarkStart.position.copy(this.route[0]).setZ(0)
+            this.mapMarkEnd.position.copy(this.route[this.route.length-1]).setZ(0)
             this.scenePoints.forEach(e=>this.addArrow(e))
             this.arrows.children.forEach((e,i)=>this.setArrowDir(this.arrows.children,i));
         }
            
         this.mapPoints.forEach(e=>this.addMapArrow(e))
         this.mapArrows.children.forEach((e,i)=>this.setArrowDir(this.mapArrows.children,i));
-        viewer.mapViewer.dispatchEvent({'type':'content_changed'})
     }
     
     clearRoute(o={}){
@@ -425,16 +382,4 @@ export class RouteGuider extends EventDispatcher{
         this.clearRoute()
         
     }
-}
-
-//大概每十米要花一秒
-
-
-
-/* 
-
-    存在的问题:
-    路径不准确。起始点和终点偏移。
-
-
- */
+}

+ 3 - 12
src/settings.js

@@ -100,7 +100,7 @@ const config = {//配置参数   不可修改
             pointBudget:4*1000*1000,
         },
         high:{//highQuality
-            maxLevel: 12,//原本是8
+            maxLevel: 8,
             pointBudget:8*1000*1000,
         }
         //minNodeSize?
@@ -156,7 +156,7 @@ const config = {//配置参数   不可修改
         map:8,
         mapObjects:9,//default
         
-        bothMapAndScene:15,
+        //bothMapAndScene:15,
         
         
         siteModeOnlyMapVisi:12,//只能mapViewer可见
@@ -210,20 +210,11 @@ const config = {//配置参数   不可修改
         }
     }
     ,
-    axis : {   'x':{color:'#d0021b'/* 'red' */}, 'y':{ color:'#86c542' /* 'green' */},  'z': {color:'#3399c8' /* 'blue' */}},  
-    
-    
     highQualityMaxZoom: 2,
     ultraHighQualityMaxZoom: 3,
     
     clickMaxDragDis:5,
-     
-    background: '#232323'    
 }
-
-
-
-
 /* 显示模式:
 
 1只显示点云: 滚轮为前进后退,方向键可以行走。进入漫游点时自动变为混合(这样全景可以弥补缝隙),过渡时只显示点云。
@@ -264,7 +255,7 @@ let settings = {//设置   可修改
     
     navTileClass:'2k',  //默认加载到
     tileClass:'4k',     //最高可达
-    //initialShowPano:true
+    
 }
 
 

+ 3 - 5
src/utils/Measure.js

@@ -81,14 +81,13 @@ export class Measure extends ctrlPolygon{
         viewer.setObjectLayers(this, 'measure' )
         
         //addMarkers:
-       
         this.initData(prop)
         
          
         this.points_datasets || (this.points_datasets = []) //存每个点是哪个数据集
 
 
-        
+        this.updateDatasetBelong()
         
         this.addEventListener('marker_dropped',(e)=>{ 
             this.updateDatasetBelong()
@@ -96,7 +95,8 @@ export class Measure extends ctrlPolygon{
 	}
  
  
-     
+    
+ 
     updateDatasetBelong(){//更新所属数据集
         let old = this.datasetId
         
@@ -138,11 +138,9 @@ export class Measure extends ctrlPolygon{
         this.points = this.dataset_points.map(e=>{ 
             return Potree.Utils.datasetPosTransform.fromDataset({datasetId:this.datasetId, dataset_location:e.clone()})
         })
-         
         this.getPoint2dInfo(this.points)
         this.update(true)
         this.setSelected(false)//隐藏edgelabel
-         
     }
  
 	update(ifUpdateMarkers) { 

+ 36 - 48
src/utils/TransformationTool.js

@@ -2,16 +2,6 @@
 import * as THREE from "../../libs/three.js/build/three.module.js";
 import {Utils} from "../utils.js";
 
-
-
-//add-------------------------------------
-const OpaWhenNotSelect = 0.75
-const ScaleRatio = 4
-const OutlineColor = 0x666666
-//----------------------------------------
-
-
-
 export class TransformationTool {
 	constructor(viewer) {
 		this.viewer = viewer;
@@ -37,9 +27,9 @@ export class TransformationTool {
 
 		});
 
-		let red = Potree.config.axis.x.color
-		let green = Potree.config.axis.y.color
-		let blue = Potree.config.axis.z.color
+		let red = 0xE73100;
+		let green = 0x44A24A;
+		let blue = 0x2669E7;
 		
 		this.activeHandle = null;
 		this.scaleHandles = {
@@ -125,14 +115,14 @@ export class TransformationTool {
 
 			let material = new THREE.MeshBasicMaterial({
 				color: handle.color,
-				opacity: OpaWhenNotSelect,
+				opacity: 0.4,
 				transparent: true
 				});
 
 			let outlineMaterial = new THREE.MeshBasicMaterial({
-				color: OutlineColor, 
+				color: 0x000000, 
 				side: THREE.BackSide,
-				opacity: OpaWhenNotSelect,
+				opacity: 0.4,
 				transparent: true});
 
 			let pickMaterial = new THREE.MeshNormalMaterial({
@@ -141,18 +131,18 @@ export class TransformationTool {
 				visible: this.showPickVolumes});
 
 			let sphere = new THREE.Mesh(sgSphere, material);
-			sphere.scale.set(2, 2, 2 );
+			sphere.scale.set(1.3, 1.3, 1.3);
 			sphere.name = `${handleName}.handle`;
 			node.add(sphere);
 			
 			let outline = new THREE.Mesh(sgSphere, outlineMaterial);
-			outline.scale.set(1.1, 1.1, 1.1);
+			outline.scale.set(1.4, 1.4, 1.4);
 			outline.name = `${handleName}.outline`;
 			sphere.add(outline);
 
 			let pickSphere = new THREE.Mesh(sgLowPolySphere, pickMaterial);
 			pickSphere.name = `${handleName}.pick_volume`;
-			pickSphere.scale.set(1.5, 1.5, 1.5);
+			pickSphere.scale.set(3, 3, 3);
 			sphere.add(pickSphere);
 			pickSphere.handle = handleName;
 			this.pickVolumes.push(pickSphere);
@@ -182,7 +172,7 @@ export class TransformationTool {
 			});
 
 			pickSphere.addEventListener("mouseleave", e => {
-				//node.setOpacity(OpaWhenNotSelect);
+				//node.setOpacity(0.4);
 			});
 		}
 	}
@@ -255,7 +245,7 @@ export class TransformationTool {
 
 			let pickSphere = new THREE.Mesh(sgLowPolySphere, pickMaterial);
 			pickSphere.name = `${handleName}.pick_volume`;
-			pickSphere.scale.set(2, 2, 2);
+			pickSphere.scale.set(3, 3, 3);
 			box.add(pickSphere);
 			pickSphere.handle = handleName;
 			this.pickVolumes.push(pickSphere);
@@ -303,7 +293,7 @@ export class TransformationTool {
 			});
 
 			pickSphere.addEventListener("mouseleave", e => {
-				//box.setOpacity(OpaWhenNotSelect);
+				//box.setOpacity(0.4);
 			});
 		}
 	}
@@ -318,13 +308,13 @@ export class TransformationTool {
 
 			let material = new THREE.MeshBasicMaterial({
 				color: handle.color,
-				opacity: OpaWhenNotSelect,
+				opacity: 0.4,
 				transparent: true});
 
 			let outlineMaterial = new THREE.MeshBasicMaterial({
-				color: OutlineColor, 
+				color: 0x000000, 
 				side: THREE.BackSide,
-				opacity: OpaWhenNotSelect,
+				opacity: 0.4,
 				transparent: true});
 
 			let pickMaterial = new THREE.MeshNormalMaterial({
@@ -335,7 +325,7 @@ export class TransformationTool {
 
 			let box = new THREE.Mesh(boxGeometry, material);
 			box.name = `${handleName}.handle`;
-			box.scale.set(1, 1, 36);
+			box.scale.set(0.2, 0.2, 40);
 			box.lookAt(new THREE.Vector3(...handle.alignment));
 			box.renderOrder = 10;
 			node.add(box);
@@ -343,13 +333,13 @@ export class TransformationTool {
 
 			let outline = new THREE.Mesh(boxGeometry, outlineMaterial);
 			outline.name = `${handleName}.outline`;
-			outline.scale.set(1.3, 1.3, 1.01);
+			outline.scale.set(3, 3, 1.03);
 			outline.renderOrder = 0;
 			box.add(outline);
 
 			let pickVolume = new THREE.Mesh(boxGeometry, pickMaterial);
 			pickVolume.name = `${handleName}.pick_volume`;
-			pickVolume.scale.set(4, 4, 1.1);
+			pickVolume.scale.set(12, 12, 1.1);
 			pickVolume.handle = handleName;
 			box.add(pickVolume);
 			this.pickVolumes.push(pickVolume);
@@ -373,10 +363,10 @@ export class TransformationTool {
 	}
 
 	initializeRotationHandles(){
-		let adjust = 1.5;
+		let adjust = 0.5;
 		let torusGeometry = new THREE.TorusGeometry(1, adjust * 0.015, 8, 64, Math.PI / 2);
-		let outlineGeometry = new THREE.TorusGeometry(1, adjust * 0.018, 8, 64, Math.PI / 2);
-		let pickGeometry = new THREE.TorusGeometry(1, adjust * 0.07, 6, 4, Math.PI / 2);
+		let outlineGeometry = new THREE.TorusGeometry(1, adjust * 0.04, 8, 64, Math.PI / 2);
+		let pickGeometry = new THREE.TorusGeometry(1, adjust * 0.1, 6, 4, Math.PI / 2);
 
 		for(let handleName of Object.keys(this.rotationHandles)){
 			let handle = this.handles[handleName];
@@ -385,16 +375,14 @@ export class TransformationTool {
 
 			let material = new THREE.MeshBasicMaterial({
 				color: handle.color,
-				opacity: OpaWhenNotSelect,
-				transparent: true
-            });
+				opacity: 0.4,
+				transparent: true});
 
 			let outlineMaterial = new THREE.MeshBasicMaterial({
-				color: OutlineColor, 
+				color: 0x000000, 
 				side: THREE.BackSide,
-				opacity: OpaWhenNotSelect,
-				transparent: true
-            });
+				opacity: 0.4,
+				transparent: true});
 
 			let pickMaterial = new THREE.MeshNormalMaterial({
 				opacity: 0.2,
@@ -404,7 +392,7 @@ export class TransformationTool {
 
 			let box = new THREE.Mesh(torusGeometry, material);
 			box.name = `${handleName}.handle`;
-			box.scale.set(30, 30, 30);
+			box.scale.set(20, 20, 20);
 			box.lookAt(new THREE.Vector3(...handle.alignment));
 			node.add(box);
 			handle.translateNode = box;
@@ -681,7 +669,7 @@ export class TransformationTool {
 			if(this.activeHandle === handle){
 				handle.node.setOpacity(1.0);
 			}else{
-				handle.node.setOpacity(OpaWhenNotSelect)
+				handle.node.setOpacity(0.4)
 			}
 		}
 
@@ -691,7 +679,7 @@ export class TransformationTool {
 			if(this.activeHandle === handle){
 				handle.node.setOpacity(1.0);
 			}else{
-				handle.node.setOpacity(OpaWhenNotSelect)
+				handle.node.setOpacity(0.4)
 			}
 		}
 
@@ -701,10 +689,10 @@ export class TransformationTool {
 			//if(this.activeHandle === handle){
 			//	handle.node.setOpacity(1.0);
 			//}else{
-			//	handle.node.setOpacity(OpaWhenNotSelect)
+			//	handle.node.setOpacity(0.4)
 			//}
 
-			handle.node.setOpacity(OpaWhenNotSelect);
+			handle.node.setOpacity(0.4);
 		}
 
 		for(let handleName of Object.keys(this.scaleHandles)){
@@ -715,21 +703,21 @@ export class TransformationTool {
 
 				let relatedFocusHandle = this.focusHandles[handle.name.replace("scale", "focus")];
 				let relatedFocusNode = relatedFocusHandle.node;
-				relatedFocusNode.setOpacity(OpaWhenNotSelect);
+				relatedFocusNode.setOpacity(0.4);
 
 				for(let translationHandleName of Object.keys(this.translationHandles)){
 					let translationHandle = this.translationHandles[translationHandleName];
-					translationHandle.node.setOpacity(OpaWhenNotSelect);
+					translationHandle.node.setOpacity(0.4);
 				}
 
 				//let relatedTranslationHandle = this.translationHandles[
 				//	handle.name.replace("scale", "translation").replace(/[+-]/g, "")];
 				//let relatedTranslationNode = relatedTranslationHandle.node;
-				//relatedTranslationNode.setOpacity(OpaWhenNotSelect);
+				//relatedTranslationNode.setOpacity(0.4);
 
 
 			}else{
-				handle.node.setOpacity(OpaWhenNotSelect)
+				handle.node.setOpacity(0.4)
 			}
 		}
 
@@ -779,7 +767,7 @@ export class TransformationTool {
 
 					let ws = node.parent.getWorldScale(new THREE.Vector3());
 
-					let s = (ScaleRatio / pr);
+					let s = (7 / pr);
 					let scale = new THREE.Vector3(s, s, s).divide(ws);
 
 					let rot = new THREE.Matrix4().makeRotationFromEuler(node.rotation);

+ 37 - 50
src/viewer/Axis.js

@@ -1,7 +1,7 @@
 
 
 import * as THREE from "../../libs/three.js/build/three.module.js"; 
-import {MeshDraw,LineDraw} from '../utils/DrawUtil'
+import {MeshDraw} from '../utils/DrawUtil'
  
 /*  
 
@@ -16,78 +16,66 @@ import {MeshDraw,LineDraw} from '../utils/DrawUtil'
              y
 
  */
- 
-var lineLen = 2, stemLen = 4, arrowLen = 2, lineDisToStem = 5;
-var opacity = 0.5
 export default class Axis extends THREE.Object3D {// 坐标轴
 	constructor (position) {
 		super()
-        this.getArrow() 
+        this.getGeometry() 
         this.createArrows()
         //this.position.copy(position) 点云的中心点就是在(0,0,0)
-        //this.scale.set(2,2,2)
+        this.scale.set(2,2,2)
     }
-    getArrow(){
-        var arrowGroup = new THREE.Object3D()
-        
-        
-        
-        var line = LineDraw.createLine([new THREE.Vector3, new THREE.Vector3(0,0,lineLen)])
-        var stem = new THREE.Mesh(new THREE.BoxGeometry(0.3, 0.3, stemLen)) 
-            stem.position.set(0,0,lineLen+lineDisToStem+stemLen/2);
-        var arrow = new THREE.Mesh(new THREE.CylinderBufferGeometry( 0, 0.6, arrowLen, 12, 1, false ));//radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 8, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2
-            arrow.position.set(0,0,lineLen+lineDisToStem+stemLen + arrowLen/2);
-            arrow.rotation.set(Math.PI/2,0,0)
-            
-        arrowGroup.add(stem)
-        arrowGroup.add(line)
-        arrowGroup.add(arrow)
-        
-        this.arrowGroup = arrowGroup
+    getGeometry(){
+        var geometry = MeshDraw.getShapeGeo([new THREE.Vector2(2,0), new THREE.Vector2(1,-2), new THREE.Vector2(1,-1), new THREE.Vector2(0,-1),
+            new THREE.Vector2(0,1), new THREE.Vector2(1,1), new THREE.Vector2(1,2)])
+        this.geometry = geometry
         
     } 
-    
-    
-    
     createArrows(){ 
 
 
         var material = new THREE.MeshBasicMaterial({color:"#00d7df",side:2,transparent:true,opacity:0.8, depthWrite:false});
-        let axis = Object.keys(Potree.config.axis)
-        axis.forEach((axisText)=>{
-            let color =  Potree.config.axis[axisText].color
-            var group = this.arrowGroup.clone()
-            
-            group.children.forEach(e=>{
-                e.material = e.material.clone()
-                /* e.material.opacity = opacity
-                e.material.transparent = true */
-                e.material.color.set(color)
-            })  
-            
-            var label = this.createLabel(axisText, color)  
-                label.position.set(0, 0, lineLen + stemLen + arrowLen + lineDisToStem + 3);
-                group.add(label) 
-        
+        var axisTexts = ['x','y','z'];
+        axisTexts.forEach(axisText=>{
+            var group = new THREE.Object3D()
+            var axis = new THREE.Mesh(this.geometry, material);
+            axis.scale.set(1,0.2,0.2)
+            axis.rotation.x = Math.PI * 0.3
+            group.add(axis)
+            axis.position.x = 0.5
+            var label = this.createLabel(axisText) 
+            group.add(label) 
+            label.position.set(3, 0, 0);
+
+
 
             if(axisText == 'y'){
-                group.rotation.x = Math.PI / 2
-            }else if(axisText == 'x'){
+                group.rotation.z = Math.PI / 2
+            }else if(axisText == 'z'){
                 group.rotation.y = -Math.PI / 2
-            } 
-            
+            }
             this.add(group)
-        }) 
+        })
+        
+        
+         
+        //axis.rotation.x = Math.PI / 2
+        //axis.scale.set(0.2, 0.1, 1);
+        //axis.position.x = 0.4
+         
+        
+
+  
+         
         
     }
 
-    createLabel(text,color){
+    createLabel(text){
         var canvas = document.createElement("canvas")
         var context = canvas.getContext("2d");
         canvas.width = 256,
         canvas.height = 256; 
         var fontSize = 120  
-        context.fillStyle =  color //"#00ffee";
+        context.fillStyle =  "#00d7df"//"#00ffee";
         context.font = "normal " + fontSize + "px 微软雅黑" 
         var textWidth = context.measureText(text).width; 
         context.clearRect(0,0,canvas.width,canvas.height);
@@ -105,7 +93,6 @@ export default class Axis extends THREE.Object3D {// 坐标轴
         })) 
         
         sprite.renderOrder = 1//防止在透明后还是出现白矩形挡住其他mesh
-        sprite.scale.set(3,3,3)
         return sprite
        
     }

+ 2 - 2
src/viewer/Scene.js

@@ -56,8 +56,8 @@ export class Scene extends EventDispatcher{
         //-------------
         this.axisArrow = new Axis();
         this.scene.add(this.axisArrow)
-        if(!Potree.settings.isDebug)this.axisArrow.visible = false
-        viewer.setObjectLayers(this.axisArrow,  'bothMapAndScene' )
+        this.axisArrow.visible = false
+        viewer.setObjectLayers(this.axisArrow, 'sceneObjects')
         
         
         

+ 6 - 6
src/viewer/View.js

@@ -217,17 +217,17 @@ export class View{
     setView(position, target, duration = 0, callback = null, onUpdate = null, Easing=''){
         //待改成quater渐变
         let endPosition = null;
-		/* if(position instanceof Array){
+		if(position instanceof Array){
 			endPosition = new THREE.Vector3(...position);
-		}else  */if(position.x != null){
-			endPosition = new THREE.Vector3().copy(position)
+		}else if(position.x != null){
+			endPosition = position.clone();
 		}
 
 		let endTarget = null;
-		/* if(target instanceof Array){
+		if(target instanceof Array){
 			endTarget = new THREE.Vector3(...target);
-		}else  */if(target && target.x != null){
-			endTarget = new THREE.Vector3().copy(target) 
+		}else if(target && target.x != null){
+			endTarget = target.clone();
 		}
 		const startPosition = this.position.clone();
 		const startTarget = this.getPivot();

+ 14 - 72
src/viewer/viewer.js

@@ -376,8 +376,8 @@ export class Viewer extends ViewerBase{
                 this.setShowBoundingBox(false);
                 this.setFreeze(false);
                 this.setControls(this.fpControls/* orbitControls */);
-                this.setBackground(new THREE.Color(Potree.config.background),1/* 'gradient' */);
-            
+                this.setBackground('gradient');
+
                 this.scaleFactor = 1;
 
                 this.loadSettingsFromURL();
@@ -617,7 +617,7 @@ export class Viewer extends ViewerBase{
 
 		if(bg === "skybox"){
 			this.skybox = Utils.loadSkybox(new URL(Potree.resourcePath + '/textures/skybox2/').href);
-		} 
+		}
 
 		this.background = bg;
         this.backgroundOpacity = 1//add
@@ -2410,11 +2410,6 @@ export class Viewer extends ViewerBase{
                 pRenderer.render(params);
                 
                 
-                {//渲染和地图共有的物体
-                    this.setCameraLayers(params.camera, [ 'bothMapAndScene'  ] )   
-                    this.renderer.render(this.scene.scene, params.camera);  
-                }
-                
                 this.renderOverlay(params) 
             } 
             
@@ -2428,13 +2423,6 @@ export class Viewer extends ViewerBase{
         
 	}
 	
-    setLimitFar(state){//切换是否limitFar
-        viewer.mainViewport.camera.limitFar = !!state
-        if(state){
-            viewer.mainViewport.camera.far = Potree.settings.displayMode == 'showPanos' ? viewer.farWhenShowPano : Potree.settings.cameraFar;
-            viewer.mainViewport.camera.updateProjectionMatrix()
-        }
-    }
     
     renderOverlay(params){
         let camera = params.camera ? params.camera : this.scene.getActiveCamera();
@@ -2700,50 +2688,22 @@ export class Viewer extends ViewerBase{
         duration = duration == void 0 ? 2000 : duration;     
         let camera = viewer.scene.getActiveCamera()
         
-        if (type == 'measure') {  
-            target.copy(object.getCenter()) 
-       
-            
-            var cameraTemp = camera.clone()
-            cameraTemp.lookAt(target);
-            cameraTemp.updateMatrix();
-            cameraTemp.updateMatrixWorld();
-            var inv = cameraTemp.matrixWorldInverse;
-           
+        if (type == 'measure') {
             let bound = new THREE.Box3() 
+            object.points.forEach(p => bound.expandByPoint(p))
             
-          
-            object.points.forEach(e=>{
-                var p = e.clone().applyMatrix4(inv);
-                bound.expandByPoint(p)
-            })
             let boundSize = bound.getSize(new THREE.Vector3)
+            let {center,radius} = bound.getBoundingSphere({center:new THREE.Vector3}) //用不box的算不准,就保守用sphere了,缺点是无法占满屏,优点是不会靠太近
+            target.copy(object.getCenter())//copy(center)
+           
+            let aspect = 1 
              
-            
-            if(!this.boundBox){
-                this.boundBox = new THREE.Mesh(new THREE.BoxGeometry(1,1,1,1));
-                this.boundBox.material.wireframe = true
-                this.boundBox.up.set(0,0,1)
-                this.boundBox.visible = false //打开以检查box
-                this.setObjectLayers(this.boundBox,'sceneObjects')
-                this.scene.scene.add(this.boundBox); 
-            }
-             
-            
-            this.boundBox.position.copy(target)
-            this.boundBox.scale.copy(boundSize)
-            this.boundBox.lookAt(camera.position)
-            
-             
-            
-            let aspect = boundSize.x / boundSize.y
             if(camera.aspect > aspect){//视野更宽则用bound的纵向来决定
-                dis = boundSize.y/2/ THREE.Math.degToRad(camera.fov / 2) + boundSize.z/2 
+                dis = radius/ THREE.Math.degToRad(camera.fov / 2)
             }else{
                 let hfov = cameraLight.getHFOVForCamera(camera, camera.aspect, 1 );
-                dis = boundSize.x/2 / THREE.Math.degToRad(hfov / 2) + boundSize.z/2
-            }//为何在只有两点的情况下,依然不能使box的边界刚好对着屏幕边界? 会缩小一些。  而三点以上的中心在这个视角上也不准确,所以点会超出box范围。
-             
+                dis =  radius / THREE.Math.degToRad(hfov / 2)
+            }
             
             if(o.mapDont || this.mapViewer.attachedToViewer){ 
                 this.mapViewer.fitToBound(target.clone(), boundSize.clone().multiplyScalar(2), duration)
@@ -2762,12 +2722,9 @@ export class Viewer extends ViewerBase{
                 pano && viewer.images360.flyToPano({pano, target, duration, deferred })
                 return deferred
             }
-            
         } else if (type == 'tag') {
-            //dimension = 1  
-            target.copy(object.position)
             const bestDistance = 2
-            
+            target.copy(object.position)
             if(Potree.settings.displayMode == 'showPointCloud'){ 
                 dis = bestDistance
                 let dir = new THREE.Vector3().subVectors(camera.position, target).normalize() 
@@ -2781,20 +2738,8 @@ export class Viewer extends ViewerBase{
                 pano && viewer.images360.flyToPano({pano, target, duration, deferred })
                 return deferred                
             }
-        }
-
-
-
- 
-         
-            
-        /*} else if(dimension == 2){//线
-            
-        }else if(dimension == 3){//面
-            
-        }else{//立体
             
-        } */
+        }
 
         viewer.scene.view.setView(position, target, duration, ()=>{
             deferred.resolve()
@@ -3049,9 +2994,6 @@ export class Viewer extends ViewerBase{
         
         
     }
-    
-    
-     
 };