xzw 1 semana atrás
pai
commit
b979bb4e3d

+ 2 - 2
src/custom/mergeStartTest.js

@@ -60,8 +60,8 @@ var start = function(dom, mapDom, number, fileServer, webSite){ //t-Zvd3w0m
         viewer.transformationTool.setModeEnable('scale',false)
         //viewer.ssaaRenderPass.sampleLevel = 0 //奇怪好像没啥锯齿?  sampleLevel为1 的话,ground就不会
         
-        viewer.composer.scaleRatio = 1
-        viewer.composer.readTarget = false
+        /* viewer.composer.scaleRatio = 1
+        viewer.composer.readTarget = false */
     }
     
      

+ 11 - 12
src/custom/modules/mergeModel/MergeEditor.js

@@ -116,7 +116,7 @@ let MergeEditor = {
             //见笔记:透明物体的材质设置
         }
         
-        let oriEdgeStrength = viewer.outlinePass.edgeStrength 
+        //let oriEdgeStrength = viewer.outlinePass.edgeStrength 
         {
             
             this.transformControls = new TransformControls(viewer.mainViewport.camera, viewer.renderArea,{
@@ -139,7 +139,7 @@ let MergeEditor = {
             Potree.Utils.setObjectLayers(this.transformControls2, 'layer2' )  
              
              
-            let mouseDown = (e)=>{
+            /* let mouseDown = (e)=>{
                  
                 viewer.outlinePass.edgeStrength = 0//暂时消失线
                  
@@ -152,7 +152,7 @@ let MergeEditor = {
             this.transformControls.addEventListener('mouseDown',mouseDown)
             this.transformControls2.addEventListener('mouseDown',mouseDown)
             this.transformControls.addEventListener('mouseUp',mouseUp)
-            this.transformControls2.addEventListener('mouseUp',mouseUp)
+            this.transformControls2.addEventListener('mouseUp',mouseUp) */
             
             
             
@@ -221,16 +221,16 @@ let MergeEditor = {
             } 
         })
         //viewer.fxaaPass.enabled = false//viewer.ssaaRenderPass.enabled = false 
-        viewer.outlinePass.enabled = true
+        /* viewer.outlinePass.enabled = true
         //Potree.settings.intersectWhenHover = false
         //Potree.Utils.updateVisible(viewer.reticule, 'force', false)
         viewer.composer.scaleRatio = 1
-        viewer.composer.readTarget = false
+        viewer.composer.readTarget = false */ 
         
         viewer.addEventListener('updateModelBound', (e)=>{
             if(this.split){ 
                 this.SplitScreen.updateCameraOutOfModel(/* this.selected && [this.selected] */) 
-            } 
+            }  
         })
         
         
@@ -244,9 +244,9 @@ let MergeEditor = {
                         if(e.intersect.pointclouds.includes(this.selected) || e.intersect.allElements.some(e=>e.object == this.selected)){
                             
                             dragInfo = {}   
-                            //if(this.selected.isPointcloud){ 
-                                viewer.outlinePass.edgeStrength = 0//暂时消失线
-                            //} 
+                            
+                            //viewer.outlinePass.edgeStrength = 0//暂时消失线
+                            
                         }  
                     }
                          
@@ -322,9 +322,8 @@ let MergeEditor = {
             viewer.addEventListener('global_drop', (e)=>{
                 dragInfo = null
                 this.clearTranCursor()
-                  
-                //this.updateEdgeStrength()
-                viewer.outlinePass.edgeStrength = oriEdgeStrength  
+                   
+                //viewer.outlinePass.edgeStrength = oriEdgeStrength  
                 
             })
         

+ 26 - 26
src/custom/modules/panos/Images360.js

@@ -130,27 +130,27 @@ export class Images360 extends THREE.EventDispatcher{
         this.qualityManager = new QualityManager
         this.panoRenderer = new PanoRenderer(viewer, this.tileDownloader, this.qualityManager)
     
-        this.basePanoSize = this.qualityManager.getPanoSize(PanoSizeClass.BASE);
-        this.standardPanoSize = this.qualityManager.getPanoSize(PanoSizeClass.STANDARD);
-        this.highPanoSize = this.qualityManager.getPanoSize(PanoSizeClass.HIGH);
-        this.ultraHighPanoSize = this.qualityManager.getPanoSize(PanoSizeClass.ULTRAHIGH);
-        this.tileDownloader.processPriorityQueue = !1;
-        this.tileDownloader.tilePrioritizer = new TilePrioritizer(this.qualityManager, this.basePanoSize, this.standardPanoSize, this.highPanoSize, this.ultraHighPanoSize);    
-        
-        
-        {//高分辨率cube 放大
-            this.addHighMapCube()
-            viewer.addEventListener(PanoramaEvents.Enter,(e)=>{
-                this.setHighMap(e.newPano)
-            })
-            viewer.addEventListener('panoSetZoom',(e)=>{ 
-                if(Potree.settings.displayMode == 'showPanos'){
-                    e.zoomed ? this.showHighMap() : this.hideHighMap() //add
-                } 
-            })  
-        }
-        
-        
+        viewer.addEventListener('allLoaded', ()=>{
+            this.basePanoSize = this.qualityManager.getPanoSize(PanoSizeClass.BASE);
+            this.standardPanoSize = this.qualityManager.getPanoSize(PanoSizeClass.STANDARD);
+            this.highPanoSize = this.qualityManager.getPanoSize(PanoSizeClass.HIGH);
+            this.ultraHighPanoSize = this.qualityManager.getPanoSize(PanoSizeClass.ULTRAHIGH);
+            this.tileDownloader.processPriorityQueue = !1;
+            this.tileDownloader.tilePrioritizer = new TilePrioritizer(this.qualityManager, this.basePanoSize, this.standardPanoSize, this.highPanoSize, this.ultraHighPanoSize);    
+        
+        
+            {//高分辨率cube 放大
+                this.addHighMapCube()
+                viewer.addEventListener(PanoramaEvents.Enter,(e)=>{
+                    this.setHighMap(e.newPano)
+                })
+                viewer.addEventListener('panoSetZoom',(e)=>{ 
+                    if(Potree.settings.displayMode == 'showPanos'){
+                        e.zoomed ? this.showHighMap() : this.hideHighMap() //add
+                    } 
+                })  
+            } 
+        })
         
         this.depthSampler = new DepthImageSampler(); 
         this.tempSampler = new TempImageSampler(); 
@@ -2332,13 +2332,13 @@ export class Images360 extends THREE.EventDispatcher{
                 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 < levelThreshold2){
+                    if(Potree.settings.navTileClass == 1024 && Potree.settings.tileClass > 1024 && this.zoomLevel < levelThreshold2){
                         this.panoRenderer.enableHighQuality( function() {//开启2k 
-                            if(Potree.settings.tileClass != '4k')  o(currentPano, !0); 
+                            if(Potree.settings.tileClass < 4096)  o(currentPano, !0); 
                         }.bind(this));
                     }else{ 
                         this.panoRenderer.enableUltraHighQualityMode(function() {//开启4k getMaxZoomPanoSize
-                            this.qualityManager.useUltraHighResolutionPanos && (Potree.settings.zoom.max = Potree.config.ultraHighQualityMaxZoom);
+                            //this.qualityManager.useUltraHighResolutionPanos && (Potree.settings.zoom.max = this.currentPano.getZoomMax()  ) //加了其他逻辑太复杂,改为一开始就根据tileClass修改好了max
                             o(currentPano, !0)
                         }.bind(this));
                     } 
@@ -2348,7 +2348,7 @@ export class Images360 extends THREE.EventDispatcher{
                 
                 
                 
-                if(r && Potree.settings.navTileClass == '1k' && Potree.settings.tileClass == '4k'  ){ //目前只有手机端navTileClass == '1k' (分三个梯度)
+                if(r && Potree.settings.navTileClass == 1024 && Potree.settings.tileClass >= 4096 ){ //目前只有手机端navTileClass == '1k' (分三个梯度)
                     var change = (zoomedFlag)=>{ 
                         this.qualityManager.updateMaximums()//更新maxZoomPanoSize
                         this.panoRenderer.setupZoomRenderTarget() //更新renderTarget  
@@ -2383,7 +2383,7 @@ export class Images360 extends THREE.EventDispatcher{
 
     addHighMapCube(){//创建8*8的tile  cube   主要因手机版崩溃  要在电脑端测试得设置maxRenderTargetSize
         
-        if( Potree.settings.tileClass == '4k' && this.qualityManager.maxRenderTargetSize == 2048){
+        if( this.qualityManager.maxRenderTargetSize < Potree.settings.tileClass){
             
             var geo = new THREE.PlaneGeometry(1, 1, 1, 1)
             var cube = new THREE.Object3D;

+ 6 - 0
src/custom/modules/panos/Panorama.js

@@ -549,6 +549,7 @@ class Panorama extends THREE.EventDispatcher{
         this.setZoomed(!1) 
         viewer.dispatchEvent({type:PanoramaEvents.Enter,  oldPano:old, newPano:this  }  )
         old = this 
+        Potree.settings.zoom.max = this.getZoomMax()  
         //console.log("enter pano "+ this.id)
     } 
 
@@ -776,6 +777,11 @@ class Panorama extends THREE.EventDispatcher{
         
     }
     
+    
+    getZoomMax(){
+        return Math.max(2,this.pointcloud.tileClass / 4096 * 3)
+    }
+    
 };
 
 

+ 5 - 3
src/custom/modules/panos/tile/PanoRenderer.js

@@ -127,10 +127,12 @@ class PanoRenderer extends THREE.EventDispatcher{
 
 
     enableUltraHighQualityMode(e) {
-        if(config.tileClass == "2k"||config.tileClass == "1k")return this.enableHighQuality(e)//xzw add     濡傛灉鏈€澶氬彧瑕?k鐨勮瘽
+        if(Potree.settings.tileClass <= 2048)return this.enableHighQuality(e)//xzw add     
         if (!this.qualityManager.ultraHighQualityModeEnabled()) {
             var t = this.qualityManager.getPanoSize(PanoSizeClass.ULTRAHIGH);
-            this.tileDownloader.testDownload(t, TileUtils.TILE_SIZE, function (t) {
+            this.tileDownloader.testDownload(t, 
+                Potree.settings.tileClass == 6144 ? TileUtils.TILE_SIZE * 1.5 : TileUtils.TILE_SIZE, //改 TileUtils.TILE_SIZE,
+                function (t) {
                      t && (this.qualityManager.enableUltraHighQualityMode(),
                         this.setupZoomRenderTarget(),
                         e())  
@@ -945,7 +947,7 @@ PanoRenderer.prototype.uploadTile = function () {//重写
             renderTarget = this.zoomRenderTarget;
             size =  this.zoomRenderTarget.width   //this.qualityManager.getMaxZoomPanoSize(); //放大后可能2048或4096
         } 
-        //console.log(window.sceneName, 'uploadTile ', id, tileIndex)
+        //console.log( 'uploadTile ', id, tileIndex, panoSize)
         
         
         let done = ()=>{ 

+ 17 - 8
src/custom/modules/panos/tile/QualityManager.js

@@ -23,11 +23,9 @@ export default class QualityManager {
         this.modelHasUltraHighPanos = !1;
         this.qualityManager = this;
         
-        this.maxRenderTargetSize = browser.isMobile() ? 2048 : 4096  //add
-          
-        this.maxRenderTargetSize = Math.min( viewer.renderer.capabilities.maxCubemapSize,  this.maxRenderTargetSize)//部分系统老浏览器只能2048
+        //this.init()
+        viewer.addEventListener('allLoaded',this.init.bind(this),{importance:10})
         
-        this.init()
     }
 
     init(e ) {
@@ -36,7 +34,18 @@ export default class QualityManager {
         /* if(config.tileClass == '1k'){
             this.useHighResolutionPanos = false    //xzw add 只加载1k
         } */
-         
+        /* let resolution = '6k'
+        if (resolution.indexOf('/') != -1) {
+            resolution = resolution.split('/')[1]
+        } 
+        Potree.settings.tileClass = parseInt(resolution) * 1024 */
+        let maxTileClass = 0
+        viewer.scene.pointclouds.forEach(e=>{
+            maxTileClass = Math.max(maxTileClass, e.tileClass)
+        })
+        Potree.settings.tileClass = maxTileClass
+        this.maxRenderTargetSize = browser.isMobile() ? 2048 : maxTileClass
+        this.maxRenderTargetSize = Math.min( viewer.renderer.capabilities.maxCubemapSize,  this.maxRenderTargetSize)//部分系统老浏览器只能2048
         
         this.buildPanoSizeClassMap(this.devicePixelDensity, this.deviceScreenSize, this.clientBandwidth);
         this.ultraHighSize = this.getPanoSize(PanoSizeClass.ULTRAHIGH);
@@ -92,7 +101,7 @@ export default class QualityManager {
         this.panoSizeClassMap[PanoSizeClass.BASE] = 512,
             this.panoSizeClassMap[PanoSizeClass.STANDARD] = 1024,
             this.panoSizeClassMap[PanoSizeClass.HIGH] = 2048,
-            this.panoSizeClassMap[PanoSizeClass.ULTRAHIGH] = 4096
+            this.panoSizeClassMap[PanoSizeClass.ULTRAHIGH] = Math.max(4096, Potree.settings.tileClass)
     }
 
     getPanoSize(e) {
@@ -122,10 +131,10 @@ export default class QualityManager {
         }
         return PanoSizeClass.HIGH  */
         switch(Potree.settings.navTileClass){  
-            case '1k':
+            case 1024:
                 return PanoSizeClass.STANDARD;
                 break;
-            case '2k':             
+            case 2048:             
             default:
                 return PanoSizeClass.HIGH;
         }

+ 10 - 5
src/custom/modules/panos/tile/TileDownloader.js

@@ -385,6 +385,11 @@ class TileDownloader extends THREE.EventDispatcher{
         desc.totalTiles = TileUtils.getTileCountForSize(size);
         desc.status = DownloadStatus.None;
         desc.image = null;
+        //xzw
+        if (size == 6144) {
+            //desc.panoSize = 6144  //4096 * 1.5
+            desc.tileSize = 768 //512 * 1.5
+        }
         TileUtils.getTileLocation(desc.panoSize, desc.tileIndex, desc);//得到该tile在这个face中的具体位置(tileX等)
         TileUtils.getTileVector(desc.panoSize, desc.tileSize, desc.cubeFace, desc.tileX, desc.tileY, TileUtils.LocationOnTile.Center, 0, desc.direction);
     }
@@ -504,7 +509,7 @@ TileDownloader.prototype.getTileUrl = function() {
             tileIndex = o.tileIndex,
             sceneCode = o.pano.pointcloud.sceneCode,
             useV4url = Potree.settings.useV4url && (!o.pano.pointcloud.datasetData || o.pano.pointcloud.datasetData.sceneVersion == 'V4')        //v4的全景图等路径不一样  
-        var resolution = o.pano.pointcloud.tileRes || '4k'
+        var resolution = o.pano.pointcloud.tileRes || o.pano.pointcloud.datasetData?.sceneResolution || '4k'  
         var metadata = {sceneScheme:10}  
         
         
@@ -532,21 +537,21 @@ TileDownloader.prototype.getTileUrl = function() {
             } else {
                 //4k的图,移动端是1k,pc端是2k,放大才是4k
                 if (e[panoSize] == '1k' || e[panoSize] == '2k') {  //https://4dkk.4dage.com/images/imagesx4iqYDG3/tiles/4k/122_skybox0.jpg?x-oss-process=image/resize,m_lfit,w_1024/crop,w_512,h_512,x_511,y_0
-                    d += 'image/resize,m_lfit,w_' + panoSize + '/crop,w_512,h_512,';
+                    d += `image/resize,m_lfit,w_${panoSize}/crop,w_${tileSize},h_${tileSize},`
                 } else {
-                    d = 'tiles/'+ resolution +'/' + id + '_skybox' + h + '.jpg?x-oss-process=image/crop,w_512,h_512,';
+                    d += `image/crop,w_${tileSize},h_${tileSize},`
                 }
                 //起始位置
                 if (t.tileX == 0) {
                     d += 'x_0,';
                 } else {
-                    d += 'x_' + (512 * t.tileX /* - 1 */) + ',';
+                    d += 'x_' + (tileSize * t.tileX /* - 1 */) + ',';
                 }
 
                 if (t.tileY == 0) {
                     d += 'y_0';
                 } else {
-                    d += 'y_' + (512 * t.tileY /* - 1 */);
+                    d += 'y_' + (tileSize * t.tileY /* - 1 */);
                 } 
             }
             

+ 1 - 1
src/custom/modules/panos/tile/TilePrioritizer.js

@@ -294,7 +294,7 @@ TilePrioritizer.prototype.filterAndPrioritize = function () {//挑选出优先
             ,
             c = this.highSize //2048
             ,
-            h = this.ultraHighSize; //4096
+            h = this.priorityCriteria.pano.pointcloud.tileClass //xzw   //this.ultraHighSize; //4096
             
             
         this.queueTilesForPano(queue, tileDownloader, this.priorityCriteria.pano, s);  //把当前pano的512下载了

+ 9 - 7
src/custom/modules/panos/tile/TileUtils.js

@@ -14,7 +14,9 @@ TileUtils.LocationOnTile = {
     LowerRight: 3,
     LowerLeft: 4
 },
-
+TileUtils.getTileSize = function(panoSize) {
+    return panoSize == 6144 ? 768 : TileUtils.TILE_SIZE
+},
 
 /*
  * 获取某tile在cube中的方向 direction (向量起点在cube中心,终点在tile图的指定位置)。spherical通过先求uv,再直接得到dir
@@ -91,7 +93,7 @@ TileUtils.getTileVector = function() {//获取某tile在cube中的方向 directi
  * 获取该tile在第几个面(简易装载法) 
  */
 TileUtils.getFaceForTile = function(size, index) {//获取该tile在第几个面
-    var tileSize = TileUtils.TILE_SIZE;
+    var tileSize = this.getTileSize(size) //xzw改 
     size < TileUtils.TILE_SIZE && (tileSize = size);
     var n = Math.floor(size / tileSize)
         , sum = n * n; //得每个面tile总数
@@ -101,7 +103,7 @@ TileUtils.getFaceForTile = function(size, index) {//获取该tile在第几个面
 
 
 TileUtils.getTileLocation = function(size, t, result) {
-    var tileSize = TileUtils.TILE_SIZE;
+    var tileSize = this.getTileSize(size) //xzw改
     size < TileUtils.TILE_SIZE && (tileSize = size);
     var r = TileUtils.getFaceForTile(size, t)
         , a = Math.floor(size / tileSize)
@@ -118,10 +120,10 @@ TileUtils.getTileLocation = function(size, t, result) {
 /*
  * 求size分辨率需要多少张tile
  */
-TileUtils.getTileCountForSize = function(e) {
-    if (e <= TileUtils.TILE_SIZE)
-        return TileUtils.FACES_PER_PANO;
-    var t = Math.floor(e / TileUtils.TILE_SIZE)
+TileUtils.getTileCountForSize = function(size) {
+    var tileSize = this.getTileSize(size)
+    if (size <= tileSize) return TileUtils.FACES_PER_PANO
+    var t = Math.floor(size / tileSize)
         , i = t * t
         , n = i * TileUtils.FACES_PER_PANO;
     return n

+ 23 - 1
src/custom/potree.shim.js

@@ -1048,7 +1048,29 @@ Utils.combineImgs = async (imgs, compressRatio, width, height)=>{//拼合图片
     
 }
 
-
+Utils.tilesetCoincide‌WithPoc = function(tilesetModel, tranInfo){//使刚加载的3dtiles和点云吻合
+     
+    tilesetModel.position.fromArray(tilesetModel.runtime.getTileset().tileset.root.boundingVolume.box.slice(0,3))//必须要平移一段才能重合 
+    tilesetModel.position.copy(Potree.math.convertVector.ZupToYup(tilesetModel.position)) 
+  
+    if(tranInfo){
+        tilesetModel.updateMatrix()
+        let matrix
+        if(tranInfo.pointcloud){//已经加载好的现成pointcloud,直接应用其matrix
+            matrix = tranInfo.pointcloud.transformMatrix
+        }else if(tranInfo.location ){//只有点云的旋转位移信息,如在融合页面同时加载该场景点云和mesh,要求他们重合,参考Alignment
+            //暂写只绕纵轴的旋转   融合那边没考虑编辑过点云旋转的情况耶,只看默认的
+            let rotMatrix = new THREE.Matrix4().makeRotationAxis(new THREE.Vector3(0,0,1),  parseFloat(tranInfo.orientation || 0)   )  
+            let pos2Matrix = new THREE.Matrix4().setPosition(tranInfo.location);//最后是平移
+            matrix = new THREE.Matrix4().multiplyMatrices(pos2Matrix, rotMatrix); 
+        }
+        if(matrix){
+            tilesetModel.matrix.premultiply(matrix) 
+            tilesetModel.matrix.decompose(tilesetModel.position, tilesetModel.quaternion, tilesetModel.scale)
+        }
+    } 
+    
+}
 
 
 BinaryLoader.prototype.load = function(node, callback){//解析点云

+ 2 - 2
src/custom/settings.js

@@ -496,8 +496,8 @@ let settings = {//设置   可修改
                                  
     },
     navConstantly:true,
-    navTileClass:  /*  browser.isMobile() ? '1k' :  */  '2k',  //默认加载到
-    tileClass:'4k',     //最高可达
+    navTileClass: 2048,  // browser.isMobile() ? '1k' :   '2k'   //默认加载到
+    tileClass: 4096, // '4k',     //最高可达
     /* loadTilesWhenUnfocus:false, //页面unfocus时也仍在加载tiles
     loadPointsWhenUnfocus:true, //页面unfocus时也仍在加载点云 */
    

+ 11 - 227
src/custom/start.js

@@ -85,6 +85,7 @@ export function start(dom, mapDom, number, info={} ){ //t-Zvd3w0m
     Potree.loadDatasetsCallback = function(data, ifReload){
         if(!data || data.length == 0)return console.error('getDataSet加载的数据为空')
      
+         
         Potree.datasetData = data
         viewer.transform = null
         var datasetLength = data.length 
@@ -291,10 +292,7 @@ export function start(dom, mapDom, number, info={} ){ //t-Zvd3w0m
             
             viewer.dispatchEvent('allLoaded')
             
-            if(!Potree.settings.isOfficial && Potree.settings.number == 'SG-t-rQ14yS9VjVp' ){
-                 setTimeout(listenLocation, 1000)
-            }
-            
+           
             
         }
         
@@ -359,14 +357,19 @@ export function start(dom, mapDom, number, info={} ){ //t-Zvd3w0m
                     if(!Potree.settings.isOfficial){ 
                         Potree.settings.floorplanEnables[dataset.id] = true
                         Potree.settings.floorplanType[dataset.id] = 'default'
-                    }
-                    
-                    
+                    } 
                     pointcloudLoaded ++;
                     if(pointcloudLoaded == datasetLength)pointcloudLoadDone()
                     
+                    {   
+                        let resolution = dataset.sceneResolution || '4k' //融合页面还有一个tileRes
+                        if(resolution.indexOf('/') != -1) {
+                            resolution = resolution.split('/')[1]
+                        } 
+                        pointcloud.tileClass = parseInt(resolution) * 1024
+                    
+                    }
                     
-                
                     Potree.loadPanos(dataset.id, (data) => { 
                         //console.log('loadPanos',dataset.sceneCode, dataset.id, data)
                         viewer.images360.addPanoData(data, pointcloud)
@@ -1395,225 +1398,6 @@ var changeLog = ()=>{
  
  
 
-
- 
-function listenLocation(){//室内定位测试
-
-    let fakeMeasure = {
-        type : 'Path', "unit": "metric", points:[], width:0.1
-    }
-    let path = viewer.measuringTool.createMeasureFromData(fakeMeasure) 
-    path.setEditEnable(false)
-    path.setAddOrRemPoint(false) 
-    path.edge.material.useDepth = false 
-    path.endCaps[0].children[0].material.useDepth = false 
-    path.endCaps[1].children[0].material.useDepth = false 
-    path.setColor('#FF4399')
-    path.setPathWidth(0.5)
-    viewer.mainViewport.view.applyJson({"yaw":-3.1401257265634337,"pitch":-1.4463945277050603,"position":{"x":-3.6298548644429034,"y":1.631125389514918,"z":25.881133155122455},"radius":2.5485311249338363})
-    let sphere = new THREE.Mesh(new THREE.SphereBufferGeometry(0.1,4,4),new THREE.MeshBasicMaterial({
-        color:'#f11',
-        depthTest:false
-    }))
-    //sphere.rotation.set()
-    viewer.scene.overlayScene.add(sphere)
-     
-    let label = new Potree.TextSprite({ sizeInfo:{width2d:160}, renderOrder:10, transform2Dpercent:{x:0,y:0.5}})
-    
-    label.name = 'locationlabel'
-    sphere.add(label)
-    label.setPos(new THREE.Vector3(0,0,0.3))
-    sphere.visible = false
-    let setLabel = (e)=>{
-        let texts = [e.name]
-        if(e.locationDesc) texts.push(e.locationDesc)
-        label.setText(texts)
-    }
- 
-    
-    viewer.inputHandler.addEventListener('keydown',e=>{ 
-        if(e.event.key.toLowerCase() == 'f' && sphere.visible){
-            let distance = e.event.shiftKey ? 4 : Math.min(30, viewer.mainViewport.view.position.distanceTo(sphere.position))
-            viewer.focusOnObject({  position: sphere.position}, 'point', 400, {distance} )
-        }            
-    })
-    
-    let wholeId = browser.urlHasValue('livePath',true)   
-    if(wholeId != ''){//显示该用户完整路径 
-        let points, curPercent=0, data,interval, from = new THREE.Vector3, to = new THREE.Vector3//每次走两个点间的十分之一. 显示长度为1个单位
-            
-        let walk = ()=>{
-            if(curPercent < points.length){ 
-             
-                let index = Math.floor(curPercent)
-                let percent_ = curPercent % 1 //小数部分
-                let point1 = points[index-1] ? (from.copy(points[index-1]), to.copy(points[index]),
-                            lerp.vector(from, to)(percent_), from.clone() ) : points[0]
-                let point2 = points[index+1] ? (from.copy(points[index]), to.copy(points[index+1]),
-                            lerp.vector(from, to)(percent_), from.clone() ) : points[index] 
-                path.points = [point1, point2]
-                index > 0 && index < points.length - 1 && path.points.splice(1,0,points[index]) //跨的话 中间加一个拐弯的
-                curPercent += 0.1 
-                path.update()
-                sphere.position.copy(points[index])
-                setLabel(data[index]) 
-                sphere.visible = true
-                viewer.dispatchEvent('content_changed')  
-            }else{
-                clearInterval(interval)
-            } 
-        }
-        
-         
-    
-        Potree.loadFile('https://test.4dkankan.com/openDevice/record/'+wholeId,{
-                fetchMethod:'post',
-            },
-            (data_)=>{
-                if(!(data_ instanceof Array)){
-                    return console.error('获取完整路径为空',data)
-                }
-                data = data_
-                console.log('获取到的路径',data)
-                if(Potree.settings.isTest ){
-                    data = [{
-                        name:'1',
-                        pos: new THREE.Vector3(10,4,0),
-                    },
-                    {
-                        name:'2',
-                        pos: new THREE.Vector3(4,4,2),
-                    },
-                    {
-                        name:'3',
-                        pos: new THREE.Vector3(6,3,2),
-                    },
-                    {
-                        name:'4',
-                        pos: new THREE.Vector3(8,4,0),
-                    }]    
-                }                
-                points = data.map(e=>new THREE.Vector3().copy(e.pos)) 
-                 
-                interval = setInterval(walk, 100)
-                 
-                 
-            }
-        )
-        
-        return
-    } 
-    //以下实时显示正在走的路径
-    
-    let locationStream = new ReportInfoStream
-    
-    let lastPoint ,  requestPoints = {startPos: new THREE.Vector3, endPos: new THREE.Vector3}, waitRoute
-    
-     
-    /* let getZOnGround = (pos_)=>{//要近地面才能搜出来 
-        let pos = new THREE.Vector3().copy(pos_)
-            pos.z -= 1 //假设标签都在离屋顶更靠近的位置,向下寻找临近漫游点
-        let disMap = new Map
-        let result = Potree.Common.sortByScore(viewer.images360.panos, [(pano)=>{
-            return Math.abs(pos.z - pano.position.z) < 2 
-        }],[pano=>{
-            let disSq = pano.position.distanceToSquared(pos) 
-            disMap.set(pano, disSq)
-            return -disSq
-        }])
-        let zArr = result.slice(0,10).map(e=>e.item.position.z)// floorPosition  
-        zArr.sort()
-        pos.z = zArr[Math.round(zArr.length/2)] 
-        if(pos.z == void 0){
-            pos.z = pos_.z - 2
-            console.log('getZOnGround没找到')
-        }
-        //pos.z-=0.2
-        return pos 
-    } */
-    let walk = ()=>{
-        if(path.points.length>1){
-            path.points.splice(0,1)
-            path.update()
-            viewer.dispatchEvent('content_changed') 
-        }
-        
-    }
-    setInterval(walk, 100)
-    
-    
-    let history = []
-    locationStream.subscribe(e=>{
-        //console.log('locationStream',e.pos)
-        setLabel(e)
-        //label.setPos(e.pos)
-        sphere.position.copy(e.pos)
-        sphere.visible = true
-        
-        
-        let last = history[history.length - 1]
-        let isDifferent = Potree.Common.ifSame( last?.pos, e.pos )
-        
-        
-        
-        if(last && !waitRoute && !isDifferent){ 
-            requestPoints.startPos.copy(lastPoint)
-            requestPoints.endPos.copy(e.pos) 
-            /* requestPoints.startPos = getZOnGround(lastPoint)
-            requestPoints.endPos = getZOnGround(e.pos) */ 
-            console.log('startPos',requestPoints.startPos,'endPos',requestPoints.endPos) 
-            
-            Potree.loadFile(`https://test.4dkankan.com/openDevice/query?from=${last.uuid}&to=${e.uuid}`,{},(data)=>{
-                data = 'data' in data ? data.data : data 
-                data = data || []
-                data.length>0 && console.log('getRoute', data.map(e=>e))
-                path.points = path.points.concat(data.map(e=>new THREE.Vector3().copy(e))) 
-                path.update() 
-                waitRoute = false
-            },()=>{
-                waitRoute = false
-            })  
-            /* Potree.loadFile('https://test.4dkankan.com/openDevice/SG-t-rQ14yS9VjVp/getRoute',{
-                fetchMethod:'post',
-                sendInfo : { 
-                  "sceneCode": "SG-t-rQ14yS9VjVp",
-                  "startPos": requestPoints.startPos,
-                  "endPos": requestPoints.endPos
-                }
-            },(data)=>{ 
-                data = 'data' in data ? data.data : data 
-                data = data || []
-                data.length>0 && console.log('getRoute', data.map(e=>e.location))
-                path.points = path.points.concat(data.map(e=>new THREE.Vector3().fromArray(e.location)) ) 
-                path.update() 
-                waitRoute = false
-            },()=>{
-                waitRoute = false
-            })  */
-            waitRoute = true
-        }
-        
-        
-        isDifferent || history.push(e)
-        lastPoint = new THREE.Vector3().copy(e.pos)
-        viewer.dispatchEvent('content_changed') 
-    })
-    locationStream.start()
-    
-    window.liveLocation = {
-        sphere, label, path, history
-    }
-    
-    
-    
-    /* for(let i=0;i<points.length;i++){
-        path.setMarkerTitle(i,'')
-    } */
-    
-     
-    
-    
-}
  
  
 

+ 64 - 30
src/custom/utils/PanoScreenshot.js

@@ -7,20 +7,28 @@ const whPercent = 1.78 //固定输出的图长宽比
 
 
 export const PanoScreenshot = {
-
-    getMaxHeight() {
+    getZoomMax(pano = viewer.images360.currentPano){ 
+        const zoomNum = {//产品要求显示的大小,于滑动条上
+            2048 : 2,   //8k  不可能是这个
+            4096 : 4,   //16k
+            6144 : 9    //24k
+        } 
+        return zoomNum[pano.pointcloud.tileClass]
+    },
+    getMaxHeight(pano) {
         //全景图高度
-        return 4096 * 2 //this.app.core.get('QualityManager').tileClass == '2k' ? 4096 : this.app.core.get('QualityManager').tileClass == '4k' ? 4096 * 2 : 1024
+        return 2 * pano.pointcloud.tileClass
     },
 
-    getTileSize() {
+    getTileSize(pano) {
         // 获取单个面的大小
-        return 4096//this.app.core.get('QualityManager').tileClass == '2k' ? 2048 : this.app.core.get('QualityManager').tileClass == '4k' ? 4096 : 512
+        return  pano.pointcloud.tileClass
     },
 
 
-    getPicSize() { 
-        const maxHeight = this.getMaxHeight()
+    getPicSize(pano) { 
+        
+        const maxHeight = this.getMaxHeight(pano)
         let height = (viewer.mainViewport.camera.fov / 180) * maxHeight
         let width = height * whPercent
         let size = {
@@ -36,14 +44,14 @@ export const PanoScreenshot = {
 
         //(2k减半)  如1890*1062  --> 945*531
     },
-    waitTexLoaded(){
-        let tileSize = this.getTileSize()
+    waitTexLoaded(pano){
+        let tileSize = this.getTileSize(pano)
         
         let camera = viewer.mainViewport.camera
         let vFov = camera.fov
         let hFov = cameraLight.getHFOVForCamera(camera)
 
-        let promise = viewer.images360.currentPano.loadTiledPano( tileSize, 
+        let promise = pano.loadTiledPano( tileSize, 
             viewer.images360.getTileDirection(), { hFov, vFov, }, !1, !1, !0 )
         
         /* promise.done(() => {
@@ -72,32 +80,58 @@ export const PanoScreenshot = {
         return (angle + 360)%360    //限制在0-360 
     },
     
-    toggleDisplay(show){//只显示全景图
-         
-    },
-    screenshot(){
-        this.toggleDisplay(false)
-        let size = this.getPicSize()
-        Potree.settings.highestQualityTile = true  //不放大也加载4k
+    
+    screenshot(){ 
         let promise = new Promise((resolve, reject) => {
-            this.waitTexLoaded().then(e=>{
-                if( viewer.images360.panoRenderer.zoomRenderTarget.width < 4096){
-                    console.error('zoomRenderTarget size < 4096 !!!!!')
-                    debugger
-                }
+            let deal = ()=>{
+               
+                let size = this.getPicSize(viewer.images360.currentPano)
+                Potree.settings.highestQualityTile = true  //不放大也加载4k
+                this.waitTexLoaded(viewer.images360.currentPano).then(e=>{
+                    if( viewer.images360.panoRenderer.zoomRenderTarget.width < 4096){
+                        console.error('zoomRenderTarget size < 4096 !!!!!')
+                        debugger
+                    }
+             
+                    var {getImagePromise, finishPromise} = viewer.startScreenshot({ type: 'default', noOverlay:true, useRenderTarget: true }, size.width, size.height, 1) //因尺寸可能大于8192, 所以使用离屏渲染,否则canvas超过该大小容易黑屏。
+                    finishPromise.done((e) => {
+                        //Potree.Common.downloadFile(e.dataUrl, 'screenshot.png') 
+                        Potree.settings.highestQualityTile = false 
+                        resolve(e.dataUrl) 
+                    })
+                }) 
                 
-                var {getImagePromise, finishPromise} = viewer.startScreenshot({ type: 'default', noOverlay:true }, size.width, size.height, 1)
-                finishPromise.done((e) => {
-                    //Potree.Common.downloadFile(e.dataUrl, 'screenshot.png') 
-                    Potree.settings.highestQualityTile = false
-                    this.toggleDisplay(true)
-                    resolve(e.dataUrl) 
-                })
-            }) 
+            }
+            
+            let wait = (e)=>{ 
+                viewer.images360.removeEventListener('flyToPanoDone', wait) 
+                deal()//setTimeout(()=>{deal()},1000)
+            }
+            
+            if(!viewer.images360.isAtPano() || viewer.images360.latestToPano){
+                return viewer.images360.addEventListener('flyToPanoDone', wait) 
+            }else{
+                deal()
+            }
+            
+            
         });  
         return promise
     }
     
     
 }
+
+/* 
+
+
+国产系统可能超出截图尺寸限制,具体查询以下参数
+const maxRenderbufferSize = gl.getParameter(gl.MAX_RENDERBUFFER_SIZE);
+const maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); 
+const maxSize = Math.min(maxRenderbufferSize, maxTextureSize);//通常该值为16384,够用
+
+
+
+
+ */
   

+ 10 - 4
src/custom/utils/math.js

@@ -629,13 +629,19 @@ var math = {
         return rings 
         
     },
-
-    getQuaFromPosAim( position, target ){ 
+ 
+    getQuaFromPosAim( position, target, forward = new THREE.Vector3(0, 0, -1)) { //类似相机roll=0
         /* let matrix = (new THREE.Matrix4).lookAt(position, target, new THREE.Vector3(0,0,1)) //这里垂直的话会默认给一个右向所以不这么写
         return (new THREE.Quaternion).setFromRotationMatrix(matrix) */
-        view.yaw = 0 //reset     direction.z = 1
+        
+        view.yaw = 0 //reset     direction.z = 1  
         view.direction = new THREE.Vector3().subVectors(target,position) 
-        return view.quaternion
+        return view.quaternion  //通常得到的可能要再multiply一个自身旋转baseQua
+         
+        //为啥和下面这句得到的不同
+        //return new THREE.Quaternion().setFromUnitVectors(forward, target.clone().sub(position).normalize())
+        
+        
     },
     
     

+ 2 - 2
src/custom/viewer/ViewerNew.js

@@ -6122,8 +6122,8 @@ export class Viewer extends ViewerBase{
                    
             }catch(e){ 
                 //debugger  // Error: Failed to fetch resource
-                //console.error(e)
-                onError && onError(e)
+                
+                onError ? onError(e) : console.error(e)
             }