xzw 3 ماه پیش
والد
کامیت
5336c3fc93

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

@@ -10061,7 +10061,7 @@ class Tileset3D extends EventDispatcher{//xzw add EventDispatcher
   constructor(json, options) {
       super()
       
-      viewer.visiVertexCount = viewer.visiVertexCount || 0
+      viewer.visi3dtileVertCount = viewer.visi3dtileVertCount || 0
       
     _defineProperty(this, "options", void 0);
 
@@ -17954,12 +17954,12 @@ class Loader3DTiles {
                             
                             // Make sure it's visible 
                             if(!renderMap[tile.id].visible){
-                                if(viewer.visiVertexCount<maxVertexVisi){
+                                if(viewer.visi3dtileVertCount<maxVertexVisi){
                                     renderMap[tile.id].visible = true;
-                                    viewer.visiVertexCount += tile.posCount   //renderMap[tile.id].vertexCount  //xzw add
+                                    viewer.visi3dtileVertCount += tile.posCount   //renderMap[tile.id].vertexCount  //xzw add
                                     options.debug && (boxMap[tile.id].material.opacity = 1 , boxMap[tile.id].children[0].sprite.material.opacity = 1 )
                                 }else{
-                                    //console.log('超出', visiVertexCount)
+                                    //console.log('超出', visi3dtileVertCount)
                                 }
                             }   
                             /* if(!renderMap[tile.id].realVisible()){
@@ -17974,7 +17974,7 @@ class Loader3DTiles {
                                 renderMap[tile.id].visible = false;
                                 options.debug && (boxMap[tile.id].material.opacity = 0.1, boxMap[tile.id].children[0].sprite.material.opacity = 0.1)
                                 
-                                viewer.visiVertexCount -= tile.posCount //renderMap[tile.id].vertexCount  //xzw add
+                                viewer.visi3dtileVertCount -= tile.posCount //renderMap[tile.id].vertexCount  //xzw add
                             } 
                         }
                     }
@@ -17983,7 +17983,7 @@ class Loader3DTiles {
                 while (unloadQueue.length > 0) {
                     const tile = unloadQueue.pop();
                     if (renderMap[tile.id] && tile.contentState == TILE_CONTENT_STATE.UNLOADED) {
-                        //console.log('removevisi', renderMap[tile.id].visible) 如果是true,visiVertexCount要减
+                        //console.log('removevisi', renderMap[tile.id].visible) 如果是true,visi3dtileVertCount要减
                         root.remove(renderMap[tile.id]);
                         disposeNode(renderMap[tile.id]);
                         delete renderMap[tile.id];
@@ -18430,7 +18430,7 @@ get isVisibleAndInRequestVolume() {
     return  this._inRequestVolume; //去掉了_visible ||  
 }
 
-显示所有tile似乎也不会卡顿. 但好像影响了加载顺序从而变慢了。visiVertexCount过量。 怀疑应该还是文件的bound有问题。
+显示所有tile似乎也不会卡顿. 但好像影响了加载顺序从而变慢了。visi3dtileVertCount过量。 怀疑应该还是文件的bound有问题。
 原本会消失的地方虽然不会消失了但一直是模糊的
 
 被隐藏的tiles对应的mesh也是仅隐藏,并未删除

+ 2 - 2
src/custom/mergeStartTest.js

@@ -356,11 +356,11 @@ var start = function(dom, mapDom, number, fileServer, webSite){ //t-Zvd3w0m
     ], tileIndex = Potree.browser.urlHasValue('tileIndex',true) || 0
     
      let glbUrls = [ 
-     
+        {url:`${Potree.resourcePath}/models/glb/animation/man.glb`, angle:0},//transform后,SkinnedMesh莫名移近会消失,可能模型没做好
         {url:`${Potree.resourcePath}/models/glb/animation/kid.glb`, angle:Math.PI/2},
      
         {url:`${Potree.resourcePath}/models/glb/animation/Soldier.glb`, angle:Math.PI/2},
-        {url:`${Potree.resourcePath}/models/glb/animation/man.glb`, angle:0}, /* 
+         /* 
         {url:`${Potree.resourcePath}/models/glb/animation/man--running.glb`, angle:Math.PI/2},
         {url:`${Potree.resourcePath}/models/glb/animation/man--walk.glb`, angle:Math.PI/2}, */
         {url:`${Potree.resourcePath}/models/glb/animation/dog.glb`, angle:Math.PI/2},

+ 1 - 0
src/custom/modules/Animation/AnimationEditor.js

@@ -331,6 +331,7 @@ export default class AnimationEditor extends THREE.EventDispatcher{
             if(obj.clipState != clipState){//动作是否改变
                 obj.traverse(e=>e.isSkinnedMesh && (e.boundingSphere = null)) //动画会导致bound改变,清空,raycast时重新计算bound,否则hover不到模型
                 obj.clipChanged = true
+                //但有的SkinnedMesh在transform后离近就消失,只有model.traverse(e=>e.isSkinnedMesh && (e.frustumCulled = false))才有用
             }
             obj.clipState = clipState
             	  

+ 14 - 17
src/custom/modules/mergeModel/MergeEditor.js

@@ -981,7 +981,7 @@ let MergeEditor = {
         let objWeight = posCount*eachObjPosWeight +    texArea * eachTexPxWeight
         let laserWeight = Potree.numVisiblePoints  * eachCloudPointWeight //点云实际显示所占大小
         let laserMemoryWeight =  Potree.lru.numPoints * eachCloudPointWeight   //点云所使用内存大小
-        let tiles3DWeight = (viewer.visiVertexCount || 0) * eachGltfPosWeight //M   3dTiles所占内存大小   
+        let tiles3DWeight = (viewer.visi3dtileVertCount || 0) * eachGltfPosWeight //M   3dTiles所占内存大小   
         let tiles3DMemoryWeight = viewer.tiles3dMemoryUsage / 1000 / 1000  //M   3dTiles显示的所占内存大小
         
         /* let min = 0.1, max = 6, minP = 100, maxP = 1000000; 
@@ -998,7 +998,6 @@ let MergeEditor = {
         
         
         
-        
         //还存在的问题:仍然有隐患,因为没用到真实缓存的大小: tiles3DMemoryWeight  laserMemoryWeight, 它们比真实可见的要多。不使用是因为它们无法反应出实际需要的内存量,缓存是只增不减
         //obj等普通mesh限制不了
         
@@ -1047,16 +1046,14 @@ let MergeEditor = {
         const eachTexPxWeightTiles = eachTexPxWeight * 1.5 //感觉3dtiles的比glb和obj都高很多,是因为文件还在缓存里吗
     
         
-        let posCount=0,   posCount3dTiles = 0, visiPosCount = 0
-        
+       
  
         let panosWeight = 0.1 * (viewer.images360.panos.filter(e=>e.depthTex).length * 0.7 + viewer.images360.tileDownloader.tilesCount * 512*512 * eachTexPxWeight) //深度图和全景图(但似乎是额外放图片缓存里?因为没有增加tex, panoExit后就dispose了, 所以乘以一个小系数。担心图片缓存也可能导致崩溃)
         //let texArea = 0, texArea3dTiles = 0, visiTexArea = 0
         //texArea = viewer.memoryModelCountInfo.otherTexArea + viewer.memoryModelCountInfo.tileTexArea
         //posCount = viewer.memoryModelCountInfo.otherPosCount + viewer.memoryModelCountInfo.tilePosCount 
-        //posCount3dTiles = viewer.memoryModelCountInfo.tilePosCount
         //texArea3dTiles = viewer.memoryModelCountInfo.tileTexArea
-         
+        let posCount3dTiles = viewer.memoryModelCountInfo.tilePosCount
          
        
         let otherModelWeight = viewer.memoryModelCountInfo.otherPosCount*eachObjPosWeight + viewer.memoryModelCountInfo.otherTexArea * eachTexPxWeight
@@ -1087,16 +1084,14 @@ let MergeEditor = {
         
         let overRatio = Potree.allWeight / maxMemory 
         
-        let visiRatio1 = posCount3dTiles == 0 ? Infinity : viewer.visiVertexCount / posCount3dTiles 
+        let visiRatio1 = posCount3dTiles == 0 ? Infinity : viewer.visi3dtileVertCount / posCount3dTiles 
         let visiRatio2 = Potree.lru.numPoints == 0 ? Infinity : Potree.numVisiblePoints / Potree.lru.numPoints  
         let resolved 
          
         let restMemory = maxMemory - fixedPart //去除固定的part后
              
          
-        if(overRatio > 1){
-            
-            
+        if(overRatio > 1){ 
             
             const MinRestMemory = 400 
             if(restMemory < MinRestMemory){ 
@@ -1128,6 +1123,8 @@ let MergeEditor = {
                     resolved = true
                 }
             }
+            //if(isNaN(Potree.settings.tiles3DMaxMemory))debugger                   
+            
             if(!resolved){// visiRatio1 > visiRatio2   
                 
                 if( visiRatio2 > 0.9){//压缩太小了,或者说没什么缓存就超额了,只能继续减少显示个数
@@ -1174,11 +1171,12 @@ let MergeEditor = {
                 
             if(Potree.settings.tiles3DMaxMemory < Potree.config.tiles3DMaxMemory ){  
                 let s_ = visiRatio1 / (visiRatio1 + visiRatio2) * s + 1
-                const addCount = 20 * s_
-                Potree.settings.tiles3DMaxMemory += addCount 
-                Potree.settings.tiles3DMaxMemory = Math.min(Potree.settings.tiles3DMaxMemory, Potree.config.tiles3DMaxMemory)
-            }
-                   
+                if(!isNaN(s)){
+                    const addCount = 20 * s_
+                    Potree.settings.tiles3DMaxMemory += addCount 
+                    Potree.settings.tiles3DMaxMemory = Math.min(Potree.settings.tiles3DMaxMemory, Potree.config.tiles3DMaxMemory)
+                }
+            }                     
             
             resolved = true
         } 
@@ -1222,8 +1220,7 @@ let MergeEditor = {
                 tileset.options.maximumScreenSpaceError = e
            
             })   
-        }
-        
+        }               
         //针对很卡的设备:(卡的也容易崩溃)
         Potree.config.pointDensity.high.pointBudget = math.linearClamp(Potree.fpsRendered2, [2, 50], [1e6,  6e6])
         

+ 76 - 58
src/custom/start.js

@@ -1193,72 +1193,90 @@ export function mergeEditStart(dom, mapDom, {queryCloudLonLatUrl}={}){
                 model.renderOrder = Potree.config.renderOrders.model;  //same as glb
             }
             
-            if(Potree.settings.maintainBtmZ) 
-            {//transform --------维持离地高度和中心点的版本(local ver)
-                let updateBound = ()=>{ 
-                    model.updateMatrixWorld()
-                    viewer.updateModelBound() 
-                }  
-                let maintainBtmZAndCenter = ()=>{ 
-                    MergeEditor.maintainBoundXY(model)
-                    MergeEditor.setModelBtmHeight(model) 
-                    updateBound()
-                    model.dispatchEvent('transformChanged')  
-                }
-                model.addEventListener('position_changed', ()=>{
-                    updateBound()
-                    MergeEditor.getBoundCenter(model);//更新boundcenter
-                    MergeEditor.computeBtmHeight(model)
-                    if(prop.bottomRange && (model.btmHeight > prop.bottomRange.max || model.btmHeight < prop.bottomRange.min)){
-                        model.btmHeight = THREE.Math.clamp(model.btmHeight, prop.bottomRange.min, prop.bottomRange.max)
-                        MergeEditor.setModelBtmHeight(model)
-                        updateBound()
-                    }  
-                    model.dispatchEvent('transformChanged') 
-                })
-                model.addEventListener("rotation_changed", maintainBtmZAndCenter )
-                model.addEventListener("scale_changed", maintainBtmZAndCenter )
-                model.addEventListener('transformChanged', ()=>{
-                    MergeEditor.modelTransformCallback(model)
-                })
-                //离地高度只是boundingbox在transform后的最低点的高度,而非模型transform后的最低点的高度,所以旋转过后看起来不太准确
-            } else
+            let initModel = (model)=>{
+                model.updateMatrixWorld()
+                viewer.updateModelBound()
             
-            {//transform --------维持中心点的版本
-                let updateBound = ()=>{ 
-                    model.updateMatrixWorld()
-                    viewer.updateModelBound() 
-                }  
-                let maintainCenter = (e)=>{ 
-                    //MergeEditor.maintainBoundXY(model) 
-                    e.by2d || model.atPath || MergeEditor.maintainBoundCenter(model) 
-                    updateBound()
-                    model.dispatchEvent({type:'transformChanged',  byControl:e.byControl})  
+                if(Potree.settings.maintainBtmZ) 
+                    {//transform --------维持离地高度和中心点的版本(local ver)
+                        let updateBound = ()=>{ 
+                            model.updateMatrixWorld()
+                            viewer.updateModelBound() 
+                        }  
+                        let maintainBtmZAndCenter = ()=>{ 
+                            MergeEditor.maintainBoundXY(model)
+                            MergeEditor.setModelBtmHeight(model) 
+                            updateBound()
+                            model.dispatchEvent('transformChanged')  
+                        }
+                        model.addEventListener('position_changed', ()=>{
+                            updateBound()
+                            MergeEditor.getBoundCenter(model);//更新boundcenter
+                            MergeEditor.computeBtmHeight(model)
+                            if(prop.bottomRange && (model.btmHeight > prop.bottomRange.max || model.btmHeight < prop.bottomRange.min)){
+                                model.btmHeight = THREE.Math.clamp(model.btmHeight, prop.bottomRange.min, prop.bottomRange.max)
+                                MergeEditor.setModelBtmHeight(model)
+                                updateBound()
+                            }  
+                            model.dispatchEvent('transformChanged') 
+                        })
+                        model.addEventListener("rotation_changed", maintainBtmZAndCenter )
+                        model.addEventListener("scale_changed", maintainBtmZAndCenter )
+                        model.addEventListener('transformChanged', ()=>{
+                            MergeEditor.modelTransformCallback(model)
+                        })
+                        //离地高度只是boundingbox在transform后的最低点的高度,而非模型transform后的最低点的高度,所以旋转过后看起来不太准确
+                    } else
+                    
+                    {//transform --------维持中心点的版本
+                        let updateBound = ()=>{ 
+                            model.updateMatrixWorld()
+                            viewer.updateModelBound() 
+                        }  
+                        let maintainCenter = (e)=>{ 
+                            //MergeEditor.maintainBoundXY(model) 
+                            e.by2d || model.atPath || MergeEditor.maintainBoundCenter(model) 
+                            updateBound()
+                            model.dispatchEvent({type:'transformChanged',  byControl:e.byControl})  
+                        }
+                        model.addEventListener('position_changed', (e)=>{//要先发送position_changed再其他
+                            updateBound()
+                            MergeEditor.getBoundCenter(model);//更新boundcenter
+                    
+                            model.dispatchEvent({type:'transformChanged',  byControl:e.byControl}) 
+                    })
+                    model.addEventListener("rotation_changed", maintainCenter )
+                    model.addEventListener("scale_changed", maintainCenter )
+                    model.addEventListener('transformChanged', ()=>{
+                        MergeEditor.modelTransformCallback(model)
+                    }) 
                 }
-                model.addEventListener('position_changed', (e)=>{//要先发送position_changed再其他
-                    updateBound()
-                    MergeEditor.getBoundCenter(model);//更新boundcenter
-            
-                    model.dispatchEvent({type:'transformChanged',  byControl:e.byControl}) 
-                })
-                model.addEventListener("rotation_changed", maintainCenter )
-                model.addEventListener("scale_changed", maintainCenter )
-                model.addEventListener('transformChanged', ()=>{
-                    MergeEditor.modelTransformCallback(model)
-                })
-            
+
+
+
+                MergeEditor.getBoundCenter(model) //初始化
+                //model.lastMatrixWorld = model.matrixWorld.clone()
+                model.lastMatrixWorld = new THREE.Matrix4
+                MergeEditor.modelTransformCallback(model, true)                
             } 
+            initModel(model)
             
-            model.updateMatrixWorld()
-            viewer.updateModelBound()
             
-            MergeEditor.getBoundCenter(model) //初始化
-            //model.lastMatrixWorld = model.matrixWorld.clone()
-            model.lastMatrixWorld = new THREE.Matrix4
-            MergeEditor.modelTransformCallback(model, true)
             prop.scale != void 0 && model.isPointcloud && model.changePointSize()   //有的被缩放的很小导致testMaxNodeLevel时距离较远时被return 但点云过大急需changesize
             
              
+            {
+                let oldClone = model.clone
+                model.clone = ()=>{//SkinnedMesh的模型复制了有问题,不能移动
+                    let copyObj = oldClone.apply(model)
+                    copyObj.boundingBox = model.boundingBox.clone()
+                    copyObj.updateMatrixWorld()  
+                    copyObj.gltf = model.gltf
+                    viewer.gltfAddAnimation(copyObj)
+                    initModel(copyObj)
+                    return copyObj
+                }
+            }
             
             done && done(model) // 先发送成功,因为2d界面会随机执行changePosition等初始化,然后这边再将模型移到中心地面上
             

+ 1 - 1
src/custom/utils/Common.js

@@ -217,7 +217,7 @@ var Common = {
         }else if(typeof object1 == "object"){
             var keys1 = Object.keys(object1)
             var keys2 = Object.keys(object2)
-            if(!Common.ifSame(keys1,keys2,simpleEqualClass, orderRequest))return false;
+            if(!Common.ifSame(keys1,keys2,simpleEqualClass))return false;
             
             for(let i in object1){
                 var same = Common.ifSame(object1[i], object2[i], simpleEqualClass, orderRequest);

+ 16 - 1
src/custom/utils/math.js

@@ -212,7 +212,22 @@ var math = {
     },
 	
 	
-	
+	timeDifference(startStr,  endStr ){//格式:'YEAR-MM-DD HH:MM:SS' 
+        let start = new Date(startStr) 
+        let end = new Date(endStr)  
+        let dur = Math.abs(end - start)  
+        let o = [['天', 24*1000*60*60] , ['时',1000*60*60] , ['分',1000*60],  ['秒',1000] ]
+        let resultStr = '' 
+        for(let i=0;i<o.length;i++){
+            if(dur >= o[i][1]){
+                resultStr += parseInt(dur / o[i][1]) + o[i][0]  
+                dur %= o[i][1]  //最后剩下一点给毫秒?
+            }
+        }
+        return resultStr
+        
+        
+    },
 	getFootPoint : function(oldPos, p1, p2, restricInline){ //找oldPos在线段p1, p2上的垂足
 		/*  
         let p1o = new THREE.Vector3().subVectors(o,p1)

+ 40 - 35
src/custom/viewer/ViewerNew.js

@@ -5859,9 +5859,13 @@ export class Viewer extends ViewerBase{
         }
         object.updateMatrixWorld()
         MergeEditor.getBoundCenter(object) //初始化  
-        fileInfo_.objLoader && (fileInfo_.objLoader.inUse = false)        
+        fileInfo_.objLoader && (fileInfo_.objLoader.inUse = false)
+
+ 
+        
         done && done(object, fileInfo_)
         
+         
         this.dispatchEvent({type:'modelLoaded',model:object})
         
         
@@ -5961,38 +5965,9 @@ export class Viewer extends ViewerBase{
             loaders.glbLoader.unlitMat = true//!!fileInfo.unlit
             loaders.glbLoader.load(fileInfo.url,  ( gltf, total )=>{    
                 console.log('loadGLTF', gltf, 'aniCount:',gltf.animations.length)
-                let model = gltf.scene
-                if(gltf.animations.length){
-                    let skeleton = new THREE.SkeletonHelper( model );
-					
-                    viewer.scene.scene.add(skeleton)
-                    model.skeletonHelper = skeleton //注意:不能覆盖model.skeleton,因其另有 */
-                    if(Potree.settings.isOfficial){
-                        Potree.Utils.updateVisible(skeleton,'hide',false)  
-                    }else{
-                        skeleton.material.opacity = 0.1
-                        skeleton.bones.forEach((bone,i)=>{
-                            let label = new Potree.TextSprite({
-                                text:`${i} : ${bone.name}`, sizeInfo:{width2d:130},  fontWeight:'',  fontsize:20,
-                                backgroundColor:{r:255,g:255,b:255,a:0}, textColor:{r:255,g:255,b:255,a:1},
-                            }) 
-                            label.sprite.material.depthTest = false 
-                            bone.add(label)
-                        })
-                    }
-                    let mixer = new THREE.AnimationMixer( model);
-                    model.actions = []
-                    gltf.animations.forEach(ani=>{
-                        if(ani.tracks.filter(e=>e instanceof THREE.QuaternionKeyframeTrack).length > 1){ //>一帧的
-                            model.actions.push(mixer.clipAction( ani )); 
-                        } 
-                    })
-                    model.mixer = mixer
-                }
-                model.gltf = gltf
-                //model.traverse(e=>e.frustumCulled = false)  为什么有的动画模型离近了会消失,173ver的不会
-
-                
+                let model = gltf.scene  
+                model.gltf = gltf 
+                this.gltfAddAnimation(model)
                 loadDone(model) 
             }, onProgress, onError)
             
@@ -6171,7 +6146,7 @@ export class Viewer extends ViewerBase{
             
         }
         
-        
+        //model.traverse(e=>e.frustumCulled = false)  为什么有的动画模型离近了会消失,173ver的不会
          
     }
     
@@ -6191,7 +6166,37 @@ export class Viewer extends ViewerBase{
     }
     
      
-    
+    gltfAddAnimation(model){
+        
+        if(model.gltf?.animations.length){
+            let skeleton = new THREE.SkeletonHelper( model );
+            
+            viewer.scene.scene.add(skeleton)
+            model.skeletonHelper = skeleton //注意:不能覆盖model.skeleton,因其另有 */
+            //if(Potree.settings.isOfficial){
+                Potree.Utils.updateVisible(skeleton,'hide',false)  
+            /* }else{
+                skeleton.material.opacity = 0.1
+                skeleton.bones.forEach((bone,i)=>{
+                    let label = new Potree.TextSprite({
+                        text:`${i} : ${bone.name}`, sizeInfo:{width2d:130},  fontWeight:'',  fontsize:20,
+                        backgroundColor:{r:255,g:255,b:255,a:0}, textColor:{r:255,g:255,b:255,a:1},
+                    }) 
+                    label.sprite.material.depthTest = false 
+                    bone.add(label)
+                })
+            } */
+            let mixer = new THREE.AnimationMixer( model);
+            model.actions = []
+            model.gltf.animations.forEach(ani=>{
+                if(ani.tracks.filter(e=>e instanceof THREE.QuaternionKeyframeTrack).length > 1){ //>一帧的
+                    model.actions.push(mixer.clipAction( ani )); 
+                } 
+            })
+            model.mixer = mixer
+        }
+        
+    }
     setAllTilesets(){//让所有tileset执行fun。    objs里每个model最多两层tileset
         let models = arguments.length == 2 ? [arguments[0]] : this.objs.children //如果要设定某个model的tileset,就传第一个参数
         let fun = arguments[1] || arguments[0]