xzw 1 tahun lalu
induk
melakukan
047833d108
2 mengubah file dengan 45 tambahan dan 9 penghapusan
  1. 2 2
      src/custom/modules/panos/Images360.js
  2. 43 7
      src/custom/objects/tool/Measure.js

+ 2 - 2
src/custom/modules/panos/Images360.js

@@ -1703,7 +1703,7 @@ Images360.prototype.updateCube = (function(){//增加细分的版本,且垂直
     let minTanBeta = minDis / height    /* (pano0.position.z - pano0.floorPosition.z) */
     let minBeta = Math.atan(minTanBeta)
     const maxSinAlpha = Math.cos(minBeta) // 注:beta = Math/2 - alpha
-    const skyHeight = 50
+    const skyHeight = 100
     return function(pano0, pano1){
     
         if(Potree.settings.displayMode != 'showPanos' || pano0 == pano1
@@ -1805,7 +1805,7 @@ Images360.prototype.updateCube = (function(){//增加细分的版本,且垂直
                 dirs_ = dirs_.map(deg=> dir.clone().setZ(getZ(deg)).normalize() )
               
                 
-                let max = 50
+                let max = skyHeight
                 let count2 = dirs_.length
                 let disArr = dirs_.map((dir_, i) =>{   
                     let intersect = this.getIntersect(pano, dir_, origin) 

+ 43 - 7
src/custom/objects/tool/Measure.js

@@ -9,7 +9,7 @@ import DepthBasicMaterial from "../../materials/DepthBasicMaterial.js";
 import Sprite from '../Sprite.js'
 import {config} from '../../settings.js'
 
-import {ctrlPolygon} from './ctrlPolygon.js'
+import {ctrlPolygon} from './ctrlPolygon.js' 
 
  
 let texLoader = new THREE.TextureLoader()  
@@ -345,15 +345,51 @@ export class Measure extends ctrlPolygon{
             if(viewer.mainViewport.camera.type == 'OrthographicCamera'){
                 label.setPos(center) 
             }else{
+                //根据视线和线的夹角(后又加入相机和两个端点距离差)来决定标签偏移位置。+
                 let eyePos = viewer.mainViewport.camera.position;
                 let dir = viewer.mainViewport.view.direction //new THREE.Vector3().subVectors(center,eyePos).normalize()
-                //let vec = label.sprite.lineDir
-                let cos = dir.dot(this.lineDir)  
-                
-                let efficiency = 0.35; // 0-1  数值越高,r越容易接近1或-1,label越容易在倾斜后靠近近端点。 
-                let r = 0.5*efficiency*cos + 0.5
                  
-                center = p1.clone().multiplyScalar(1-r).add(p2.clone().multiplyScalar(r)); //label在线上滑动,使尽量保持在视觉中心
+                /*let centerDir = new THREE.Vector3().subVectors(center,eyePos).normalize()
+                if(centerDir.dot(dir)<0){//中点在相机后方,就不设置
+                    label.setPos(center)
+                    return
+                } */
+                let cos = dir.dot(this.lineDir) 
+                let nearPoint = cos > 0 ? p2 : p1 //近端点。 
+                let far = cos > 0 ? p1 : p2 //远端点。 
+                let nearPointDir = new THREE.Vector3().subVectors(nearPoint,eyePos)//.normalize()
+                //使label在中点和近端点中变化, 近端点可能到了相机后方,需要投影到相机所在平面上
+                if(nearPointDir.dot(dir)<0){//近端点到了相机后方,前移。 
+                //let hfov = cameraLight.getHFOVForCamera(viewer.mainViewport.camera , true  ); //暂且只看水平fov 
+                //if(nearPointDir.dot(dir)<Math.cos(hfov/2)){//近端点在镜头外,前移。    --但是这个就得把点转化成在镜头边缘而非左右两边(camDirPlane上)
+                    let ray = new THREE.Raycaster()
+                    ray.set(nearPoint, cos>0?this.lineDir:this.lineDir.clone().negate())
+                    let camDirPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(dir,  eyePos) 
+                    nearPoint = ray.ray.intersectPlane(camDirPlane, new THREE.Vector3()) 
+                } 
+                  
+                  
+                //防止离远了之后也偏移很多,但远了之后相机到端点vec和到中点的vec的夹角接近,不需要怎么偏移的。  
+                let dis1 = nearPoint.distanceToSquared(eyePos)
+                let dis2 = far.distanceToSquared(eyePos)
+                let diff = Math.abs(dis1/dis2)
+                diff<1 && (diff = 1/diff)
+                diff = math.linearClamp(diff,0, 30,    0,1 ) 
+                  
+                  
+                  
+                let efficiency = 0.7; // 0-1  数值越高,r越容易接近1或-1,label越容易在倾斜后靠近近端点。 
+                //let r = 0.5*efficiency*cos + 0.5  
+                let r = 0.5*efficiency*diff*cos + 0.5
+                r = THREE.Math.clamp(r,0.1,0.9)
+                
+                //视线越接近线的方向,标签应该越往近端点偏移,防止看起来几乎在远端。
+                if(cos > 0){
+                    center = p1.clone().multiplyScalar(1-r).add(nearPoint.clone().multiplyScalar(r)); //label在线上滑动,使尽量保持在视觉中心
+                }else{
+                    center = nearPoint.clone().multiplyScalar(1-r).add(p2.clone().multiplyScalar(r)); //label在线上滑动,使尽量保持在视觉中心
+                }
+                
                 label.setPos(center)
             }