xzw 2 vuotta sitten
vanhempi
commit
5eeafca166
1 muutettua tiedostoa jossa 47 lisäystä ja 5 poistoa
  1. 47 5
      src/custom/objects/Sprite.js

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

@@ -110,15 +110,53 @@ export default class Sprite extends THREE.Mesh{
             let orient2d
             let orient2d
         
         
             if(this.lineDir){
             if(this.lineDir){
-                /* let r1 = Potree.Utils.getPos2d(new THREE.Vector3, camera, viewer.renderArea, e.viewport);
-                let r2 = Potree.Utils.getPos2d(this.lineDir, camera, viewer.renderArea, e.viewport); */
+                this.root.updateMatrix();//先更新,getWorldPosition才能得到正确的
+                this.root.updateMatrixWorld(true)
+                let center = this.root.getWorldPosition(new THREE.Vector3())
+                //由于两个端点容易在屏幕外,所以使用center和center加dir
+                let lineDir = this.lineDir.clone();
+                
+                
+                let r1 = Potree.Utils.getPos2d(center, camera, viewer.renderArea, e.viewport); 
+                if(!r1.trueSide)return console.error('!r1.trueSide')
+                    
+                let r2, point2
+                
+                let p2State = '', len=1,/*  tryTimes = 0, */ p2StateHistory = []
+                while(p2State != 'got' && p2StateHistory.length<10){ 
+                    point2 = center.clone().add(lineDir).multiplyScalar(len);
+                    r2 = Potree.Utils.getPos2d(point2, camera, viewer.renderArea, e.viewport);  
+                    if(!r2.trueSide){ 
+                        if(!p2StateHistory.includes('tooLong-reverse')){
+                            p2State = 'tooLong-reverse'  //先尝试反向
+                        }else{
+                            p2State = 'tooLong'
+                        }
+                    }else if(r2.pos.distanceTo(r1)<5 && !p2StateHistory.includes('tooLong')){//和r1距离太近,要加长
+                     
+                        p2State = 'tooShort'
+                    }else{ 
+                        p2State = 'got'; break;
+                    }
+                     
+                    len =  p2State == 'tooLong-reverse' ? -len : p2State == 'tooLong' ?  len / 2 : p2State == 'tooShort' ? len * 3 : len
+                     
+                    p2StateHistory.push(p2State)
+                    /* tryTimes ++ */
+                }
+                console.log(p2StateHistory,len)
+                
+                if(!r2.trueSide){
+                     return console.log('  !r2.trueSide', )
+                }
                 
                 
-                let r1 = Potree.Utils.getPos2d(this.lineDir[0], camera, viewer.renderArea, e.viewport);
-                let r2 = Potree.Utils.getPos2d(this.lineDir[1], camera, viewer.renderArea, e.viewport);
                 
                 
+                /* let r1 = Potree.Utils.getPos2d(this.lineDir[0], camera, viewer.renderArea, e.viewport);
+                let r2 = Potree.Utils.getPos2d(this.lineDir[1], camera, viewer.renderArea, e.viewport);
+                 
                 if(!r1.trueSide || !r2.trueSide){
                 if(!r1.trueSide || !r2.trueSide){
                     return console.log('!r1.trueSide || !r2.trueSide', )
                     return console.log('!r1.trueSide || !r2.trueSide', )
-                }
+                }*/
                 let p1 = r1.pos,  p2 = r2.pos
                 let p1 = r1.pos,  p2 = r2.pos
                 let vec = new THREE.Vector2().subVectors(p1,p2);
                 let vec = new THREE.Vector2().subVectors(p1,p2);
                 let angle = -vec.angle() 
                 let angle = -vec.angle() 
@@ -195,6 +233,10 @@ export default class Sprite extends THREE.Mesh{
         //console.log(this.root.name + e.viewport.name + " : "+this.root.matrixWorld.elements)
         //console.log(this.root.name + e.viewport.name + " : "+this.root.matrixWorld.elements)
     }
     }
     
     
+    
+     
+    
+    
     setUniforms(name,value){
     setUniforms(name,value){
         this.material.setUniforms(name,value) 
         this.material.setUniforms(name,value) 
     }
     }