xzw 9 kuukautta sitten
vanhempi
commit
bd571f3340

+ 1 - 1
gulpfile.js

@@ -97,7 +97,7 @@ gulp.task('webserver', gulp.series(async function() {
 	server = connect.server({
 		port: 1234,
         host:'0.0.0.0',
-		https: true,
+		https: false,
         middleware: function(connect, opt) {
           return [
             // 首先,使用addResponseHeaders中间件来设置响应头

+ 6 - 6
src/custom/mergeStartTest.js

@@ -318,15 +318,16 @@ var start = function(dom, mapDom, number, fileServer, webSite){ //t-Zvd3w0m
     //viewer.setControls(viewer.orbitControls) 
      
       
-             
-         
+               
+            
     let tilesetUrls = [   
+        'http://192.168.0.25/oss/manage/media-library/result/test/tileset.json',
         'https://4dkk.4dage.com/scene_view_data/SG-t-GvKLWIKfJGC/images/3dtiles/tileset.json?_=1742785956443',
         'https://4dkk.4dage.com/fusion/test/b3dm/modelId_11947/tileset.json',//json有的包含多个materials,之前会花掉,现在解决了
         'https://4dkk.4dage.com/fusion/testb3dm/test001/tileset.json',  //体育中心
       // `${Potree.resourcePath}/models/3dtiles/SG-CPwbgVaPvcY/tileset.json`,
       // 'https://4dkk.4dage.com/scene_view_data/SG-CPwbgVaPvcY/images/3dtiles/tileset.json?_=1730963063808',
-         
+        'https://testgis.4dage.com/LVBADUI_qp/tileset.json', //村庄   含rtcCenter 
         'https://4dkk.4dage.com/fusion/testb3dm/modelId_613/tileset.json',//"952.16MB"  港一
          
         'https://4dkk.4dage.com/fusion/test/b3dm/testModel/tileset.json',  //靠近后tile缺块,但box看起来没错, 似乎只是文件问题,tile的children少了
@@ -334,10 +335,9 @@ var start = function(dom, mapDom, number, fileServer, webSite){ //t-Zvd3w0m
     
     
         'https://4dkk.4dage.com/fusion/test/b3dm/modelId_1093/tileset.json',
-        
-        'http://192.168.0.135:14000/oss/fusion/test/b3dm/modelId_1175/tileset.json',
+         
         'http://4dkk.4dage.com/fusion/test/b3dm/modelId_1075/tileset.json', //depth 11 较高  ,为了防止卡顿需要提高maximumScreenSpaceError
-        'https://testgis.4dage.com/LVBADUI_qp/tileset.json', //村庄   含rtcCenter  
+         
         
         //'https://4dkk.4dage.com/scene_view_data/SG-t-hFdFM1eCYs6/images/3dtiles/tileset.json?_=1716879888240',
         //(`scene_view_data/{num}/images/3dtiles/tileset.json?_=${Date.now()}`),

+ 4 - 1
src/custom/modules/mergeModel/MergeEditor.js

@@ -500,6 +500,9 @@ let MergeEditor = {
             e.geometry && e.geometry.dispose() 
             e.material && e.material.dispose()
         }
+        
+        model.skeletonHelper && model.add(model.skeletonHelper ) //打包一起dispose
+        model.titleLabel?.dispose()
         if(model.isPointcloud){
             dispose(model)
             viewer.scene.removePointCloud(model)
@@ -525,7 +528,7 @@ let MergeEditor = {
             })
             
         }
-       
+          
         this.changeModelPointCount(model,'sub') 
         this.updateMemoryUsage()
     },

+ 4 - 2
src/custom/modules/siteModel/SiteModel.js

@@ -213,8 +213,10 @@ var SiteModel = {
         viewer.updateFpVisiDatasets()
         
         
-        let mapViewport = viewer.mapViewer.viewports[0]
-        this.SplitScreen.split({siteModel:true/* , viewports:[{name:'Top',viewport : mapViewport  }] */})
+        let mapViewport = viewer.mapViewer.viewports[0] 
+        this.SplitScreen.split({siteModel:true }) 
+         
+        
         
         
         viewer.viewports.forEach(e=>{

+ 6 - 3
src/custom/objects/Monitor.js

@@ -208,12 +208,13 @@ export default class Monitor extends THREE.Object3D{
         })
         
         this.cameraModel.addEventListener('click',()=>{
+            if(viewer.scene.monitors.some(e=>e.isWatching))return
             this.watch()
         }) 
     }
     
     
-    watch(){
+    watch(){ 
         let camera = viewer.mainViewport.camera
         this.updateAspect()
         this.isWatching = true
@@ -239,7 +240,7 @@ export default class Monitor extends THREE.Object3D{
             },
             callback:()=>{
                 this.video.play()
-                
+                viewer.dispatchEvent({type:'watchMonitor',monitor:this})
             },
             duration:1500
         })
@@ -267,10 +268,11 @@ export default class Monitor extends THREE.Object3D{
             callback:()=>{
                 viewer.renderArea.style['pointer-events'] = ''; 
                 this.showVideo(false)
-                viewer.mainViewport.view.setRotMode('standard')
+                viewer.mainViewport.view.setRotMode('standard')  
             },
             duration:1000
         })
+        viewer.dispatchEvent({type:'exitWatchMonitor',monitor:this})
     }
     
     
@@ -297,6 +299,7 @@ export default class Monitor extends THREE.Object3D{
             this.cylinder.bottom.material = this.normalMat 
             //this.cylinder.bottom.renderOrder = RenderOrder.visibleFloor
         }
+        
     }
     
 

+ 94 - 22
src/custom/objects/Tag.js

@@ -8,7 +8,7 @@ import {TextSprite} from './TextSprite.js'
 import Sprite from './Sprite.js' 
 
 import DepthBasicMaterial from "../materials/DepthBasicMaterial.js";
-
+import CursorDeal from "../utils/CursorDeal.js";  
 
 
 const depthMatProp = {  //为了防止拉远后因放大而一半嵌入墙。 
@@ -26,7 +26,7 @@ const depthMatProp = {  //为了防止拉远后因放大而一半嵌入墙。
 const planeGeo = new THREE.PlaneBufferGeometry(1,1)
 let texLoader = new THREE.TextureLoader() 
 
-let lineMat  
+let lineMat, dragPointMat   
  
 const defaultLineLength = 1
 const defaultSpotScale = 0.35
@@ -52,13 +52,19 @@ class Tag extends THREE.Shim.FollowRootObject{
         this.position.copy(o.position)
         this.normal = o.normal != void 0 ? o.normal : new THREE.Vector3(0,0, 1)
          
-        this.dragEnable = true 
+        
         this.build(o)
         this.bindEvent()
-         
+        this.dragEnable = true 
         
     }
     
+    set dragEnable(state){
+        this.lineDragPoint.visible = state
+    }
+    get dragEnable(){
+        return this.lineDragPoint.visible
+    }
     
     
     
@@ -72,6 +78,7 @@ class Tag extends THREE.Shim.FollowRootObject{
         this.spot = new THREE.Mesh(planeGeo, new DepthBasicMaterial(Object.assign({},depthMatProp,{
             transparent:true, 
         })))  
+        this.spot.name = 'spot'
         this.spot.scale.set(defaultSpotScale,defaultSpotScale,defaultSpotScale) 
         this.spot.renderOrder = this.spot.pickOrder = Potree.config.renderOrders.tag.spot; 
         Potree.settings.isOfficial || this.changeMap(Potree.resourcePath+'/textures/spot_default.png')
@@ -102,7 +109,25 @@ class Tag extends THREE.Shim.FollowRootObject{
         this.add(this.line)
         viewer.tags.add(this)
         
-        
+        if(!dragPointMat){ 
+            let map = texLoader.load(Potree.resourcePath+'/textures/whiteCircle.png',()=>{})
+            dragPointMat = {
+                default: new THREE.MeshBasicMaterial({
+                    map, transparent:true, color:'#0fe', opacity:0, depthTest:false, 
+                }),   
+                hover: new THREE.MeshBasicMaterial({
+                    map, transparent:true, color:'#0fe', opacity:0.4, depthTest:false, 
+                })
+            }
+        }
+         
+        this.lineDragPoint = new THREE.Mesh(planeGeo, dragPointMat.default) //修改线高度时出现的小圆点
+        this.lineDragPoint.scale.set(0.15,0.15,0.15); 
+        this.lineDragPoint.name = 'lineDragPoint' 
+        this.lineDragPoint.renderOrder = this.lineDragPoint.pickOrder = Potree.config.renderOrders.tag.spot + 3;
+        group.add(this.lineDragPoint) 
+         
+         
         this.updatePose()
         
     }
@@ -114,6 +139,12 @@ class Tag extends THREE.Shim.FollowRootObject{
         let hoverState = {
             line:0,spot:0,label:0
         }
+        let grabbingObject
+        let setDragPointState = (state)=>{
+            this.lineDragPoint.material = state ? dragPointMat.hover : dragPointMat.default
+            this.spot.material.opacity = state ? 0.5 : 1 
+            this.titleLabel.sprite.material.opacity = state ? 0.5 : 1 
+        }
         
         {
             //因为只有有intersect时才能拖拽,所以写得比较麻烦
@@ -124,20 +155,21 @@ class Tag extends THREE.Shim.FollowRootObject{
                     cursor[name] = state
                     viewer.dispatchEvent({
                         type : "CursorChange", action,  name 
-                    })
+                    }) 
                 }
             }
-            [this.line, this.spot].forEach(e=>e.addEventListener('mousemove',(e)=>{ 
-                hoverState[e.target.name == 'tagLine' ? 'line' : 'spot'] = 1 
-                if(this.dragEnable && viewer.inputHandler.intersect){//能拖拽时
-                    setCursor('hoverGrab', 'add')
+            
+            [this.line, this.spot, this.lineDragPoint].forEach(e=>e.addEventListener('mousemove',(e)=>{ 
+                hoverState[e.target.name] = 1 
+                if(this.dragEnable && (viewer.inputHandler.intersect || hoverState['lineDragPoint'])){//能拖拽时
+                    setCursor('hoverGrab', 'add') 
                 }else{
                     setCursor('hoverGrab', 'remove')
-                }
+                } 
             }));
-            [this.line, this.spot].forEach(e=>e.addEventListener('mouseleave',(e)=>{
-                hoverState[e.target.name == 'tagLine' ? 'line' : 'spot'] = 0   
-                if(!hoverState.line && !hoverState.spot){//都没hover才取消    
+            [this.line, this.spot, this.lineDragPoint].forEach(e=>e.addEventListener('mouseleave',(e)=>{
+                hoverState[e.target.name] = 0   
+                if(!Object.values(hoverState).some(e=>e)){//都没hover才取消    
                     setCursor('hoverGrab', 'remove')
                 }
                 /* if(!hoverState.line && !hoverState.spot && !hoverState.label){
@@ -147,17 +179,25 @@ class Tag extends THREE.Shim.FollowRootObject{
             
             
                 
-            [this.line, this.spot].forEach(e=>e.addEventListener('drag',(e)=>{ 
-                if(this.dragEnable && cursor.grabbing){ 
-                    let info = viewer.tagTool.getPoseByIntersect(e)
-                    info && this.changePos(info)
+            [this.line, this.spot, this.lineDragPoint].forEach(e=>e.addEventListener('drag',(e)=>{ 
+                if(this.dragEnable && cursor.grabbing){  
+                    if(e.target.name == 'lineDragPoint'){
+                        this.dragLineLen(e)
+                    }else{
+                        let info = viewer.tagTool.getPoseByIntersect(e)
+                        info && this.changePos(info)
+                    } 
                 }
             }));
-            [this.line, this.spot].forEach(e=>e.addEventListener('startDragging',(e)=>{ 
-                this.dragEnable && viewer.inputHandler.intersect && setCursor('grabbing', 'add')
+            [this.line, this.spot, this.lineDragPoint].forEach(e=>e.addEventListener('startDragging',(e)=>{ 
+                this.dragEnable && (viewer.inputHandler.intersect || e.target.name == 'lineDragPoint') && setCursor('grabbing', 'add')
+                grabbingObject = e.target.name
+                grabbingObject == 'lineDragPoint' && setDragPointState(true)
             }));
-            [this.line, this.spot].forEach(e=>e.addEventListener('drop',(e)=>{ 
+            [this.line, this.spot, this.lineDragPoint].forEach(e=>e.addEventListener('drop',(e)=>{ 
                 this.dragEnable && setCursor('grabbing', 'remove')
+                grabbingObject = null
+                hoverState['lineDragPoint'] || setDragPointState(false)
             }));
             //拖拽线来移动。虽然理想方式是拟真,拖拽时不改变在线上的位置,使之平移,但仔细想想似乎办不到。因为墙面normal是不固定的,尤其在交界处难以确定。不知鼠标在空中的位置,即使是平行镜头移动也无法满足所有情况。matterport是加了底座,移动也是改变底座中心。
         }
@@ -185,10 +225,25 @@ class Tag extends THREE.Shim.FollowRootObject{
         this.titleLabel.sprite.addEventListener('spriteUpdated',()=>{
             this.updateDepthParams()
         })
+        
+        
+        //-----------set line length 
+        
+        // CursorDeal
+        this.lineDragPoint.addEventListener('mouseover',(e)=>{
+            setDragPointState(true)
+        })
+        this.lineDragPoint.addEventListener('mouseleave',(e)=>{
+            grabbingObject != 'lineDragPoint' && setDragPointState(false)
+        }) 
+        
+        
+       
     }
     
     
     
+    
     updateDepthParams(){//为了避免热点嵌入墙壁,实时根据其大小更新材质系数。 但是在倾斜的角度看由于遮挡距离很大肯定会嵌入的
         let s = this.titleLabel.parent.scale.x 
         let names = ['clipDistance', 'occlusionDistance', 'startClipDis', 'startOcclusDis']
@@ -225,10 +280,27 @@ class Tag extends THREE.Shim.FollowRootObject{
     }
     
     changeLineLen(len){
-        this.lineLength = len
+        this.lineLength = parseFloat(len)
         this.updatePose() 
     }
     
+    dragLineLen(e){ //拖拽线的顶端修改线长度
+        let endPos = this.normal.clone().multiplyScalar(this.lineLength).applyMatrix4(this.matrixWorld)
+        let normal = this.normal.clone().applyQuaternion(this.getWorldQuaternion(new THREE.Quaternion))
+        const projected = endPos.clone().project(e.drag.dragViewport.camera);
+        projected.x = e.pointer.x
+        projected.y = e.pointer.y
+         
+        const unprojected = projected.clone().unproject(e.drag.dragViewport.camera);
+        let moveVec = new THREE.Vector3().subVectors(unprojected, endPos);
+            moveVec = moveVec.projectOnVector(normal) 
+         
+        
+        let newLength = Math.max(0, this.lineLength + moveVec.dot(normal) )
+        //console.log(moveVec,newLength)
+        this.changeLineLen(newLength)   
+        this.dispatchEvent('dragLineLen')
+    }
     
     
     changePos(info){//注:onMesh时在非平地上拖拽,热点旋转会一直变 

+ 25 - 0
src/custom/objects/tool/Path.js

@@ -167,6 +167,7 @@ export class Path extends ctrlPolygon{
             this.titleLabel.sprite.material.depthTest = false
             let line = LineDraw.createFatLine([new THREE.Vector3(0,0,0), new THREE.Vector3(0,0,titleLineHeight)],  Object.assign({},depthProps,{color: '#ffffff', lineWidth: 1, transparent:true, fadeFar: this.fadeFar}))
             line.renderOrder = Potree.config.renderOrders.line
+            this.titleLine = line
             group.add(line)
             group.add(this.titleLabel)
             this.titleLabel.position.z = titleLineHeight
@@ -459,6 +460,30 @@ export class Path extends ctrlPolygon{
         viewer.dispatchEvent('content_changed')
     }
     
+    setLineLength(len){
+        this.lineLength = parseFloat(len)
+        
+    }
+    
+     
+    dragLineLen(e){ //拖拽线的顶端修改线长度
+        let endPos = this.normal.clone().multiplyScalar(this.lineLength).applyMatrix4(this.matrixWorld)
+        let normal = this.normal.clone().applyQuaternion(this.getWorldQuaternion(new THREE.Quaternion))
+        const projected = endPos.clone().project(e.drag.dragViewport.camera);
+        projected.x = e.pointer.x
+        projected.y = e.pointer.y
+         
+        const unprojected = projected.clone().unproject(e.drag.dragViewport.camera);
+        let moveVec = new THREE.Vector3().subVectors(unprojected, endPos);
+            moveVec = moveVec.projectOnVector(normal) 
+         
+        
+        let newLength = Math.max(0, this.lineLength + moveVec.dot(normal) )
+        //console.log(moveVec,newLength)
+        this.changeLineLen(newLength)  
+        this.dispatchEvent('dragLineLen')
+            
+    }
     updateEdge(){ 
         if(this.lastUpdatePoints_ && Potree.Common.ifSame(this.lastUpdatePoints_,this.points) && this.halfPathWidth == this.lastHalfPathWidth) return //没变 不更新
         //this.edge.geometry = MeshDraw.getExtrudeGeo(edgeExtrudePoints, null,  {extrudePath: this.points, openEnded:true, shapeDontClose:true/* , dontSmooth:true, steps: this.points.length-1 */})

+ 3 - 3
src/custom/objects/tool/TransformControls.js

@@ -559,7 +559,7 @@ var TransformControls = function ( camera, domElement, options ) {
             //add:
              
             object.dispatchEvent({
-                type: "position_changed" 
+                type: "position_changed" ,byControl:true
             });
 
 		} else if ( mode === 'scale' ) {
@@ -643,7 +643,7 @@ var TransformControls = function ( camera, domElement, options ) {
             
            
             object.dispatchEvent({
-                type: "scale_changed" 
+                type: "scale_changed" , byControl:true
             });
     
 
@@ -782,7 +782,7 @@ var TransformControls = function ( camera, domElement, options ) {
             //add:
             
             object.dispatchEvent({
-                type: "rotation_changed" 
+                type: "rotation_changed" , byControl:true
             });
             
             

+ 4 - 4
src/custom/start.js

@@ -1023,13 +1023,13 @@ export function mergeEditStart(dom, mapDom){
                     //MergeEditor.maintainBoundXY(model) 
                     e.by2d || MergeEditor.maintainBoundCenter(model) 
                     updateBound()
-                    model.dispatchEvent('transformChanged')  
+                    model.dispatchEvent({type:'transformChanged',  byControl:e.byControl})  
                 }
-                model.addEventListener('position_changed', ()=>{//要先发送position_changed再其他
+                model.addEventListener('position_changed', (e)=>{//要先发送position_changed再其他
                     updateBound()
                     MergeEditor.getBoundCenter(model);//更新boundcenter
             
-                    model.dispatchEvent('transformChanged') 
+                    model.dispatchEvent({type:'transformChanged',  byControl:e.byControl}) 
                 })
                 model.addEventListener("rotation_changed", maintainCenter )
                 model.addEventListener("scale_changed", maintainCenter )
@@ -1094,7 +1094,7 @@ export function mergeEditStart(dom, mapDom){
                 loadDone(object)
             }
                
-            let info = { 
+            let info = {  
                 fileType: prop.type, 
                 id: prop.id,
                 unlit: prop.unlit,

+ 5 - 6
src/custom/utils/math.js

@@ -214,12 +214,11 @@ var math = {
 	
 	
 	getFootPoint : function(oldPos, p1, p2, restricInline){ //找oldPos在线段p1, p2上的垂足
-		/* if(isWorld){//输出全局坐标 需要考虑meshGroup.position
-			p1 = p1.clone();
-			p2 = p2.clone();
-			p1.y += mainDesign.meshGroup.position.y;
-			p2.y += mainDesign.meshGroup.position.y;
-		} */
+		/*  
+        let p1o = new THREE.Vector3().subVectors(o,p1)
+        let p1p2 =  new THREE.Vector3().subVectors(p2,p1)
+        let p1F = p1o.projectOnVector(p1p2)
+        return new THREE.Vector3().addVectors(p1,p1F) */ //也可以这样
         if(p1.equals(p2))return p1.clone()
 		var op1 = oldPos.clone().sub(p1); 
 		var p1p2 = p1.clone().sub(p2)

+ 5 - 3
src/custom/viewer/ViewerNew.js

@@ -5706,8 +5706,10 @@ export class Viewer extends ViewerBase{
                      
                     boundingBox_.min.set( - radius, - radius, - radius );
                     boundingBox_.max.set( radius, radius, radius );
+               
+                     boundingBox_.translate(center)
                     
-                    
+                    //2025:很少有模型用这个,之前是哪个模型有的?目前看到cesium的模型有 'http://192.168.0.25/oss/manage/media-library/result/test/tileset.json',
                     
                 }else{
                     return console.error('json boundingVolume 缺少信息') 
@@ -5911,10 +5913,10 @@ export class Viewer extends ViewerBase{
                 let model = gltf.scene
                 if(gltf.animations.length){
                     let skeleton = new THREE.SkeletonHelper( model );
-					//skeleton.visible = false; 
+					
                     viewer.scene.scene.add(skeleton)
                     model.skeletonHelper = skeleton //注意:不能覆盖model.skeleton,因其另有 */
-                    skeleton.material.opacity = 0.1
+                    Potree.Utils.updateVisible(skeleton,'hide',false) //skeleton.material.opacity = 0.1
                     let mixer = new THREE.AnimationMixer( model);
                     model.actions = []
                     gltf.animations.forEach(ani=>{