xzw 10 mesi fa
parent
commit
e425d34beb

+ 1 - 1
src/custom/mergeStartTest.js

@@ -306,7 +306,7 @@ var start = function(dom, mapDom, number, fileServer, webSite){ //t-Zvd3w0m
         }
         
         let hfov = cameraLight.getHFOVForCamera(viewer.mainViewport.camera,true)
-        let minRadius = maxSize  / Math.tan(hfov/2)
+        let minRadius = maxSize  / Math.tan(hfov/2) 
         //viewer.mainViewport.view.lookAt(center)
         viewer.mainViewport.view.setView({  
             position: center.clone().sub(viewer.mainViewport.view.direction.clone().multiplyScalar(minRadius)),

+ 9 - 15
src/custom/modules/mergeModel/MergeEditor.js

@@ -71,19 +71,20 @@ let MergeEditor = {
             applyData: (data)=>{ 
                 if(data.object.parent /* && data.object == this.selected */){
                     data = Potree.Common.CloneObject(data) //避免使用后更改数据又被使用 
-                    data.matrix.decompose( data.object.position, data.object.quaternion, data.object.scale );
+                    let matrix = data.object.parent ? data.object.parent.matrixWorld.clone().invert().multiply(data.matrixWorld) : data.matrixWorld
+                    matrix.decompose( data.object.position, data.object.quaternion, data.object.scale );
                     data.object.boundCenter.copy(data.boundCenter)
                     data.object.dispatchEvent('changeByHistory') 
                     data.object.dispatchEvent('transformChanged')                    
                     viewer.dispatchEvent('content_changed')
-                    
+                    //回退到上一次编辑的全局位置
                     return true
                 }  
             },
             getData:(object)=>{   
                 return {
                     object,
-                    matrix:  object.matrixWorld.clone(),
+                    matrixWorld:  object.matrixWorld.clone(),
                     boundCenter: object.boundCenter.clone()
                 }
             } 
@@ -568,31 +569,24 @@ let MergeEditor = {
             this.selected = null
             this.transformControls.detach()        //viewer.transformObject(null);
             //console.log('selectModel', null)
-        } 
-        
-        
-        
-        
-        
+        }  
          
-
-        
+        this.bus.dispatchEvent('changeSelect') 
         
     },
     
-    updateBoxHelper(model){
+    updateBoxHelper(model){ 
         let size = new THREE.Vector3
         model.boundingBox.getSize(size)
-        size.multiply(model.scale)
+        size.multiply(model.getWorldScale(new THREE.Vector3))
         this.boxHelper.scale.copy(size) 
         
         let center = new THREE.Vector3 
         model.boundingBox.getCenter(center) 
         center.applyMatrix4(model.matrixWorld)
-        //center.add(model.position)     
         this.boxHelper.position.copy(center)
          
-        this.boxHelper.quaternion.copy(model.quaternion)  
+        model.getWorldQuaternion(this.boxHelper.quaternion)    
         viewer.dispatchEvent('content_changed')
     },
     

+ 15 - 5
src/custom/objects/Sprite.js

@@ -240,7 +240,7 @@ export default class Sprite extends THREE.Mesh{
               
             } 
                 
-                 
+            
             let parentQua = this.root.parent.getWorldQuaternion(new THREE.Quaternion)
             this.root.quaternion.multiplyQuaternions(parentQua.invert(),camera.quaternion)    //乘上parentQua.invert()是为了中和掉父结点的qua,使只剩下camera.quaternion
         
@@ -269,16 +269,26 @@ export default class Sprite extends THREE.Mesh{
                 }else{
                     scale = info.scale
                 }
-            }else{ 
+            }else{  
                 scale = math.getScaleForConstantSize($.extend(info,{//规定下最小最大像素 
                     camera , position:this.root.getWorldPosition(new THREE.Vector3()) ,
                     resolution: e.viewport.resolution//2
                 })) 
+                if(this.root.parent){
+                    let scale_ = this.root.parent.getWorldScale(new THREE.Vector3) 
+                    scale = new THREE.Vector3(scale/scale_.x, scale/scale_.y, scale/scale_.z )
+                } 
             } 
             
-            if(!isNaN(scale)){
-                this.root.scale.set(scale, scale, scale); 
-            } 
+            
+            if(typeof scale == 'number'){
+                if(!isNaN(scale)){
+                    this.root.scale.set(scale, scale, scale); 
+                } 
+            }else{
+                this.root.scale.copy(scale)
+            }
+            
         }
         
         

