|
@@ -72495,7 +72495,7 @@ void main()
|
|
|
//transformPointcloud(pointcloud,dataset)
|
|
|
scene.addPointCloud(pointcloud);
|
|
|
|
|
|
-
|
|
|
+
|
|
|
|
|
|
|
|
|
|
|
@@ -75461,21 +75461,56 @@ void main()
|
|
|
let orient2d;
|
|
|
|
|
|
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 Vector3());
|
|
|
+ //由于两个端点容易在屏幕外,所以使用center和center加dir
|
|
|
+ let lineDir = this.lineDir.clone();
|
|
|
|
|
|
- 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){
|
|
|
- return console.log('!r1.trueSide || !r2.trueSide', )
|
|
|
+ let r1 = Potree.Utils.getPos2d(center, camera, viewer.renderArea, e.viewport);
|
|
|
+ if(!r1.trueSide)return Potree.Utils.updateVisible(this, 'notTrueSide', 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<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, 'notTrueSide', false), console.log(' !r2.trueSide', )
|
|
|
}
|
|
|
+ Potree.Utils.updateVisible(this, 'notTrueSide', true);
|
|
|
+
|
|
|
let p1 = r1.pos, p2 = r2.pos;
|
|
|
let vec = new Vector2().subVectors(p1,p2);
|
|
|
- let angle = vec.angle();
|
|
|
- let axis = p1.x < p2.x ? 1 : -1;
|
|
|
- orient2d = new Quaternion().setFromAxisAngle(new Vector3(0,0,1), axis*angle);
|
|
|
- console.log(this.parent.text, MathUtils$1.radToDeg(angle), axis );
|
|
|
+ let angle = -vec.angle(); //根据测量线在屏幕上的角度在旋转label,使之和屏幕上的二维线平行。
|
|
|
+ if(p1.x < p2.x) angle += Math.PI; //避免字是倒着的情况
|
|
|
+
|
|
|
+ orient2d = new Quaternion().setFromAxisAngle(new 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 Quaternion);
|
|
@@ -75545,6 +75580,10 @@ void main()
|
|
|
//console.log(this.root.name + e.viewport.name + " : "+this.root.matrixWorld.elements)
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
setUniforms(name,value){
|
|
|
this.material.setUniforms(name,value);
|
|
|
}
|
|
@@ -81075,7 +81114,7 @@ void main()
|
|
|
if(edgeLabel.visible){
|
|
|
setEdgeLabel(edgeLabel,point,nextPoint,distance);
|
|
|
}
|
|
|
- edgeLabel.sprite.lineDir = [point,nextPoint];//new THREE.Vector3().subVectors(point,nextPoint)
|
|
|
+ edgeLabel.sprite.lineDir = new Vector3().subVectors(point,nextPoint).normalize(); //[point,nextPoint]
|
|
|
}
|
|
|
}
|
|
|
|