|
@@ -9,7 +9,7 @@ import DepthBasicMaterial from "../../materials/DepthBasicMaterial.js";
|
|
import Sprite from '../Sprite.js'
|
|
import Sprite from '../Sprite.js'
|
|
import {config} from '../../settings.js'
|
|
import {config} from '../../settings.js'
|
|
|
|
|
|
-import {ctrlPolygon} from './ctrlPolygon.js'
|
|
|
|
|
|
+import {ctrlPolygon} from './ctrlPolygon.js'
|
|
|
|
|
|
|
|
|
|
let texLoader = new THREE.TextureLoader()
|
|
let texLoader = new THREE.TextureLoader()
|
|
@@ -345,15 +345,51 @@ export class Measure extends ctrlPolygon{
|
|
if(viewer.mainViewport.camera.type == 'OrthographicCamera'){
|
|
if(viewer.mainViewport.camera.type == 'OrthographicCamera'){
|
|
label.setPos(center)
|
|
label.setPos(center)
|
|
}else{
|
|
}else{
|
|
|
|
+ //根据视线和线的夹角(后又加入相机和两个端点距离差)来决定标签偏移位置。+
|
|
let eyePos = viewer.mainViewport.camera.position;
|
|
let eyePos = viewer.mainViewport.camera.position;
|
|
let dir = viewer.mainViewport.view.direction //new THREE.Vector3().subVectors(center,eyePos).normalize()
|
|
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)
|
|
label.setPos(center)
|
|
}
|
|
}
|
|
|
|
|