xzw vor 2 Monaten
Ursprung
Commit
924c65ecc8

+ 2 - 1
examples/splatter.html

@@ -145,7 +145,8 @@
     var splatId = browser.urlHasValue('m',true)  
     var splatId = browser.urlHasValue('m',true)  
     var urlAtSplatter = !browser.urlHasValue('urlAtCurrent') ; 
     var urlAtSplatter = !browser.urlHasValue('urlAtCurrent') ; 
     
     
-    Potree.settings.ctrlRotInvSmooth = true 
+    //Potree.settings.ctrlRotInvSmooth = true
+    Potree.settings.firstCtrlRotSmooth = true 
     Potree.settings.rotAroundPoint = false  
     Potree.settings.rotAroundPoint = false  
     Potree.settings.noAA = true 
     Potree.settings.noAA = true 
     
     

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

@@ -1524,7 +1524,7 @@ async function getResponseError(response) {
     }
     }
 
 
     message += text;
     message += text;
-    message = message.length > 60 ? "".concat(message.slice(60), "...") : message;
+    //message = message.length > 200 ? "".concat(message.slice(60), "...") : message;
   } catch (error) {}
   } catch (error) {}
 
 
   return message;
   return message;

+ 4 - 11
libs/three.js/build/three.module.js

@@ -12776,7 +12776,6 @@ function WebGLAttributes( gl, capabilities ) {
 		gl.bindBuffer( bufferType, buffer );
 		gl.bindBuffer( bufferType, buffer );
 
 
          
          
-         
         //xzw add:
         //xzw add:
         if(attribute.updateWhole){//expand 
         if(attribute.updateWhole){//expand 
             //重置
             //重置
@@ -12786,15 +12785,9 @@ function WebGLAttributes( gl, capabilities ) {
 		}
 		}
 
 
 
 
-        /* if(attribute.updateWhole){//expand 
-            //重置
-             //gl.bufferData( bufferType, attribute.count * attribute.itemSize * array.BYTES_PER_ELEMENT, attribute.usage );
-            gl.bufferData( bufferType, array, attribute.usage );
-            delete attribute.updateWhole
-		}else   */if ( updateRange.count === - 1 ) { 
+        if ( updateRange.count === - 1 ) { 
 			// Not using update ranges 
 			// Not using update ranges 
-             gl.bufferSubData( bufferType, 0, array );
-             //gl.bufferSubData(bufferType, 0, array, 0, array.length )  
+             gl.bufferSubData( bufferType, 0, array ); 
 
 
 		} else {
 		} else {
 
 
@@ -24141,8 +24134,8 @@ function WebGLRenderer( parameters ) {
 		} else if ( geometry.isInstancedBufferGeometry ) {
 		} else if ( geometry.isInstancedBufferGeometry ) {
 
 
 			//const instanceCount = Math.min( geometry.instanceCount, geometry._maxInstanceCount );
 			//const instanceCount = Math.min( geometry.instanceCount, geometry._maxInstanceCount );
-
-			renderer.renderInstances( drawStart, drawCount, geometry.instanceCount  /* instanceCount */ );  //xzw改
+            const instanceCount = geometry.instanceCount == Infinity ? geometry._maxInstanceCount : geometry.instanceCount     //xzw改 for splatter 
+			renderer.renderInstances( drawStart, drawCount, instanceCount );
 
 
 		} else {
 		} else {
 
 

+ 33 - 2
src/custom/objects/3dgs/splatter/SplatterThree.js

@@ -74,8 +74,37 @@ function uint16ToFloat32(uint16) {
         // 正规数
         // 正规数
         return (sign ? -1 : 1) * Math.pow(2, exponent - 15) * (1 + fraction / Math.pow(2, 10));
         return (sign ? -1 : 1) * Math.pow(2, exponent - 15) * (1 + fraction / Math.pow(2, 10));
     }
     }
+} 
+function uint16ToFloat32Fast(uint16) {// 快 5 倍
+    // 快速转换,精度约为半精度浮点数
+    const sign = (uint16 & 0x8000) << 16;
+    const exponent = (uint16 & 0x7C00);
+    const fraction = (uint16 & 0x03FF);
+    
+    if (exponent === 0) {
+        // 零或次正规数:fraction * 2^(-24)
+        const value = fraction * 0.000000059604644775390625; // 2^-24
+        return (sign ? -value : value);
+    } else if (exponent === 0x7C00) {
+        // 无穷大或NaN
+        return fraction ? NaN : (sign ? -Infinity : Infinity);
+    } else {
+        // 正规数:快速构造IEEE 754单精度
+        // 指数部分:半精度的 exponent-15 + 127
+        const exp32 = ((exponent >> 10) + 112) << 23;
+        // 尾数部分:左移13位(10位->23位)
+        const frac32 = fraction << 13;
+        // 组合成32位整数的位表示
+        const bits = sign | exp32 | frac32;
+        
+        // 使用DataView进行类型转换(比Float32Array更快)
+        const buffer = new ArrayBuffer(4);
+        new DataView(buffer).setUint32(0, bits);
+        return new DataView(buffer).getFloat32(0);
+    }
 }
 }
 
 
+
 var __defNormalProp = (A, g, I) => g in A ? Object.defineProperty(A, g, {
 var __defNormalProp = (A, g, I) => g in A ? Object.defineProperty(A, g, {
     enumerable: true,
     enumerable: true,
     configurable: true,
     configurable: true,
@@ -3438,7 +3467,9 @@ export class Splatter extends THREE.EventDispatcher{
         return this.visible_
         return this.visible_
     }
     }
     
     
-    
+    loadColl(){
+        Collider.loadCollMesh();
+    }
     
     
     
     
     
     
@@ -3690,7 +3721,7 @@ export class Splatter extends THREE.EventDispatcher{
         if(browser.urlHasValue('stopHit'))return
         if(browser.urlHasValue('stopHit'))return
         
         
         viewer.addTimeMark('hitTest', 'start')
         viewer.addTimeMark('hitTest', 'start')
-        console.log('hitTest', Date.now() - lastHit),
+        //console.log('hitTest', Date.now() - lastHit),
         lastHit = Date.now()
         lastHit = Date.now()
          
          
         if (!Array.isArray(mouse))
         if (!Array.isArray(mouse))

+ 70 - 61
src/custom/viewer/ViewerNew.js

@@ -6018,67 +6018,76 @@ export class Viewer extends ViewerBase{
             })
             })
             
             
         }else if(fileInfo.fileType == '3dTiles'){ 
         }else if(fileInfo.fileType == '3dTiles'){ 
-                        
-            let result = await Loader3DTiles.load({
-                url: fileInfo.url, 
-                gltfLoader : loaders.glbLoader, 
-                //renderer: SceneRenderer.renderer   
-                options: {      
-                    //dracoDecoderPath: '../utils/loaders/DRACOLoader/draco',
-                    //basisTranscoderPath: '../utils/loaders/KTX2Loader/basis',
-                    maximumScreenSpaceError: fileInfo.maximumScreenSpaceError || 80 ,  //越小越清晰。           如果本身tiles很密很小这个值就不能很大。
-                    //maxDepth: 100, 
-                    //maximumMemoryUsage: 100, //缓存大小,见tiles3DMaxMemory。单位M(但实际结果是 2.5*maximumMemoryUsage + 750  。超过2G会崩, 所以应该小于540) 若太小,密集的tile反复加载很卡. (任务管理器刷新网页后若内存不掉就要结束进程否则虚高)
-                    debug: browser.urlHasValue('tilesBox'),  //show box  
-                    parent: this.scene.scene, 
-                    is4dkkModel: fileInfo.is4dkkModel, //是否是4dkk中的模型. 通常maximumScreenSpaceError需要10
-                    updateTime: fileInfo.updateTime, //加后缀防止缓存
-                    //cesiumIONToken:  'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI5OTc4MTFiYS1hYzhlLTQ3ZjYtYWJmMi1hODMwMWMxZGRiYTQiLCJpZCI6ODU1NDksImlhdCI6MTY1Mzc5NDc5N30.ldTi8bF3XvSOgnZrMITokRW4kE3i8Mwbarhk5OQbPsI',
-                },  
-            })  
-            //console.log(result)
-            result.model.runtime = result.runtime
- 
-               
-            let loaded = false
-            let tileset = result.runtime.getTileset()
-            tileset.addEventListener('endTileLoading', function (data) {//Tileset3D
-                if (data.loadingCount == 0 && !loaded) {
-                    loaded = true; 
-                    //console.log('loaded!!!!!!!!!!!!!')
+            let result 
+            try{ 
+                 result = await Loader3DTiles.load({
+                    url: fileInfo.url, 
+                    gltfLoader : loaders.glbLoader, 
+                    //renderer: SceneRenderer.renderer   
+                    options: {      
+                        //dracoDecoderPath: '../utils/loaders/DRACOLoader/draco',
+                        //basisTranscoderPath: '../utils/loaders/KTX2Loader/basis',
+                        maximumScreenSpaceError: fileInfo.maximumScreenSpaceError || 80 ,  //越小越清晰。           如果本身tiles很密很小这个值就不能很大。
+                        //maxDepth: 100, 
+                        //maximumMemoryUsage: 100, //缓存大小,见tiles3DMaxMemory。单位M(但实际结果是 2.5*maximumMemoryUsage + 750  。超过2G会崩, 所以应该小于540) 若太小,密集的tile反复加载很卡. (任务管理器刷新网页后若内存不掉就要结束进程否则虚高)
+                        debug: browser.urlHasValue('tilesBox'),  //show box  
+                        parent: this.scene.scene, 
+                        is4dkkModel: fileInfo.is4dkkModel, //是否是4dkk中的模型. 通常maximumScreenSpaceError需要10
+                        updateTime: fileInfo.updateTime, //加后缀防止缓存
+                        //cesiumIONToken:  'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI5OTc4MTFiYS1hYzhlLTQ3ZjYtYWJmMi1hODMwMWMxZGRiYTQiLCJpZCI6ODU1NDksImlhdCI6MTY1Mzc5NDc5N30.ldTi8bF3XvSOgnZrMITokRW4kE3i8Mwbarhk5OQbPsI',
+                    },  
+                })
+                    
+                //console.log(result)
+                result.model.runtime = result.runtime
+     
+                   
+                let loaded = false
+                let tileset = result.runtime.getTileset()
+                tileset.addEventListener('endTileLoading', function (data) {//Tileset3D
+                    if (data.loadingCount == 0 && !loaded) {
+                        loaded = true; 
+                        //console.log('loaded!!!!!!!!!!!!!')
+                    }
+                });
+                tileset.addEventListener('tileLoaded',(e)=>{ //每一个tile加载完要更改透明度
+                    let master = result.model.parent == this.objs ? result.model : result.model.parent//最多两层 
+                    MergeEditor.changeOpacity(e.tileContent,  master.opacity)
+                    if(master.panos) viewer.images360.judgeModelMat(e.tileContent)
+                    //set Layers ?
+                    Potree.Utils.setObjectLayers(e.tileContent, 'model')  
+                    fileInfo.side && e.tileContent.traverse(e=>e.material && (e.material.side = fileInfo.side))//新软件导出的带坐标的box型模型要反面才看的到,干脆双面
+                })
+                
+                { 
+                    let vi = true
+                    Object.defineProperty( result.model, "visible", {
+                        get: function() {
+                            return vi 
+                        },
+                        set: function(v) { 
+                            vi = v 
+                            result.model.visiChangeCallback()
+                        }  
+                    })  
                 }
                 }
-            });
-            tileset.addEventListener('tileLoaded',(e)=>{ //每一个tile加载完要更改透明度
-                let master = result.model.parent == this.objs ? result.model : result.model.parent//最多两层 
-                MergeEditor.changeOpacity(e.tileContent,  master.opacity)
-                if(master.panos) viewer.images360.judgeModelMat(e.tileContent)
-                //set Layers ?
-                Potree.Utils.setObjectLayers(e.tileContent, 'model')  
-                fileInfo.side && e.tileContent.traverse(e=>e.material && (e.material.side = fileInfo.side))//新软件导出的带坐标的box型模型要反面才看的到,干脆双面
-            })
+                let v = true
+                result.model.visiChangeCallback = (force)=>{
+                    let visi = result.model.realVisible()
+                    tileset.visible = visi;  //同步,使不加载 
+                    if(force || v != visi){
+                        tileset.nextForceUpdate = true
+                        v = visi
+                    } 
+                }
+                loadDone(result.model/* , null, fileInfo.url */) 
+                   
+            }catch(e){ 
+                //debugger  // Error: Failed to fetch resource
+                console.error(e)
+                onError && onError(e)
+            }            
             
             
-            { 
-                let vi = true
-                Object.defineProperty( result.model, "visible", {
-                    get: function() {
-                        return vi 
-                    },
-                    set: function(v) { 
-                        vi = v 
-                        result.model.visiChangeCallback()
-                    }  
-                })  
-            }
-            let v = true
-            result.model.visiChangeCallback = (force)=>{
-                let visi = result.model.realVisible()
-                tileset.visible = visi;  //同步,使不加载 
-                if(force || v != visi){
-                    tileset.nextForceUpdate = true
-                    v = visi
-                } 
-            }
-            loadDone(result.model/* , null, fileInfo.url */) 
             
             
         }else if(fileInfo.fileType == 'dxf'){
         }else if(fileInfo.fileType == 'dxf'){
             loaders.dxfLoader.load(fileInfo.url,(object)=>{
             loaders.dxfLoader.load(fileInfo.url,(object)=>{
@@ -6797,8 +6806,8 @@ export class Viewer extends ViewerBase{
         Gradients.ir = segs 
         Gradients.ir = segs 
         this.switchHotType()
         this.switchHotType()
     }
     }
-     
-     
+      
+       
     applyViewJson(info) { 
     applyViewJson(info) { 
         if(info.yaw != void 0){
         if(info.yaw != void 0){
             this.mainViewport.view.applyJson(info) 
             this.mainViewport.view.applyJson(info) 

+ 1 - 1
src/navigation/CharacterControl.js

@@ -378,7 +378,7 @@ export class CharacterControl extends THREE.EventDispatcher{
                     
                     
                     this.onGround = coll.delta.z > 0//Math.abs(miniDelta * this.velocity.z * 0.25 / collCount)  
                     this.onGround = coll.delta.z > 0//Math.abs(miniDelta * this.velocity.z * 0.25 / collCount)  
                     if(!this.onGround){
                     if(!this.onGround){
-                        console.log('this.onGround', this.onGround)
+                        //console.log('this.onGround', this.onGround)
                         //coll.delta.normalize()
                         //coll.delta.normalize()
                         //this.velocity.addScaledVector(coll.delta, -coll.delta.dot(this.velocity)) ;
                         //this.velocity.addScaledVector(coll.delta, -coll.delta.dot(this.velocity)) ;
                     } 
                     } 

+ 6 - 13
src/navigation/FirstPersonControlsNew.js

@@ -68,7 +68,7 @@ export class FirstPersonControls extends THREE.EventDispatcher {
         //this.enableChangePos = true
         //this.enableChangePos = true
         
         
         this.viewer.addEventListener('camera_changed',(e)=>{
         this.viewer.addEventListener('camera_changed',(e)=>{
-            if(this.viewer.name == 'mapViewer' || e.changeInfo && e.changeInfo.positionChanged && !viewer.mainViewport.view.isFlying() ){
+            if(this.enabled && (this.viewer.name == 'mapViewer' || e.changeInfo && e.changeInfo.positionChanged && !viewer.mainViewport.view.isFlying() )){
                 this.setFPCMoveSpeed(e.viewport)
                 this.setFPCMoveSpeed(e.viewport)
             } 
             } 
         })
         })
@@ -149,22 +149,15 @@ export class FirstPersonControls extends THREE.EventDispatcher {
                     view.applyToCamera(camera)
                     view.applyToCamera(camera)
                      
                      
                 }else{
                 }else{
-                    if(Potree.settings.ctrlRotInvSmooth){//朝相反方向且更顺滑 like orbitControl
+                    if(Potree.settings.firstCtrlRotSmooth){//更顺滑  
+                     
                         let rotationSpeed = Potree.browser.isMobile() ? 0.006 : 0.002;   
                         let rotationSpeed = Potree.browser.isMobile() ? 0.006 : 0.002;   
                         let old = this.yawDelta
                         let old = this.yawDelta
-                        this.yawDelta -= e.drag.mouseDelta.x * rotationSpeed;
-                        this.pitchDelta -= e.drag.mouseDelta.y * rotationSpeed; 
-                          
-                      /*  let rotationSpeed = Potree.browser.isMobile() ? 4 : 2;   
-                        let old = this.yawDelta
-                        this.yawDelta -= e.drag.pointerDelta.x * rotationSpeed;
-                        this.pitchDelta -= e.drag.pointerDelta.y * rotationSpeed; 
-                           */
-                         
-                         
+                        this.yawDelta += e.drag.mouseDelta.x * rotationSpeed;
+                        this.pitchDelta += e.drag.mouseDelta.y * rotationSpeed;  
                          //console.log('mouseDelta', e.drag.mouseDelta.toArray(),  e.drag.pointerDelta.toArray() )
                          //console.log('mouseDelta', e.drag.mouseDelta.toArray(),  e.drag.pointerDelta.toArray() )
                     }else{
                     }else{
-                        
+                        //高斯的执行这个会卡
                         let _matrixWorld = camera.matrixWorld
                         let _matrixWorld = camera.matrixWorld
                         camera.matrixWorld = new THREE.Matrix4;//unproject 前先把相机置于原点 
                         camera.matrixWorld = new THREE.Matrix4;//unproject 前先把相机置于原点 
                         
                         

+ 7 - 6
src/navigation/OrbitControlsNew.js

@@ -51,6 +51,7 @@ export class OrbitControls extends THREE.EventDispatcher{
         this.dollyEnd = new THREE.Vector2
         this.dollyEnd = new THREE.Vector2
         this.minRadius = standartMinRadius
         this.minRadius = standartMinRadius
         this.maxRadius = 300
         this.maxRadius = 300
+        this.constantlyForward = true
         
         
         this.keys = {
         this.keys = {
             FORWARD: ['W'.charCodeAt(0), 38],
             FORWARD: ['W'.charCodeAt(0), 38],
@@ -90,10 +91,7 @@ export class OrbitControls extends THREE.EventDispatcher{
             ndrag.y *= -1 */
             ndrag.y *= -1 */
            
            
 			if (mode == 'rotate') {
 			if (mode == 'rotate') {
-                let ndrag = e.drag.mouseDelta.clone()
-                /* if(Potree.settings.ctrlRotInvSmooth){
-                    ndrag.x *= -1
-                }  */        
+                let ndrag = e.drag.mouseDelta.clone() 
                 if(ndrag.x || ndrag.y){
                 if(ndrag.x || ndrag.y){
                     view.cancelFlying('rotate')
                     view.cancelFlying('rotate')
                 }
                 }
@@ -390,7 +388,7 @@ export class OrbitControls extends THREE.EventDispatcher{
 			let moveDown = this.keys.DOWN.some(e => ih.pressedKeys[e]);
 			let moveDown = this.keys.DOWN.some(e => ih.pressedKeys[e]);
             
             
              
              
-            let moveSpeed = this.currentViewport.getMoveSpeed() / 20;
+            let moveSpeed = this.currentViewport.getMoveSpeed() / 80;
             let px = 0 , py = 0, pz = 0
             let px = 0 , py = 0, pz = 0
             if(moveForward){
             if(moveForward){
                 py = 1 * moveSpeed 
                 py = 1 * moveSpeed 
@@ -409,7 +407,10 @@ export class OrbitControls extends THREE.EventDispatcher{
                 pz = -1 * moveSpeed 
                 pz = -1 * moveSpeed 
             }
             }
             
             
-            (px!=0 || py!=0 || pz!=0) && view.translate(px, py, pz, {forceHorizon:!Potree.settings.orbitCtlMoveFree  }); 
+            if(px!=0 || py!=0 || pz!=0){
+                //console.log(px,py,px)
+                view.translate(px, py, pz, {forceHorizon:!Potree.settings.orbitCtlMoveFree  }); 
+            }
              
              
         }
         }