|
@@ -23,7 +23,8 @@ export default class Sprite extends THREE.Mesh{
|
|
|
|
|
|
|
|
|
let update = (e)=>{
|
|
|
- this.update(e)
|
|
|
+ //this.update(e)
|
|
|
+ this.needsUpdate = true
|
|
|
}
|
|
|
viewer.mapViewer && viewer.mapViewer.addEventListener("camera_changed", update)
|
|
|
viewer.addEventListener("camera_changed", update)
|
|
@@ -33,7 +34,8 @@ export default class Sprite extends THREE.Mesh{
|
|
|
|
|
|
|
|
|
let applyMatrix = (e)=>{
|
|
|
- this.applyMatrix(e)
|
|
|
+ if(this.needsUpdate) this.update(e)
|
|
|
+ else this.applyMatrix(e)
|
|
|
}
|
|
|
viewer.addEventListener("raycaster", applyMatrix) //before render
|
|
|
viewer.addEventListener("render.begin", applyMatrix) //before render //magnifier时要禁止吗
|
|
@@ -76,7 +78,7 @@ export default class Sprite extends THREE.Mesh{
|
|
|
v = false
|
|
|
}
|
|
|
|
|
|
- if(!this.latestRealVisi && v){//变为可见后先update
|
|
|
+ /* if(!this.latestRealVisi && v){//变为可见后先update
|
|
|
this.latestRealVisi = true
|
|
|
setTimeout(()=>{
|
|
|
this.update()
|
|
@@ -84,7 +86,7 @@ export default class Sprite extends THREE.Mesh{
|
|
|
return false
|
|
|
}
|
|
|
|
|
|
- this.latestRealVisi = v
|
|
|
+ this.latestRealVisi = v */
|
|
|
return v;
|
|
|
}
|
|
|
|
|
@@ -156,6 +158,7 @@ export default class Sprite extends THREE.Mesh{
|
|
|
if(!matrix){
|
|
|
this.update(e)
|
|
|
matrix = this.matrixMap.get(e.viewport);
|
|
|
+ if(!matrix)return
|
|
|
}
|
|
|
|
|
|
if(e.viewport == this.useViewport){
|
|
@@ -176,4 +179,80 @@ export default class Sprite extends THREE.Mesh{
|
|
|
this.removeAllListeners()
|
|
|
this.parent && this.parent.remove(this)
|
|
|
}
|
|
|
-}
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+
|
|
|
+ let orient2d
|
|
|
+
|
|
|
+ if(this.lineDir){
|
|
|
+ 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 Potree.Utils.updateVisible(this, 'unableCompute', false);// 但这句会使realVisible为false从而无法更新//console.error('!r1.trueSide') //中心点如果在背面直接不渲染了
|
|
|
+
|
|
|
+ let r2, point2
|
|
|
+
|
|
|
+ let p2State = '', len=1, 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){ //很少遇到点2在背面的
|
|
|
+ if(!p2StateHistory.includes('tooLong-reverse')){
|
|
|
+ p2State = 'tooLong-reverse' //先尝试反向
|
|
|
+ len = -len
|
|
|
+ }else{
|
|
|
+ p2State = 'tooLong'
|
|
|
+ len = len / 2
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ let dis = r2.pos.distanceTo(r1.pos)
|
|
|
+ if(dis == 0){
|
|
|
+ //console.log('dis == 0')
|
|
|
+ Potree.Utils.updateVisible(this, 'unableCompute', false)
|
|
|
+ return
|
|
|
+ break
|
|
|
+ }
|
|
|
+ if(dis<10 && !p2StateHistory.includes('tooLong')){//和r1的屏幕距离太近,要加长,否则精度过低
|
|
|
+ p2State = 'tooShort'
|
|
|
+ len = 100/dis * len
|
|
|
+ }else{
|
|
|
+ p2State = 'got'; break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ p2StateHistory.push(p2State)
|
|
|
+ }
|
|
|
+ //console.log(p2StateHistory,len)
|
|
|
+
|
|
|
+ if(!r2.trueSide){
|
|
|
+ return Potree.Utils.updateVisible(this, 'unableCompute', false)//, console.log(' !r2.trueSide', )
|
|
|
+ }
|
|
|
+
|
|
|
+ Potree.Utils.updateVisible(this, 'unableCompute', true)
|
|
|
+ let p1 = r1.pos, p2 = r2.pos
|
|
|
+ let vec = new THREE.Vector2().subVectors(p1,p2);
|
|
|
+ let angle = -vec.angle() //根据测量线在屏幕上的角度在旋转label,使之和屏幕上的二维线平行。
|
|
|
+ if(p1.x < p2.x) angle += Math.PI //避免字是倒着的情况
|
|
|
+
|
|
|
+ orient2d = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0,0,1), angle)
|
|
|
+ //console.log(this.parent.text, THREE.Math.radToDeg(angle), p1.x < p2.x )
|
|
|
+ }
|
|
|
+
|
|
|
+ let parentQua = this.root.parent.getWorldQuaternion(new THREE.Quaternion)
|
|
|
+ this.root.quaternion.multiplyQuaternions(parentQua.invert(),camera.quaternion) //乘上parentQua.invert()是为了中和掉父结点的qua,使只剩下camera.quaternion
|
|
|
+
|
|
|
+ if(this.lineDir){
|
|
|
+ this.root.quaternion.multiply(orient2d)
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ */
|