+ 1 - 0
src/custom/objects/Tag.js

@@ -278,6 +278,7 @@ class Tag extends THREE.Shim.FollowRootObject{
     }
     
     changeLineLen(len){
+        if(len == this.lineLength)return
         this.lineLength = parseFloat(len)
         this.updatePose() 
     }

+ 1 - 1
src/custom/objects/TextSprite.js

@@ -35,7 +35,7 @@ export class TextSprite extends THREE.Object3D{
 		this.fontsize = options.fontsize ||  16; 
         this.lineSpace = options.lineSpace 
         this.textBorderColor = options.textBorderColor ? Common.CloneObject(options.textBorderColor):{ r: 0, g: 0, b: 0, a: 1.0 };
-		this.backgroundColor = options.backgroundColor ? Common.CloneObject(options.backgroundColor):{ r: 255, g: 255, b: 255, a: 1.0 };
+		this.backgroundColor = options.backgroundColor ? Common.CloneObject(options.backgroundColor):{ r: 255, g: 255, b: 255, a: 0.7 };
 		this.textColor = options.textColor ? Common.CloneObject(options.textColor):{r: 0, g: 0, b: 0, a: 1.0};
         this.borderColor = options.borderColor  ? Common.CloneObject(options.borderColor):{ r: 0, g: 0, b: 0, a: 0.0 };
 		this.borderRadius = options.borderRadius || 6;

+ 1 - 1
src/custom/objects/tool/Measure.js

@@ -1195,7 +1195,7 @@ export class Measure extends ctrlPolygon{
                 multiColors[this.color] = colorObject 
                  
                 {//清理不用的colorObject
-                    let measures = viewer.scene.measurements.slice()
+                    let measures = viewer.scene.measurements.filter(e=>e instanceof Measure)
                     measures.includes(this) || measures.push(this)
                     for(let co in multiColors){
                         multiColors[co].useCount = 0

+ 49 - 49
src/custom/objects/tool/Path.js

@@ -148,7 +148,7 @@ export class Path extends ctrlPolygon{
         this.selectStates = {}
         this.setFadeFar(null)
         this.geoPoints = []
-        this.titleLineHeight = titleLineHeight || prop.titleLineHeight
+        this.lineHeight = prop.lineHeight == void 0 ? titleLineHeight : prop.lineHeight
         
         
         {
@@ -168,13 +168,13 @@ export class Path extends ctrlPolygon{
                 textAlign: Potree.settings.isOfficial && 'left'
             }))
             this.titleLabel.sprite.material.depthTest = false
-            let line = LineDraw.createFatLine([new THREE.Vector3(0,0,0), new THREE.Vector3(0,0, this.titleLineHeight)],  Object.assign({},depthProps,{color: '#ffffff', lineWidth: 1, transparent:true, fadeFar: this.fadeFar}))
+            let line = LineDraw.createFatLine([new THREE.Vector3(0,0,0), new THREE.Vector3(0,0, this.lineHeight)],  Object.assign({},depthProps,{color: '#ffffff', lineWidth: 1, transparent:true, fadeFar: this.fadeFar}))
             line.renderOrder = Potree.config.renderOrders.line
-            line.name = 'line'
+            line.name = 'line' 
             this.titleLine = line
             group.add(line)
             group.add(this.titleLabel)
-            this.titleLabel.position.z = this.titleLineHeight
+            this.titleLabel.position.z = this.lineHeight
             this.add(group);
             this.setTitleVisi(this.titleLabel.parent, false,  'noPoint')            
             this.setTitle(Potree.settings.isOfficial ? '' : 'title' )
@@ -201,56 +201,54 @@ export class Path extends ctrlPolygon{
                 this.lineDragPoint.material = state ? dragPointMat.hover : dragPointMat.default 
                 this.titleLabel.sprite.material.opacity = state ? 0.5 : 1 
             }
-            
-            let ifHover = ()=>{ 
+            let autoPointState = ()=>{
+                setDragPointState(this.editEnable && (hoverState.lineDragPoint || grabbingObject == 'lineDragPoint'))  
+            }
+            let autoCursor = ()=>{ 
                 if(this.editEnable && Object.values(hoverState).some(e=>e)){     
-                    CursorDeal.remove('hoverGrab')
-                }else{
                     CursorDeal.add('hoverGrab')
+                }else{
+                    CursorDeal.remove('hoverGrab')
                 }
+                autoPointState()
             }
             [line, this.lineDragPoint].forEach(e=>e.addEventListener('mouseover',(e)=>{ 
                 hoverState[e.target.name] = 1 
-                ifHover()
+                autoCursor() 
             }));
             [line, this.lineDragPoint].forEach(e=>e.addEventListener('mouseleave',(e)=>{ 
                 hoverState[e.target.name] = 0
-                ifHover()
+                autoCursor()
             }));
             
-             
-            line.addEventListener('startDragging',(e)=>{  
-                this.editEnable && CursorDeal.add('grabbing') 
-            });
-            line.addEventListener('drop',(e)=>{  
-                this.editEnable && CursorDeal.remove('grabbing')
-            });
-             
-            line.addEventListener('drag',(e)=>{    
+            [line, this.lineDragPoint].forEach(e=>e.addEventListener('startDragging',(e)=>{ 
+                grabbingObject = e.target.name
+                this.editEnable && (CursorDeal.add('grabbing'), autoPointState())  
+            }));
+            [line, this.lineDragPoint].forEach(e=>e.addEventListener('drop',(e)=>{ 
+                grabbingObject = null
+                this.editEnable && (CursorDeal.remove('grabbing'), autoPointState())  
+            }));
+            
+            [line, this.lineDragPoint].forEach(e=>e.addEventListener('drag',(e)=>{ 
                 if(this.editEnable){//一旦用户拖动了title,title就固定了,不再随着path居中
-                    let position
-                    if(e.intersect?.location){
-                        position = e.intersect?.location
-                    }else{
-                        let {x,y} = Potree.Utils.getPointerPosAtHeight(0,e.pointer)
-                        position = new THREE.Vector3(x,y,0)
+                    if(e.target.name == 'line'){
+                        let position
+                        if(e.intersect?.location){
+                            position = e.intersect?.location
+                        }else{
+                            let {x,y} = Potree.Utils.getPointerPosAtHeight(0,e.pointer)
+                            position = new THREE.Vector3(x,y,0)
+                        }
+                        this.updateTitlePos(position)
+                        this.dispatchEvent({type:'titlePosChanged',  position ,  root:e.intersect?.pointcloud || e.intersect?.object})
+                    }else if(e.target.name == 'lineDragPoint'){  
+                        this.dragLineLen(e)  
                     }
-                    this.updateTitlePos(position)
-                    this.dispatchEvent({type:'titlePosChanged',  position ,  root:e.intersect?.pointcloud || e.intersect?.object})
                 }
-            });
-            
-            
-            
-          
-            
-            
-            
-            
-            
-            
-            
-            
+            }));
+             
+             
             
             
         }
@@ -435,8 +433,7 @@ export class Path extends ctrlPolygon{
     }//如果后续还出现index错误的问题,可以改为绘制时用折线,完成后用曲线。
 
 
-
-
+ 
 
     createMarkerLabel(text, hasHoverEvent){
          
@@ -511,15 +508,18 @@ export class Path extends ctrlPolygon{
         viewer.dispatchEvent('content_changed')
     }
     
-    setTitleLineHeight(len){
-        this.titleLineHeight = parseFloat(len)
-        
+    setLineHeight(len){
+        if(len == this.lineHeight)return
+        this.lineHeight = parseFloat(len)
+        this.titleLabel.position.z = this.lineHeight 
+        this.titleLabel.updatePose() 
+        LineDraw.updateLine(this.titleLine, [new THREE.Vector3(0,0,0), new THREE.Vector3(0,0,this.lineHeight )])
     }
     
      
     dragLineLen(e){ //拖拽线的顶端修改线长度
-        let endPos = this.normal.clone().multiplyScalar(this.lineLength).applyMatrix4(this.matrixWorld)
-        let normal = this.normal.clone().applyQuaternion(this.getWorldQuaternion(new THREE.Quaternion))
+        let endPos = this.titleLabel.getWorldPosition(new THREE.Vector3)
+        let normal = new THREE.Vector3(0,0,1)
         const projected = endPos.clone().project(e.drag.dragViewport.camera);
         projected.x = e.pointer.x
         projected.y = e.pointer.y
@@ -529,9 +529,9 @@ export class Path extends ctrlPolygon{
             moveVec = moveVec.projectOnVector(normal) 
          
         
-        let newLength = Math.max(0, this.lineLength + moveVec.dot(normal) )
+        let newLength = Math.max(0, this.lineHeight + moveVec.dot(normal) )
         //console.log(moveVec,newLength)
-        this.changeLineLen(newLength)  
+        this.setLineHeight(newLength)  
         this.dispatchEvent('dragLineLen')
             
     }

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

@@ -101,7 +101,7 @@ import { VRButton } from '../../../libs/three.js/extra/VRButton.js';
 import DxfLoader from '../../loader/DxfLoader.js'
  
 import {Splat} from '../objects/3dgs/Splat.js'
- 
+import {CCDIKSolver, CCDIKHelper} from '../../../libs/three.js/extra/CCDIKSolver.js'
 
 
 
@@ -4449,7 +4449,7 @@ export class Viewer extends ViewerBase{
                 dis += camera.near
             }
             dis = Math.max(0.1,dis)
-            
+            o.maxDis && (dis = Math.min(o.maxDis,dis))
             //三个顶点以上的由于measure的中心不等于bound的中心,所以点会超出bound外。 且由于视椎近大远小,即使是两个点的,bound居中后线看上去仍旧不居中.
              
             //获得相机最佳位置
@@ -5131,6 +5131,8 @@ export class Viewer extends ViewerBase{
         {
             let hasAnimation
             window.pauseAni || this.objs.children.forEach(model=>{
+                //model.traverse(object=>object.isSkinnedMesh && object.computeBoundingSphere())
+                
                 if(model.mixer && model.mixer._nActiveActions){ 
                     hasAnimation = true
                     model.mixer.update(deltaTime)
@@ -5138,7 +5140,8 @@ export class Viewer extends ViewerBase{
             }) //以后有空的话用frust判断是否在画面内,不在的话即使有动画也不要 update 和 render, 如果paused的话是不是也可以不update
             hasAnimation && (this.dispatchEvent('content_changed'))
         }
-        
+        if ( this.IKSolver ) this.IKSolver.update();
+       
         
         
 		// let vrActive = viewer.renderer.xr.isPresenting;
@@ -5916,7 +5919,19 @@ export class Viewer extends ViewerBase{
 					
                     viewer.scene.scene.add(skeleton)
                     model.skeletonHelper = skeleton //注意:不能覆盖model.skeleton,因其另有 */
-                    Potree.Utils.updateVisible(skeleton,'hide',false) //skeleton.material.opacity = 0.1
+                    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=>{
@@ -6170,7 +6185,35 @@ export class Viewer extends ViewerBase{
      
       
 
-
+    setAniIK(model, object){//不知道为什么一加上胳膊一直动啊??
+        let handIndex = 9
+        //model.skeletonHelper.bones[handIndex].attach( object ); //bone可以绑定一个球
+        let mesh = children[0].children[1] //vanguard_Mesh
+        const iks = [
+				{
+					target: 10,  //大拇指
+					effector: 9, // 必须是第一个link的child  手腕
+					links: [
+						{
+							index: 8, // 肘关节
+							/* rotationMin: new THREE.Vector3( 1.2, - 1.8, - .4 ),
+							rotationMax: new THREE.Vector3( 1.7, - 1.1, .3 ) */
+						},
+						{
+							index: 7, // 肩关节 
+							/* rotationMin: new THREE.Vector3( 0.1, - 0.7, - 1.8 ),
+							rotationMax: new THREE.Vector3( 1.1, 0, - 1.4 ) */
+						},
+					],
+				}
+			];
+        const IKSolver = new CCDIKSolver( mesh, iks );
+        const ccdikhelper = new CCDIKHelper( mesh, iks, 1.5  );
+        viewer.scene.scene.add( ccdikhelper );
+        viewer.IKSolver = IKSolver
+        
+        
+    }
      
 
 

+ 3 - 1
src/viewer/EDLRendererNew.js

@@ -319,8 +319,10 @@ export class EDLRenderer{//Eye-Dome Lighting 眼罩照明
                 } 
                 
                 if(Potree.settings.intersectOnObjs){
-                    Potree.Utils.setCameraLayers(camera, ['model','light'])  
+                    Potree.Utils.setCameraLayers(camera, ['model','light'])   
                     viewer.objs.traverse(e=>{if(e.material)e._OlddepthWrite = e.material.depthWrite, e.material.depthWrite = true}) //否则半透明的mesh无法遮住测量线
+                    viewer.dispatchEvent({type: "render.begin2",  viewer , viewport: params.viewport   });
+             
                     renderer.render(viewer.scene.scene, camera);
                     viewer.objs.traverse(e=>{if(e.material)e.material.depthWrite = e._OlddepthWrite})
                 }