xzw 2 năm trước cách đây
mục cha
commit
bd4b384fc0

BIN
build/potree/resources/textures/rtk-f-n.png


BIN
build/potree/resources/textures/rtk-f-s.png


BIN
build/potree/resources/textures/rtk-y-n.png


BIN
build/potree/resources/textures/rtk-y-s.png


+ 1 - 1
src/PointCloudOctree.js

@@ -274,7 +274,7 @@ export class PointCloudOctree extends PointCloudTree {
             this.nodeMaxLevel = level 
             //viewer.dispatchEvent({type:'updateNodeMaxLevel', pointcloud: this, nodeMaxLevel:level}) 
              
-             console.log('updateNodeMaxLevel ' + this.dataset_id + " : "+ this.nodeMaxLevel)                
+            //console.log('updateNodeMaxLevel ' + this.dataset_id + " : "+ this.nodeMaxLevel)                
               
             this.setPointLevel()//重新计算
              

+ 4 - 3
src/defines.js

@@ -28,11 +28,12 @@ export const ElevationGradientRepeat = {
 
 export const Buttons = {// MouseEvent.buttons
     //buttons,设置按下了鼠标哪些键,是一个3个比特位的二进制值,默认为0。1表示按下主键(通常是左键),2表示按下次要键(通常是右键),4表示按下辅助键(通常是中间的键)。
-	NONE:0,//add
-    
+	NONE:0,//add 
     LEFT: 0b0001,
 	RIGHT: 0b0010,
-	MIDDLE: 0b0100
+	MIDDLE: 0b0100,
+    'L+R': 0b0011
+    
 };
 /*  如果访问的是button, 用THREE.MOUSE来判断:
     button,设置按下了哪一个鼠标按键,默认为0。-1表示没有按键,0表示按下主键(通常是左键),1表示按下辅助键(通常是中间的键),2表示按下次要键(通常是右键)

+ 73 - 75
src/modules/Images360/Images360.js

@@ -251,7 +251,7 @@ export class Images360 extends THREE.EventDispatcher{
                 },
                 set:  (mode)=> {
                     latestRequestMode = mode
-                    //console.warn('Request setMode: ' + mode)  
+                    console.warn('Request setMode: ' + mode)  
                                    
                     if(mode != displayMode){ 
                         let config = Potree.config.displayMode[mode]
@@ -313,7 +313,8 @@ export class Images360 extends THREE.EventDispatcher{
                         
                             
                         if(config2.showSkybox || config2.pointUsePanoTex){ 
-                            let wait = ()=> {
+                            let wait = (e)=> {
+                                if(e.pano && e.pano != this.currentPano)return//loadedDepthImg
                                 setTimeout( ()=>{
                                     if(latestRequestMode == mode ){
                                         Potree.settings.displayMode = mode 
@@ -421,7 +422,7 @@ export class Images360 extends THREE.EventDispatcher{
                          
                          
                         this.dispatchEvent({type:'endChangeMode',mode})  
-                        //console.log('setModeSuccess: ' + mode)       
+                        console.log('setModeSuccess: ' + mode)       
                     }else{
                         
                         //this.dispatchEvent({type:'endChangeMode',mode})    
@@ -663,7 +664,7 @@ export class Images360 extends THREE.EventDispatcher{
             this.dispatchEvent({type:'flyToPano', toPano})
             return done(true);
         }
-        if(this.latestToPano && this.latestToPano != toPano){
+        if(this.latestToPano && this.latestToPano != toPano){//还在飞
             return done(false)
         }
         
@@ -689,7 +690,8 @@ export class Images360 extends THREE.EventDispatcher{
         
         {//不飞的话是否不要执行这段?
             
-            let wait = ()=> {
+            let wait = (e)=> {
+                if(e.pano && this.latestToPano && e.pano != this.latestToPano.pano)return//loadedDepthImg
                 if(this.latestToPano != toPano)return Potree.Log('已经取消')//如果取消了
                 setTimeout(()=>{ 
                     if(this.latestToPano != toPano)return
@@ -697,7 +699,7 @@ export class Images360 extends THREE.EventDispatcher{
                 },1)
                 this.removeEventListener('loadedDepthImg', wait)
             }
-            if(!pano.depthTex && pano.pointcloud.hasDepthTex){ //需要用到depthTex计算neighbour
+            if(!pano.depthTex && pano.pointcloud.hasDepthTex){ //点云模式也要加载depthTex,因获取neighbour需要用到
                 this.addEventListener('loadedDepthImg', wait)           
                 return pano.loadDepthImg()
             }
@@ -822,7 +824,7 @@ export class Images360 extends THREE.EventDispatcher{
                 this.resetHighMap() 
             }
             
-            this.smoothZoomTo(1, toPano.duration / 2);  
+            this.smoothZoomTo(toPano.zoomLevel || 1, toPano.duration / 2);  
         }
              
         
@@ -1609,7 +1611,7 @@ export class Images360 extends THREE.EventDispatcher{
             
             if(pano0.pointcloud != pano1.pointcloud){ //距离太远的数据集,过渡会畸变。所以扩大skybox
                 let dis = pano0.position.distanceTo(pano1.position)
-                if(dis > 100){ 
+                if(dis > 50){ 
                     let bound = getPanoBound(pano0).union(getPanoBound(pano1))
                     let size = bound.getSize(new THREE.Vector3) 
                     let max = Math.max(size.x, size.y, size.z)
@@ -1730,7 +1732,7 @@ export class Images360 extends THREE.EventDispatcher{
                 })
                 
                 //剔除那些突然间离相机很近的dir。有可能是拍摄的人、或者杆子、树
-                const maxRatio = 8  
+                
                 /* dirs2.forEach((e,i)=>{
                     console.log(i,  e.dis)
                     let smallThanBefore = ()=>{
@@ -1752,6 +1754,7 @@ export class Images360 extends THREE.EventDispatcher{
                     }                        
                     
                 }) */
+                const maxRatio1 = 3  , maxRatio2 = 8  //超过maxRatio1就要加入判断,而最终结果的设限其实是maxRatio2 
                 const minWidth = 0.5 
                 let computeWidth = (start,end)=>{
                     start+=1 //不包含start和end
@@ -1769,21 +1772,28 @@ export class Images360 extends THREE.EventDispatcher{
                     start+=1 //不包含start和end
                     for(let m=start;m<end;m++){ 
                         dirs2[m].disB = dirs2[end].dis * 0.8
-                        console.log('changeDis', m, dirs2[m].disB) 
+                        //console.log('changeDis', m, dirs2[m].disB) 
                     }
                 }
                 let start = -1 
                 for(let i=0;i<count1;i++){//遍历时将左边dis比之小很多且宽度较小的改大 
                     //console.log(i, dirs2[i].dis) 
                     let j = i-1
-                    while(j>start && dirs2[i].dis / dirs2[j].dis > maxRatio){
-                        j--    
-                    } 
-                    let count = i-j
-                    if(count > 1 && (count == 2 || computeWidth(j,i)<minWidth)){//若只有一个不用判断宽度直接修改,count == 2 即只有一个
+                    let ratios = 0
+                    while(j>start && dirs2[i].dis / dirs2[j].dis > maxRatio1){
+                        ratios += dirs2[i].dis / dirs2[j].dis 
+                        j--  
+                    }  
+                    let count = i-j-1
+                    ratios /= count
+                    if(count > 0 && computeWidth(j,i)< minWidth * ratios / maxRatio2  ){
                         changeDis(j,i)  
                         start = i  //在此之前的修改过,之后不用再判断
                     }
+                    /* if(count > 0  && (count == 1 || computeWidth(j,i)<minWidth)){//若只有一个不用判断宽度直接修改
+                        changeDis(j,i)  
+                        start = i  //在此之前的修改过,之后不用再判断
+                    } */
                 } 
                  
                  
@@ -1807,14 +1817,33 @@ export class Images360 extends THREE.EventDispatcher{
                 /* let sideDis_ = [(sideDis0[0] + sideDis1[1])/2,  (sideDis0[1] + sideDis1[0])/2];
                 let sideDis = [Math.min(sideDis0[0] , sideDis1[1]),  Math.min(sideDis0[1] , sideDis1[0])]//
                  */
-                
+                /* let maxH = 40, minH = 2, height = pano.ceilZ - pano.floorPosition.z, minR = 0.5, maxR = 2  
+                 
+                let r = minR + ( maxR - minR) * THREE.Math.clamp((height - minH)  / (maxH - minH),0,1)   //THREE.Math.smoothstep(currentDis,  op.nearBound,  op.farBound);
+                 
+                let getZ = (deg)=>{
+                    deg *= r 
+                    deg = THREE.Math.clamp(deg, 1,  80);
+                    return Math.tan(THREE.Math.degToRad(deg))
+                }
+                 */
                 
                 if(pano0.pointcloud.hasDepthTex && pano0.pointcloud.hasDepthTex){
                     let panos = [pano0,pano1]
                     let vecs = [vec.clone().negate(), vec]
                     let axis = [[-1,1],[1,-1]]
                     let dis2d = new THREE.Vector2().subVectors(pano0.position, pano1.position).length()//水平上的距离
-                    let angles = [THREE.Math.degToRad(40), THREE.Math.degToRad(70)] //正的在左边  尽量能够平分中间这段墙体
+                     
+                    let maxDis = 50, minDis = 0.5,  minR = 0.2, maxR = 1.2 
+                    let r = maxR - ( maxR - minR) * THREE.Math.clamp((dis2d - minDis)  / (maxDis - minDis),0,1) //dis2d越大,角度要越小  //THREE.Math.smoothstep(currentDis,  op.nearBound,  op.farBound);
+                    //console.log('dis2d',dis2d,'r',r) 
+                    let angles = [35,65].map(deg=>{ //正的在左边  尽量能够平分中间这段墙体。 
+                        let angle = THREE.Math.clamp(deg * r, 5, 80);
+                        //console.log('angle',angle)  
+                        return THREE.Math.degToRad(angle)
+                    })     
+                  
+                    //let angles = [THREE.Math.degToRad(40), THREE.Math.degToRad(70)] 
                     axis.forEach((axis_, index0)=>{
                         let disToSides = []
                         let accordingPano = index0 == 0 ? pano0 : pano1; //根据离该点在vec方向上的距离顺序来存顶点
@@ -2610,7 +2639,7 @@ export class Images360 extends THREE.EventDispatcher{
      
 
     zoomFovTo( fov ) { //通过fov来算zoomLevel 
-        let zoomLevel = this.baseFov / fov;
+        let zoomLevel = Potree.config.view.fov /* this.baseFov */ / fov;
         this.zoomTo( zoomLevel );
     }
 	smoothZoomTo(aimLevel, dur=0) {
@@ -2628,50 +2657,34 @@ export class Images360 extends THREE.EventDispatcher{
 	}
     
     
-    /* zoomDefault{
-        this.zoomTo(1, !0)
-    } 
-    smoothZoomToDefault(e, t) {
-        var i, n = this.zoomLevel,
-            r = function(e) {
-                e > 1 && (e = 1),
-                    i = n * (1 - e) + e,
-                    this.zoomTo(i, !0)
-            }
-            .bind(this),
-            o = function() {
-                this.zoomDefault(),
-                    t && window.setTimeout(t, 50)
-            }
-            .bind(this);
-        transitions.start(r, e, o, null, 0, easing[settings.transition.blendEasing])
-    } */
-
+  
     
 
     updateZoomPano() { 
         if (!this.panoRenderer.zoomPanoRenderingDisabled && Potree.settings.displayMode == 'showPanos') {
             var currentPano = this.currentPano;
             if (currentPano) {
-                var activationThreshold =  Potree.settings.navTileClass == '2k' && Potree.settings.tileClass == '4k' ? 1.7 : Potree.settings.zoom.activationThreshold//1.1
-                var t = this.zoomLevel > activationThreshold,
+                
+                let levelThreshold1 = Potree.settings.navTileClass == '1k' ? 1.3 : 1.7 , levelThreshold2 = 2
+                 
+                var t = this.zoomLevel > levelThreshold1,
                     n = !(this.flying && this.nextPano && this.nextPano !== this.currentPano),
                     r = t && n;
                 this.tileDownloader.tilePrioritizer.setZoomingActive(r);
                 this.panoRenderer.setZoomingActive(r, currentPano, !0);
                 
-                var o = (pano, zoomedFlag)=>{
+                var o = (pano, ifZoom)=>{
                     this.panoRenderer.resetRenderStatus(pano.id, !1, !0, this.qualityManager.getMaxNavPanoSize());
                     this.panoRenderer.clearAllQueuedUploadsForPano(pano.id);
                     this.panoRenderer.renderPanoTiles(pano.id, null, !1, !1);
-                    pano.setZoomed(zoomedFlag);
+                    pano.setZoomed(ifZoom);
                 }
                   
                 
-                if (r && (!currentPano.zoomed || this.qualityManager.zoomLevelResolution && this.qualityManager.zoomLevelResolution != '4k')) {
+                if (r && (!currentPano.zoomed || this.qualityManager.zoomLevelResolution && this.qualityManager.zoomLevelResolution != '4k')) {//needZoom
                     currentPano.zoomed || o(currentPano, !0); 
                     
-                    if(Potree.settings.navTileClass == '1k' && Potree.settings.tileClass != '1k' && this.zoomLevel < 2){
+                    if(Potree.settings.navTileClass == '1k' && Potree.settings.tileClass != '1k' && this.zoomLevel < levelThreshold2){
                         this.panoRenderer.enableHighQuality( function() {//开启2k 
                             if(Potree.settings.tileClass != '4k')  o(currentPano, !0); 
                         }.bind(this));
@@ -2687,23 +2700,23 @@ export class Images360 extends THREE.EventDispatcher{
                 
                 
                 
-                if(r && Potree.settings.navTileClass == '1k' && Potree.settings.tileClass == '4k'  ){ //目前只有手机端navTileClass == '1k'
+                if(r && Potree.settings.navTileClass == '1k' && Potree.settings.tileClass == '4k'  ){ //目前只有手机端navTileClass == '1k' (分三个梯度)
                     var change = (zoomedFlag)=>{ 
                         this.qualityManager.updateMaximums()//更新maxZoomPanoSize
                         this.panoRenderer.setupZoomRenderTarget() //更新renderTarget  
                         //currentPano.setZoomed(t);//更新uniforms贴图 
                     }
-                    this.qualityManager.zoomLevelResolution = this.zoomLevel >= 2 ? '4k' : this.zoomLevel > 1.1 ? '2k' : '1k'
+                    this.qualityManager.zoomLevelResolution = this.zoomLevel >= levelThreshold2 ? '4k' : this.zoomLevel > levelThreshold1 ? '2k' : '1k'
                     
-                    if(this.oldZoomLevel < 2 && this.zoomLevel >= 2){//1k/2k-4k
+                    if(this.oldZoomLevel < levelThreshold2 && this.zoomLevel >= levelThreshold2){//1k/2k-4k
                         change()
                         o(currentPano, t)
-                    }else if(this.oldZoomLevel <= Potree.settings.zoom.activationThreshold && this.zoomLevel > Potree.settings.zoom.activationThreshold){//1k-2k
+                    }else if(this.oldZoomLevel <= levelThreshold1 && this.zoomLevel > levelThreshold1){//1k-2k
                         change()
-                    }else if(this.oldZoomLevel > 2 && this.zoomLevel <= 2){//4k-2k/1k
+                    }else if(this.oldZoomLevel > levelThreshold2 && this.zoomLevel <= levelThreshold2){//4k-2k/1k
                         change()
                         o(currentPano, t)
-                    }else if(this.oldZoomLevel > Potree.settings.zoom.activationThreshold && this.zoomLevel <= Potree.settings.zoom.activationThreshold){//2k-1k
+                    }else if(this.oldZoomLevel > levelThreshold1 && this.zoomLevel <= levelThreshold1){//2k-1k
                         change() 
                     } 
                     this.oldZoomLevel = this.zoomLevel  
@@ -2741,7 +2754,7 @@ export class Images360 extends THREE.EventDispatcher{
                         
                         if(Potree.settings.isTest){
                             var colorHue = Math.random();
-                            tile.material.color = (new THREE.Color()).setHSL(colorHue, 0.5, 0.9)  
+                            tile.material.color = (new THREE.Color()).setHSL(colorHue, 0.6, 0.7)  
                         }
                         
                         tile.visible = false 
@@ -2782,7 +2795,11 @@ export class Images360 extends THREE.EventDispatcher{
             cube.name = 'highMapCube'
             this.highMapCube = cube
             viewer.scene.scene.add(cube)
-            //cube.scale.set(0.01,0.01,0.01)
+            
+            {
+                let s = 0.1
+                cube.scale.set(s,s,s)
+            }//注:由于原本的mesh上加了深度贴图,可能距离镜头比这里的近。凡是在cube以内的部分都会挡住cube导致模糊。但是应该不常见吧。
             
             this.highMapCube.visible = false; 
             viewer.setObjectLayers(this.highMapCube, 'sceneObjects'/* 'skybox' */) //如果是skybox层,点云可见时会被遮住,depthTest为false呢? 但不会遮住场景物体
@@ -2859,6 +2876,7 @@ export class Images360 extends THREE.EventDispatcher{
         if(!this.highMapCube)   return 
         //console.warn('showHighMap')
         this.highMapCube.visible = true; 
+         
     } 
     hideHighMap(){ 
         if(!this.highMapCube)   return
@@ -2881,10 +2899,7 @@ export class Images360 extends THREE.EventDispatcher{
             //} 
             let pano = new Panorama( info, this   );
             
-            /* pano.mesh.layers.set(Potree.config.renderLayers.marker)
-            pano.marker.layers.set(Potree.config.renderLayers.marker)  */
-            
-            
+          
             pano.addEventListener('dispose',(e)=>{
                 if(this.closestPano == pano) this.closestPano = null
             })
@@ -2910,29 +2925,12 @@ export class Images360 extends THREE.EventDispatcher{
         
         this.tileDownloader.setPanoData(this.panos, [] /* , Potree.settings.number */);
 
-        {
-            /* var panosBound = new THREE.Box3
-            this.panos.forEach(pano=>{
-                panosBound.expandByPoint(pano.position)
-            }) 
-            let center = panosBound.getCenter(new THREE.Vector3)
-            let minBound = (new THREE.Box3()).setFromCenterAndSize(center, new THREE.Vector3(1,1,1))
-            panosBound.union(minBound)
-           
-            this.bound = {
-                bounding:panosBound,
-                size: panosBound.getSize(new THREE.Vector3),
-                center,
-            } */
-            
+        { 
             let minSize = new THREE.Vector3(1,1,1)
             this.bound = math.getBoundByPoints(this.panos.map(e=>e.position), minSize)
-            
-            
+             
             viewer.scene.pointclouds.forEach(pointcloud=>pointcloud.getPanosBound()) 
-            
              
-            
         }
         
         
@@ -3010,7 +3008,7 @@ Images360.prototype.checkAndWaitForPanoLoad = function() {
             throw msg;
         }
     }
-}()
+}()//加载全景图的流程:请求下载当前点的最低分辨率图(不过有可能已经下载了),并且请求uploadTile渲染当前漫游点,若tile都upload完(先6个)会发送消息,LoadComplete 从而回调成功。
 
 
 

+ 6 - 4
src/modules/Images360/tile/PanoRenderer.js

@@ -8,7 +8,9 @@ import TileUtils from './TileUtils'
 import {settings,config} from '../../../settings.js'
 /* import config from '../../config' */
 import * as THREE from "../../../../libs/three.js/build/three.module.js"; 
-import math from '../../../utils/math.js' 
+import math from '../../../utils/math.js'  
+import browser from '../../../utils/browser.js'
+
 
 function createDescriptor() {
     var e = {
@@ -149,7 +151,7 @@ class PanoRenderer extends THREE.EventDispatcher{
             r && this.deactiveDescripor(r.renderTarget) 
             r = this.activeDescripor(l)  
             if (!r) { 
-                var ren = this.initTiledPano(l, true); 
+                var ren = this.initTiledPano(l, !browser.isMobile()); 
                 r = this.initDescriptor(ren.width);
                 r.renderTarget = ren;
             }
@@ -274,7 +276,7 @@ class PanoRenderer extends THREE.EventDispatcher{
         texture.minFilter = THREE.LinearFilter)   
         
         //平时还是直接用LinearMipMapLinearFilter,其实并非不清晰,只是没有加锐化,像加了层柔光和抗锯齿,观感更好。放大后使用LinearFilter
-        
+        // 如果抗锯齿的话,采用mipmap,会增加一倍的存储消耗。原版本都是不抗锯齿的。但是抗锯齿效果更柔和
         
         
         renderTarget.texture = texture //居然漏了一句,2022.10.9补
@@ -757,7 +759,7 @@ PanoRenderer.prototype.setupZoomRenderTarget = function(){
             if(targets[size]){
                 this.zoomRenderTarget = targets[size]
             }else{
-                this.zoomRenderTarget = this.initTiledPano(size, false  )
+                this.zoomRenderTarget = this.initTiledPano(size, false  ) //放大后不使用抗锯齿,否则消
                 targets[size] = this.zoomRenderTarget
             }
             

+ 5 - 2
src/modules/Images360/tile/QualityManager.js

@@ -133,8 +133,11 @@ export default class QualityManager {
         return this.getPanoSize(e)
     }
 
-    detectMaxZoomPanoSize() { 
-        if(this.zoomLevelResolution){
+    detectMaxZoomPanoSize() { //获取当前zoomRenderTarget应下载的最高级别
+    
+        //若是有三个级别,每次只需要加载到当前的zoomLevel;而两级时因为有zoomed来判断是使用基本贴图还是zoomRenderTarget,所以只需要返回最大的即可
+            
+        if(this.zoomLevelResolution){//有三个级别
             if(this.zoomLevelResolution == '4k' && this.useUltraHighResolutionPanos){
                 return this.getPanoSize(PanoSizeClass.ULTRAHIGH);
             }else if(this.zoomLevelResolution == '1k' || !this.useHighResolutionPanos){

+ 23 - 7
src/modules/Images360/tile/TileDownloader.js

@@ -59,7 +59,7 @@ class TileDownloader extends THREE.EventDispatcher{
     start() { 
         this.downloadCubeTex = true 
         if(!Potree.settings.useDepthTex){
-            viewer.updateVisible(this,'pano', true )
+            viewer.updateVisible(this,'showPanos', true )
             this.judgeStart()            
         }else{
             this.refreshInterval || this.judgeStart()
@@ -69,7 +69,7 @@ class TileDownloader extends THREE.EventDispatcher{
     stop() {
         this.downloadCubeTex = false
         if(!Potree.settings.useDepthTex){
-            viewer.updateVisible(this,'pano', false )
+            viewer.updateVisible(this,'showPanos', false )
             this.judgeStart()
         } 
     }
@@ -359,8 +359,8 @@ class TileDownloader extends THREE.EventDispatcher{
 
     
 
-    getTiles(d, sceneNum){
-        if(Potree.settings.isLocal2 && !this.local2SrcFailed){//新的地址  scene_view_data/场景码/images/tiles
+    getTiles(d, sceneNum, useV4url){
+        if(Potree.settings.isLocal2 && !this.local2SrcFailed || useV4url){//新的地址  scene_view_data/场景码/images/tiles
             return `${Potree.settings.urls.prefix3}/scene_view_data/${sceneNum}/images/${d}`    
         }
         
@@ -444,7 +444,8 @@ TileDownloader.prototype.getTileUrl = function() {
             panoSize = o.panoSize,
             tileSize = o.tileSize,
             tileIndex = o.tileIndex,
-            sceneCode = o.pano.pointcloud.sceneCode
+            sceneCode = o.pano.pointcloud.sceneCode,
+            useV4url = Potree.settings.testV4url /* && o.pano.pointcloud.useV4url */     //v4的全景图等路径不一样  
         var metadata = {sceneScheme:10}  
         
         
@@ -461,7 +462,7 @@ TileDownloader.prototype.getTileUrl = function() {
             //1 === config.tiling.customCompression && (u = "_" + config.tiling["q" + e[panoSize]]);
             //1 === o.tiling.customCompression && (u = "_" + o.tiling["q" + e[n]]);
             d = "tiles/" + id + "/" + e[panoSize] + u + "_face" + h + "_" + t.tileX + "_" + t.tileY + ".jpg" 
-            d =  this.getTiles(d, sceneCode);
+            d =  this.getTiles(d, sceneCode, useV4url);
             g = "?"  
           
         }else{//阿里云oss的规则   if (metadata.sceneScheme == 10) 
@@ -490,7 +491,7 @@ TileDownloader.prototype.getTileUrl = function() {
                 } 
             }
             
-            d = this.getTiles(d, sceneCode);
+            d = this.getTiles(d, sceneCode, useV4url);
             g = "&" 
         } 
         
@@ -505,6 +506,21 @@ TileDownloader.IDLE_REFRESH_DELAY = 500;
 TileDownloader.ACTIVE_REFRESH_DELAY = 16;
 TileDownloader.DOWNLOAD_RETRIES = 4;
 
+
+
+
+/* 
+源:https://4dkk.4dage.com/images/imagesSS-t-ZZR7oKnlIl
+目标:https://4dkk.4dage.com/scene_view_data/SS-t-ZZR7oKnlIl/images
+
+源:https://4dkk.4dage.com/data/dataSS-t-ZZR7oKnlIl
+目标:https://4dkk.4dage.com/scene_view_data/SS-t-ZZR7oKnlIl/data
+
+源:https://4dkk.4dage.com/video/videoSS-t-ZZR7oKnlIl
+目标:https://4dkk.4dage.com/scene_view_data/SS-t-ZZR7oKnlIl/video
+ */
+
+
 // var tileconc = TileDownloader.tilegen ? 6 : 2;
 // publicObjectSet.tileDownloader = new TileDownloader({
 //     concurrentDownloads: tileconc

+ 61 - 27
src/modules/panoEdit/panoEditor.js

@@ -13,7 +13,7 @@ import SplitScreen from "../../utils/SplitScreen.js"
 
 
 
-let clickPanoToLink = false;//是否在编辑漫游点连接时,通过点击漫游点能修改连接
+let clickPanoToDisLink = false;//是否在编辑漫游点连接时,通过点击漫游点能断开连接
 let images360, Alignment,  SiteModel 
 
 const texLoader = new THREE.TextureLoader() 
@@ -491,7 +491,7 @@ class PanoEditor extends THREE.EventDispatcher{
         this.updateTranCtl()
         this.setTranMode(this.tranMode) // update
         this.setZoomInState(false) //取消放大模式
-        
+        this.updatePointLevels()
     }
     
     
@@ -636,6 +636,7 @@ class PanoEditor extends THREE.EventDispatcher{
         }
          
         informBy2d || this.dispatchEvent({type:"switchPanoVisible", pano, v})
+        this.updatePointLevels()
     } 
      
     
@@ -697,7 +698,7 @@ class PanoEditor extends THREE.EventDispatcher{
             if(this.selectedLine){
                 this.selectedLine.dispatchEvent('click')//删除 
             } 
-            if(this.selectedPano && clickPanoToLink){
+            if(this.selectedPano && clickPanoToDisLink){
                 this.selectedPano.circle.dispatchEvent('click')//删除 
             }
         }
@@ -885,27 +886,34 @@ class PanoEditor extends THREE.EventDispatcher{
     
     addPanoMesh(){ 
         let map = texLoader.load(Potree.resourcePath+'/textures/correct_n.png' )  
-        circleMats.default = new THREE.MeshBasicMaterial({
+        circleMats.default_normal = new THREE.MeshBasicMaterial({
             map,
             color: 0xffffff,
             transparent: true,
             depthTest: false,
             depthWrite: false,  
         })
-        circleMats.hovered = new THREE.MeshBasicMaterial({
-            map, 
-            color: 0xffff00,
-            transparent: true,
-            depthTest: false,
-            depthWrite: false,  
-        })
-        circleMats.selected = new THREE.MeshBasicMaterial({
-            map: texLoader.load(Potree.resourcePath+'/textures/correct_s.png' ) ,  
-            color: 0xffffff,
-            transparent: true,
-            depthTest: false,
-            depthWrite: false, 
-        })
+        circleMats.default_rtk_on = circleMats.default_normal.clone();
+        circleMats.default_rtk_on.map = texLoader.load(Potree.resourcePath+'/textures/rtk-y-n.png' )  
+        circleMats.default_rtk_off = circleMats.default_normal.clone();
+        circleMats.default_rtk_on.map = texLoader.load(Potree.resourcePath+'/textures/rtk-f-n.png' )  
+        circleMats.selected_normal = circleMats.default_normal.clone();
+        circleMats.selected_normal.map = texLoader.load(Potree.resourcePath+'/textures/correct_s.png' ) 
+        circleMats.selected_rtk_on = circleMats.default_normal.clone();
+        circleMats.selected_rtk_on.map = texLoader.load(Potree.resourcePath+'/textures/rtk-y-s.png' ) 
+        circleMats.selected_rtk_off = circleMats.default_normal.clone();
+        circleMats.selected_rtk_off.map = texLoader.load(Potree.resourcePath+'/textures/rtk-f-s.png' ) 
+        
+        circleMats.hovered_normal = circleMats.default_normal.clone();
+        circleMats.hovered_normal.color.set(0x00ff00)
+        circleMats.hovered_rtk_on = circleMats.default_rtk_on.clone();
+        circleMats.hovered_rtk_on.color.set(0x00ff00) 
+        circleMats.hovered_rtk_off = circleMats.default_rtk_off.clone();
+        circleMats.hovered_rtk_off.color.set(0x00ff00)
+        
+         
+        
+        
         
         let setPos = (circle)=>{
              circle.position.copy(circle.pano.position)
@@ -924,12 +932,12 @@ class PanoEditor extends THREE.EventDispatcher{
          
         
         images360.panos.forEach(pano=>{
-            var circle = new Sprite({mat: circleMats.default, sizeInfo:{
+            var circle = new Sprite({mat: circleMats['default' + '_'+ this.getPanoRtkState(pano) ] , sizeInfo:{
                     minSize : 50 ,  maxSize : 120,   nearBound : 2, farBound : 10, 
                 },
                 renderOrder : renderOrders.circle,
                 pickOrder: renderOrders.circle
-            })   //new THREE.Sprite(circleMats.default) 
+            })    
             
             circle.name = 'panoCircle'
             circle.sid = pano.id
@@ -943,7 +951,7 @@ class PanoEditor extends THREE.EventDispatcher{
             pano.addEventListener('rePos', setPos.bind(this,circle))
                
             let drag = ()=>{
-                if(this.activeViewName == 'mainView')return
+                if(this.tranMode != 'translate' || this.activeViewName == 'mainView' )return
                 this.selectPano(circle.pano)                    //为了方便拖拽点云,拖动circle就直接选中
               
                 viewer.inputHandler.drag.object = null  //取消拖拽状态,否则不触发点云拖动
@@ -963,12 +971,12 @@ class PanoEditor extends THREE.EventDispatcher{
             circle.addEventListener('click', ()=>{ 
                 //if(this.activeViewName == 'mainView')return
                 if(this.clickToZoomInEnabled)return
-                if(clickPanoToLink && this.operation == 'removeLink'){ 
+                if(clickPanoToDisLink && this.operation == 'removeLink'){ 
                     this.linkChange(pano, null, 'remove')  //删除所有连接
                 } 
                 
                 if(this.selectedPano == circle.pano) return this.selectPano(null)
-                if(clickPanoToLink && this.operation == 'addLink' && this.selectedPano){
+                if(this.operation == 'addLink' && this.selectedPano){
                     this.linkChange(this.selectedPano, circle.pano, 'add')
                     //this.setLinkOperateState('addLink',false)
                     return
@@ -1008,7 +1016,7 @@ class PanoEditor extends THREE.EventDispatcher{
                     type : "CursorChange", action : "add",  name:"hoverPano"
                 });
             } 
-            if(this.selectedPano != pano)  pano.circle.material = circleMats.hovered 
+            if(this.selectedPano != pano)  pano.circle.material = circleMats['hovered' + '_'+ this.getPanoRtkState(this.selectedPano) ] 
              
         }else if(pano && !state){//unhover
             if(this.hoveredPano != pano)return
@@ -1016,7 +1024,7 @@ class PanoEditor extends THREE.EventDispatcher{
             viewer.dispatchEvent({
                 type : "CursorChange", action : "remove",  name:"hoverPano"
             });
-            if(this.selectedPano != pano)  pano.circle.material = circleMats.default 
+            if(this.selectedPano != pano)  pano.circle.material = circleMats['default' + '_'+ this.getPanoRtkState(this.selectedPano) ] 
             this.hoveredPano = null;
         }else{//unhover any
             if(this.hoveredPano){
@@ -1031,7 +1039,7 @@ class PanoEditor extends THREE.EventDispatcher{
         let lastSeletedPano = this.selectedPano
         if(this.selectedPano){ 
             
-            this.selectedPano.circle.material = circleMats.default 
+            this.selectedPano.circle.material = circleMats['default' + '_'+ this.getPanoRtkState(this.selectedPano) ] 
             this.selectedPano.circle.renderOrder = renderOrders.circle 
 
             if(this.activeViewName == 'mainView'){
@@ -1050,7 +1058,7 @@ class PanoEditor extends THREE.EventDispatcher{
         this.updateSelectGroup();
         
         if(pano){
-            this.selectedPano.circle.material = circleMats.selected  
+            this.selectedPano.circle.material = circleMats['selected' + '_'+ this.getPanoRtkState(this.selectedPano) ] 
             this.selectedPano.circle.renderOrder = this.selectedPano.circle.pickOrder = renderOrders.circleSelected //侧视图能显示在最前
              
             if(this.activeViewName == 'mainView'){
@@ -1103,7 +1111,33 @@ class PanoEditor extends THREE.EventDispatcher{
     }
     
     
+    updatePointLevels(){
+        let percent = 1
+        if(this.activeViewName == 'mainView'){
+            //假设每个pointcloud所带的点个数大致相同,那么当可见点云个数越多,所能展示的level越低,否则因总个数超过budget的话密度会参差不齐。
+            let visiCount = viewer.scene.pointclouds.filter(e=>e.visible).length
+            let maxCount = 70, minCount = 1,  minPer = 0.3, maxPer = 1
+            percent = maxPer - ( maxPer - minPer) * THREE.Math.clamp((visiCount - minCount)  / (maxCount - minCount),0,1) //dis2d越大,角度要越小  
+            //pointcloud.changePointSize()
+            console.log('updatePointLevels', percent, visiCount) 
+        
+        } 
+        
+        
+        Potree.settings.UserDensityPercent = percent 
+        viewer.setPointLevels()
+             
+    }
     
+    getPanoRtkState(pano){
+        //'normal'  'rtk_on'  'rtk_off' 
+        return  'normal'
+    } 
+    changePanoRtkState(state){
+        if(pano.rtkState){
+            pano.rtkState = state
+        }
+    }
     
     updateSelectGroup(){//更新选中的组
         this.selectedGroup = this.panoGroup.find(e=>e.includes(this.selectedPano)) 

+ 10 - 9
src/modules/siteModel/SiteModel.js

@@ -606,15 +606,16 @@ var SiteModel = {
     
     
     addEntity:function(entity, parent){ 
-        this.meshGroup.add(entity);
-        this.entities.push(entity)
-        if(entity.buildType == 'building'){
-            this.buildings.push(entity)
-        }else{ 
-            parent.buildChildren.push(entity)
-            
-        }   
-         
+        if(entity.buildType != 'hole'){
+            this.meshGroup.add(entity);
+            this.entities.push(entity)
+            if(entity.buildType == 'building'){
+                this.buildings.push(entity)
+            }else{ 
+                parent.buildChildren.push(entity)
+                
+            }   
+        }
     
         if(entity.buildType == 'room'){
             entity.addEventListener('marker_dropped',()=>{

+ 4 - 4
src/navigation/FirstPersonControls.js

@@ -88,8 +88,8 @@ export class FirstPersonControls extends THREE.EventDispatcher {
                 } 
             }else{
                 //mode = e.buttons === Buttons.LEFT && (!e.dragViewport || e.dragViewport.name == 'MainView') ? 'rotate' : 'pan'
-                mode = e.buttons === Buttons.LEFT && camera.type != 'OrthographicCamera' ? 'rotate' : 'pan'
-            }
+                mode = (e.buttons === Buttons.LEFT || e.buttons === Buttons['L+R']) && camera.type != 'OrthographicCamera' ? 'rotate' : 'pan'
+            }//加'L+R'是因鼠标有时候出问题
             //console.log('mode  ', mode )
             let moveSpeed = this.currentViewport.getMoveSpeed();
             if (e.drag.startHandled === undefined) {///???????
@@ -752,9 +752,9 @@ export class FirstPersonControls extends THREE.EventDispatcher {
             this.yawDelta = 0
             this.pitchDelta = 0 
 		}
-        if(this.translationWorldDelta.length()>0) {
+        /* if(this.translationWorldDelta.length()>0) {
            // console.log('translationDelta')
-        }
+        } */
 
 		{ // apply translation
 			view.translate(

+ 4 - 1
src/navigation/InputHandler.js

@@ -926,7 +926,10 @@ export class InputHandler extends THREE.EventDispatcher {
     
     
     onMouseMove (e) { 
-        return this.dealPointerMove( e )
+        /* if(e.buttons != 1&&e.buttons != 0){
+            console.log(e.buttons)
+        } */
+        return this.dealPointerMove(  e )
     }
 
     dealPointerMove(e, isTouch){ 

+ 9 - 6
src/settings.js

@@ -125,7 +125,8 @@ const config = {//配置参数   不可修改
         ,
         panoEdit:{
             maxLevelPercent: 1,  //在远处时由于pointBudget限制而展示稀疏,凑近时就变为最高质量了
-            pointBudget :1*1000*1000, //避免卡顿
+            pointBudget :4*1000*1000, //避免卡顿
+            percentByUser:true,
         },
         
         low:{//highPerformance
@@ -391,8 +392,7 @@ let settings = {//设置   可修改
     zoom:{
         enabled : true,
         min:1,
-        max: config.highQualityMaxZoom,
-        activationThreshold: 1.1,
+        max: config.highQualityMaxZoom 
     },
     navConstantly:true,
     navTileClass: browser.isMobile() ? '1k' : '2k',  //默认加载到
@@ -427,10 +427,13 @@ let settings = {//设置   可修改
     intersectWhenHover:true,
 
     notAdditiveBlending:false, //点云是否使用普通的blend, 否则会曝光过渡
-    precision:2  // 两位小数
+    precision:2,  // 两位小数
+    
+    testV4url:false, //v4的全景图等路径不一样 scene_view_data
 }
- 
- 
+  
+
+//https://4dkk.4dage.com/images/imagesSS-V4-aaeaQxWA/tiles/4k/0_skybox2.jpg?x-oss-process=image/resize,h_512&time=20221024105628
 
 //JSON.parse(localStorage.getItem('setting'))
 

+ 3 - 2
src/start.js

@@ -330,7 +330,8 @@ var panoEditStart = function(dom, number, fileServer){
     Potree.settings.number = number 
     
     Potree.settings.unableNavigate = true
-    
+    Potree.settings.sizeFitToLevel = true//当type为衰减模式时自动根据level调节大小。每长一级,大小就除以2
+
     
     let viewer = new Potree.Viewer(dom); 
     let Alignment = viewer.modules.Alignment
@@ -347,7 +348,7 @@ var panoEditStart = function(dom, number, fileServer){
             $("#alignment").show(); 
             viewer.toggleSidebar();
         });
-        Potree.settings.sizeFitToLevel = true 
+        //Potree.settings.sizeFitToLevel = true 
     }
     
     var pointcloudLoadDone = function( ){//所有点云cloud.js加载完毕后 

+ 1 - 1
src/viewer/viewer.js

@@ -4205,7 +4205,7 @@ export class Viewer extends ViewerBase{
             })  
         } 
         0 === this.waitQueue.length && this.dispatchEvent({type:"loading", show:false}) 
-    } 
+    }   
     cancelLoad(object){//add 突然出现还没加载完就被deactivateTiledPano但还在loading的情况,所以加了这个
         this.waitQueue = this.waitQueue.filter(function(e) {
             return  e.object != object

+ 7 - 0
改bug的历史.txt

@@ -1,6 +1,13 @@
 
 
 
+2022.10.31
+
+点云模式,飞到漫游点位置左键旋转视图,可能会突然translationWorldDelta不为0,从而离开pano的位置,这是为何
+e.buttons出问题  正常是1(左键),但有时候得到3(左键+右键),firefox也会。推测是鼠标问题。
+
+故暂且增加一种3的判断
+
 2022.10.18
 接入bim时不知咋的出现一个bug,新加载的容易一直loading,当前漫游点isLoaded一直false,
 panoRenderer.panoLODDescriptors一直空的,uploadTile 只加载到第一个点(非当前pano)的部分