|
@@ -71226,7 +71226,7 @@ void main()
|
|
|
|
|
|
|
|
|
|
|
|
- let r1 = Potree.Utils.getPos2d(center, camera, viewer.renderArea, e.viewport);
|
|
|
+ let r1 = Potree.Utils.getPos2d(center, e.viewport, viewer.renderArea );
|
|
|
if(!r1.trueSide)return Potree.Utils.updateVisible(this, 'unableCompute', false);// 但这句会使realVisible为false从而无法更新//console.error('!r1.trueSide') //中心点如果在背面直接不渲染了
|
|
|
|
|
|
let r2, point2;
|
|
@@ -71235,7 +71235,7 @@ void main()
|
|
|
while(p2State != 'got' && p2StateHistory.length<10){
|
|
|
point2 = center.clone().add(lineDir.clone().multiplyScalar(len));
|
|
|
|
|
|
- r2 = Potree.Utils.getPos2d(point2, camera, viewer.renderArea, e.viewport);
|
|
|
+ r2 = Potree.Utils.getPos2d(point2, e.viewport, viewer.renderArea);
|
|
|
if(!r2.trueSide){ //很少遇到点2在背面的
|
|
|
if(!p2StateHistory.includes('tooLong-reverse')){
|
|
|
p2State = 'tooLong-reverse'; //先尝试反向
|
|
@@ -73440,13 +73440,12 @@ void main()
|
|
|
|
|
|
return ray;
|
|
|
};
|
|
|
-
|
|
|
- Utils.getPos2d = function(point, camera, dom, viewport){//获取一个三维坐标对应屏幕中的二维坐标
|
|
|
+ Utils.getPos2d = function(point, viewport , dom ){//获取一个三维坐标对应屏幕中的二维坐标
|
|
|
var pos;
|
|
|
- if(math.closeTo(camera.position, point, 1e-5) ){ //和相机位置重合时显示会四处飘,看是要改成一直显示中间还是隐藏?
|
|
|
+ if(math.closeTo(viewport.camera.position, point, 1e-5) ){ //和相机位置重合时显示会四处飘,看是要改成一直显示中间还是隐藏?
|
|
|
pos = new Vector3(0,0,1.5); //1.5是为了不可见
|
|
|
}else {
|
|
|
- pos = point.clone().project(camera); //比之前hotspot的计算方式写得简单 project用于3转2(求法同shader); unproject用于2转3 :new r.Vector3(e.x, e.y, -1).unproject(this.camera);
|
|
|
+ pos = point.clone().project(viewport.camera); //比之前hotspot的计算方式写得简单 project用于3转2(求法同shader); unproject用于2转3 :new r.Vector3(e.x, e.y, -1).unproject(this.camera);
|
|
|
}
|
|
|
|
|
|
|
|
@@ -75757,7 +75756,7 @@ void main()
|
|
|
//showCompass : isTest,
|
|
|
showAxis : isTest,
|
|
|
//testCube : true,
|
|
|
-
|
|
|
+ //adsorption:true,
|
|
|
};
|
|
|
|
|
|
|
|
@@ -81149,7 +81148,7 @@ void main()
|
|
|
|
|
|
update(){
|
|
|
if(!this.position || this.elem.hasClass('unvisible'))return
|
|
|
- var p = Utils.getPos2d(this.position,this.camera,this.dom, viewer.mainViewport);
|
|
|
+ var p = Utils.getPos2d(this.position,viewer.mainViewport,this.dom );
|
|
|
if(!p.trueSide){
|
|
|
this.elem.addClass("hide"); return;
|
|
|
}
|
|
@@ -82069,7 +82068,7 @@ void main()
|
|
|
//addMarkers:
|
|
|
|
|
|
this.initData(prop);
|
|
|
-
|
|
|
+ this.pointsPos2d = new Map; //屏幕上的二维坐标
|
|
|
|
|
|
this.points_datasets || (this.points_datasets = []); //存每个点是哪个数据集
|
|
|
|
|
@@ -82368,10 +82367,16 @@ void main()
|
|
|
marker.pickOrder = marker.renderOrder = 6;
|
|
|
marker.markerSelectStates = {};
|
|
|
marker.addEventListener('startDragging',(e)=>{
|
|
|
- if(e.drag.dragViewport.name == 'MainView')viewer.inputHandler.dispatchEvent( {type: 'isMeasuring',v:true, cause:'startDragging'});
|
|
|
+ viewer.inputHandler.dispatchEvent( {type: 'measuring',v:true, cause:'startDragging', situation:'dragging', object:this});
|
|
|
});
|
|
|
marker.addEventListener('drop',(e)=>{
|
|
|
- viewer.inputHandler.dispatchEvent({type: 'isMeasuring', v:false, cause:'stopDragging'} );
|
|
|
+ viewer.inputHandler.dispatchEvent({type: 'measuring', v:false, cause:'stopDragging', situation:'dragging', object:this} );
|
|
|
+
|
|
|
+ if(Potree.settings.adsorption){
|
|
|
+ this.isNew || viewer.viewports.forEach((viewport)=>{
|
|
|
+ this.getPointsPos2d(viewport, true );//forceUpdate
|
|
|
+ });
|
|
|
+ }
|
|
|
});
|
|
|
marker.measure = this;
|
|
|
let edge;
|
|
@@ -82490,9 +82495,9 @@ void main()
|
|
|
|
|
|
if(this.measureType == 'MulDistance_shape'){
|
|
|
if(state == 'hover' && hoverObject == 'single'){
|
|
|
- marker.material = this.getMarkerMaterial('select'); //路径选中后marker是非选中状态, 但是颜色一样
|
|
|
+ marker.material = this.getMarkerMaterial('select');
|
|
|
}else {
|
|
|
- marker.material = this.getMarkerMaterial('default');
|
|
|
+ marker.material = this.getMarkerMaterial('default'); //路径选中后marker是非选中状态, 但是颜色一样
|
|
|
}
|
|
|
|
|
|
}else {
|
|
@@ -83022,7 +83027,26 @@ void main()
|
|
|
intersects.sort(function (a, b) { return a.distance - b.distance; });
|
|
|
};
|
|
|
|
|
|
-
|
|
|
+ getPointsPos2d(viewport, update){//获取屏幕上的二维坐标
|
|
|
+ let ps = this.pointsPos2d.get(viewport);
|
|
|
+ if(update || !ps){
|
|
|
+ let points = this.points.slice();
|
|
|
+ if(this.measureType == 'MulDistance_shape'){
|
|
|
+ points.push(this.getCenter()); //中心点吸附
|
|
|
+ }
|
|
|
+ points = points.map(e=>{
|
|
|
+ let p = Potree.Utils.getPos2d(e, viewport, viewer.renderArea );
|
|
|
+ p.pos3d = e.clone(), p.object = this;
|
|
|
+ return p
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
+ this.pointsPos2d.set(viewport, points);
|
|
|
+ console.log('updatePointsPos2d',this.uuid,viewport.name);
|
|
|
+ }
|
|
|
+
|
|
|
+ return this.pointsPos2d.get(viewport)
|
|
|
+ }
|
|
|
|
|
|
|
|
|
transformData(prop){
|
|
@@ -83161,8 +83185,8 @@ void main()
|
|
|
this.area = {value:0};
|
|
|
this.areaLabel && this.areaLabel.setVisible(false);
|
|
|
}
|
|
|
- viewer.inputHandler.dispatchEvent( {type:'isMeasuring', v:true, cause:'reDraw'} );
|
|
|
-
|
|
|
+ viewer.inputHandler.dispatchEvent( {type:'measuring', v:true, cause:'reDraw',object:this, situation:'dragging'} );
|
|
|
+
|
|
|
}
|
|
|
|
|
|
|
|
@@ -83636,7 +83660,7 @@ void main()
|
|
|
}
|
|
|
|
|
|
viewer.addEventListener('camera_changed',(e)=>{
|
|
|
- if(e.viewport == viewer.mainViewport ) this.update();
|
|
|
+ this.update(e);
|
|
|
});
|
|
|
|
|
|
|
|
@@ -83651,7 +83675,23 @@ void main()
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
+ let texLoader = new TextureLoader();
|
|
|
+ if( Potree.settings.adsorption ){
|
|
|
+ this.sorptionSign = new Sprite$2({mat:new DepthBasicMaterial({
|
|
|
+ transparent: !0,
|
|
|
+ opacity: 1,
|
|
|
+ map: texLoader.load(Potree.resourcePath+'/textures/pic_point_s32.png' ),
|
|
|
+ replaceColor:new Color(Potree.config.measure.default.color),
|
|
|
+ beReplacedRed: 0.184,
|
|
|
+ mapColorReplace:true,
|
|
|
+ }), sizeInfo: {
|
|
|
+ width2d:30,
|
|
|
+ }, name:"sorptionSign"} );
|
|
|
+ viewer.scene.scene.add(this.sorptionSign);
|
|
|
+ this.sorptionSign.visible = false;
|
|
|
+ //Potree.Utils.setObjectLayers(this.sorptionSign, 'measure' )
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
|
@@ -83689,8 +83729,17 @@ void main()
|
|
|
}
|
|
|
|
|
|
|
|
|
- update(){
|
|
|
+ update(e){
|
|
|
//add
|
|
|
+
|
|
|
+ if(viewer.inputHandler.measuring && Potree.settings.adsorption){
|
|
|
+ viewer.scene.measurements.forEach(measure=>{
|
|
|
+ measure.getPointsPos2d(e.viewport, true);
|
|
|
+ });
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
viewer.scene.measurements.forEach(measure=>{
|
|
|
|
|
|
let lastIndex = measure.points.length - 1;
|
|
@@ -83978,7 +84027,7 @@ void main()
|
|
|
type : "CursorChange", action : "remove", name:"polygon_AtWrongPlace"
|
|
|
});
|
|
|
|
|
|
- viewer.inputHandler.dispatchEvent({type:'isMeasuring', v:false, cause:'stopInsertion'} );
|
|
|
+ viewer.inputHandler.dispatchEvent({type:'measuring', v:false, cause:'stopInsertion', situation:'adding', object:measure} );
|
|
|
viewer.controls.setEnable(true);
|
|
|
|
|
|
//var isIntersectSelf = measure.atPlane && measure.closed && !measure.isRect && measure.point2dInfo && measure.intersectSelf(measure.point2dInfo.points2d.slice(0,measure.point2dInfo.points2d.length-1))//检测除了最后一个点的相交情况
|
|
@@ -84054,7 +84103,7 @@ void main()
|
|
|
|
|
|
if(ifAtWrongPlace(e))return
|
|
|
if(e.clickElement || e.drag.object)return //如点击label时focusOnObject, 或拖拽marker
|
|
|
- measure.focus({dontMoveCamera:true});
|
|
|
+ measure.measureType == 'MulDistance_shape' && measure.focus({dontMoveCamera:true}); //多路径变为选中态
|
|
|
|
|
|
|
|
|
|
|
@@ -84123,7 +84172,7 @@ void main()
|
|
|
|
|
|
//点击第n下拥有n+1个marker, n>0
|
|
|
|
|
|
- viewer.inputHandler.dispatchEvent({type: 'isMeasuring', v: true, cause:'startInsertion'});
|
|
|
+ viewer.inputHandler.dispatchEvent({type: 'measuring', v: true, cause:'startInsertion', situation:'adding', object:measure});
|
|
|
|
|
|
|
|
|
if( isMobile ){
|
|
@@ -89359,7 +89408,6 @@ void main()
|
|
|
*
|
|
|
*/
|
|
|
|
|
|
-
|
|
|
let {Buttons} = Potree.defines;
|
|
|
|
|
|
class InputHandler extends EventDispatcher {
|
|
@@ -89437,12 +89485,28 @@ void main()
|
|
|
|
|
|
|
|
|
{
|
|
|
- this.addEventListener('isMeasuring',(e)=>{
|
|
|
- //console.log('isMeasuring',e.v,e.cause)
|
|
|
- this.isMeasuring = e.v;
|
|
|
+ this.measuring = []; //正在编辑的measure
|
|
|
+ //let mesureInfo = new THREE.EventDispatcher()
|
|
|
+ this.addEventListener('measuring',(e)=>{
|
|
|
+ //true优先级高于false, 正在添加时dropMarker也不会停止
|
|
|
+
|
|
|
+ //Potree.Utils.updateVisible(mesureInfo, e.situation, e.v, 0, e.v?'add':'cancel' )//借用该函数,使true优先级高于false,防止正在添加时dropMarker而停止
|
|
|
+ if(e.v){
|
|
|
+ this.measuring.includes(e.object) || this.measuring.push(e.object);
|
|
|
+ }else {
|
|
|
+ let index = this.measuring.indexOf(e.object);
|
|
|
+ index > -1 && this.measuring.splice(index, 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(this.measuring.length == 0 && this.measuring.length>0 ){
|
|
|
+ this.viewer.viewports.forEach((viewport)=>{
|
|
|
+ this.collectClosePoints(viewport, true );//forceUpdate
|
|
|
+ });
|
|
|
+ }
|
|
|
+ //console.log('measuring',e.v, e.cause, e.situation, this.measuring.length )
|
|
|
});
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
window.viewer.addEventListener('loopStart',()=>{
|
|
|
this.interactHistory = {}; //清空
|
|
|
});
|
|
@@ -89755,7 +89819,7 @@ void main()
|
|
|
//if(isTouch || !Potree.settings.intersectWhenHover ){
|
|
|
if(isTouch || !this.dragViewport.view.isFlying()){
|
|
|
this.hoveredElements = this.getHoveredElements();
|
|
|
- this.intersect = this.getIntersect(viewport); //更新intersect,避免在没有mousemove但flyToPano后intersect未更新。
|
|
|
+ this.intersect = this.getIntersect({viewport, clientX:e.clientX, clientY:e.clientY}); //更新intersect,避免在没有mousemove但flyToPano后intersect未更新。
|
|
|
//this.intersect = this.getWholeIntersect()
|
|
|
} //isTouch必须更新 否则是旧的
|
|
|
if(!viewport)return //why add this?
|
|
@@ -90115,47 +90179,64 @@ void main()
|
|
|
|
|
|
|
|
|
ifBlockedByIntersect({point, margin=0, cameraPos, pickWindowSize, pano, useDepthTex}={}){//某点是否被遮挡(不允许camera修改位置, 因为depthTex不好置换)
|
|
|
-
|
|
|
- let intersect = this.getIntersect(this.hoverViewport, true, pickWindowSize, null, null, useDepthTex, {point, cameraPos, pano});
|
|
|
- let cameraPos_ = (!cameraPos && pano) ? pano.position : (cameraPos||this.hoverViewport.view.position);
|
|
|
+ viewport = viewport || this.hoverViewport || viewer.mainViewport;
|
|
|
+ let intersect = this.getIntersect({viewport, onlyGetIntersect:true, pickWindowSize, useDepthTex, point, cameraPos, pano });
|
|
|
+ let cameraPos_ = (!cameraPos && pano) ? pano.position : (cameraPos||viewport.view.position);
|
|
|
if(intersect && intersect.distance+margin <= point.distanceTo(cameraPos_)){
|
|
|
return intersect //被遮挡
|
|
|
}
|
|
|
//点云模式,对没加载出的点云不准确。 尤其是需要修改相机位置时,因临时修改并不能使点云加载。
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
- getIntersect(viewport, onlyGetIntersect, pickWindowSize, dontIntersect, usePointcloud, useDepthTex, prop={}){// usePointcloud:必须使用点云
|
|
|
- let intersectPoint;
|
|
|
+ collectClosePoints(viewport, forceUpdate){//获取吸附点
|
|
|
+ if(!Potree.settings.adsorption)return
|
|
|
+
|
|
|
+ let point2ds = [];
|
|
|
+
|
|
|
+ //吸附测量线端点
|
|
|
+
|
|
|
+ viewer.scene.measurements.forEach(e=>{
|
|
|
+ if(this.measuring.includes(e)) return//不吸附到正在拖拽的自身
|
|
|
+ point2ds.push(...e.getPointsPos2d(viewport, forceUpdate));
|
|
|
+ });
|
|
|
+ viewer.fixPoints;
|
|
|
+
|
|
|
+ return point2ds
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ getIntersect({viewport, onlyGetIntersect, pickWindowSize, dontIntersect, usePointcloud, useDepthTex, cameraPos, point, pano, clientX, clientY}={}){// usePointcloud:必须使用点云
|
|
|
+ let intersect, intersectPoint, intersectOnModel, allElements;
|
|
|
let camera = viewport.camera;
|
|
|
let raycaster;
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
viewer.addTimeMark('getIntersect','start');
|
|
|
|
|
|
let getByDepthTex = ()=>{
|
|
|
let intersect;
|
|
|
- if(prop.point){
|
|
|
- let cameraPos = prop.pano ? prop.pano.position : camera.position;
|
|
|
- let dir = new Vector3().subVectors(prop.point, cameraPos).normalize();
|
|
|
+ if(point){
|
|
|
+ let cameraPos = pano ? pano.position : camera.position;
|
|
|
+ let dir = new Vector3().subVectors(point, cameraPos).normalize();
|
|
|
intersect = {dir};
|
|
|
}else {
|
|
|
intersect = Utils.getIntersect(camera, [viewer.images360.cube], this.pointer, raycaster);
|
|
|
}
|
|
|
- intersectPoint = viewer.images360.depthSampler.sample(intersect, prop.pano, !!prop.point); //可能不准确, 因pano可能未加载depthTex
|
|
|
+ intersectPoint = viewer.images360.depthSampler.sample(intersect, pano, !!point); //可能不准确, 因pano可能未加载depthTex
|
|
|
if(intersectPoint && Potree.settings.depTexLocBindDataset){
|
|
|
- intersectPoint.pointcloud = (prop.pano || viewer.images360.currentPano).pointcloud;
|
|
|
+ intersectPoint.pointcloud = ( pano || viewer.images360.currentPano).pointcloud;
|
|
|
//在全景模式下,虽然深度图上的点可能对应别的pointcloud,但因为是在当前全景图处得到的,所以即使将原本对应的点云移走,该点也不移动是有道理的。它可以永远跟着该全景图。
|
|
|
}
|
|
|
};
|
|
|
|
|
|
- let getByCloud = ()=>{
|
|
|
- if(prop.point){//指定了目标点,而非只是用pointer所在位置
|
|
|
- prop.cameraPos && camera.position.copy(prop.cameraPos);
|
|
|
- camera.lookAt(prop.point);
|
|
|
+ let getByCloud = ()=>{
|
|
|
+ let pointer, mouse;
|
|
|
+ if(point){//指定了目标点,而非只是用pointer所在位置
|
|
|
+ cameraPos && camera.position.copy( cameraPos);
|
|
|
+ camera.lookAt(point);
|
|
|
camera.updateMatrixWorld();
|
|
|
- prop.pointer = this.pointer.clone();
|
|
|
- prop.mouse = this.mouse.clone();
|
|
|
+ pointer = this.pointer.clone();
|
|
|
+ mouse = this.mouse.clone();
|
|
|
this.pointer.set(0,0); //画布中心
|
|
|
this.mouse.set(Math.round(viewport.resolution.x/2), Math.round(viewport.resolution.y/2));
|
|
|
}
|
|
@@ -90167,80 +90248,100 @@ void main()
|
|
|
camera,
|
|
|
this.viewer,
|
|
|
this.viewer.scene.pointclouds,
|
|
|
- {pickClipped: true, isMeasuring: this.isMeasuring, pickWindowSize, cameraChanged: !!prop.point }
|
|
|
+ {pickClipped: true, measuring: this.measuring.length>0, pickWindowSize, cameraChanged: !!point }
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
//恢复
|
|
|
- if(prop.point){
|
|
|
+ if(point){
|
|
|
viewport.view.applyToCamera(camera);
|
|
|
- this.pointer.copy(prop.pointer);
|
|
|
- this.mouse.copy(prop.mouse);
|
|
|
+ this.pointer.copy(pointer);
|
|
|
+ this.mouse.copy(mouse);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+ if(this.measuring.length && Potree.settings.adsorption ){//吸附
|
|
|
+ let points = this.collectClosePoints(viewport);
|
|
|
+
|
|
|
+ let points2 = points.filter(e=>e.trueSide && e.inSight
|
|
|
+ && math.closeTo(this.mouse, e.posInViewport, Potree.config.measure.adsorptMinDis)
|
|
|
+ );
|
|
|
+
|
|
|
+ let disArr = points2.map(e=> e.pos.distanceToSquared(this.mouse) );
|
|
|
+
|
|
|
+ let min = points2.slice().sort((a,b)=>disArr[points.indexOf(a)] - disArr[points.indexOf(b)]);
|
|
|
+ if(min[0]){
|
|
|
+ intersect = {
|
|
|
+ //hoveredElement
|
|
|
+ location: min[0].pos3d,
|
|
|
+ //point: {normal: allElements[0].face.normal },
|
|
|
+ //normal
|
|
|
+ //distance
|
|
|
+ object: min[0].object,
|
|
|
+ adsorption:true
|
|
|
+ };
|
|
|
+ console.log('找到吸附点', min[0].pos3d, min[0].object.uuid);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
-
|
|
|
- let canUseDepthTex = !Potree.settings.unableUseDepTexPick && (Potree.settings.displayMode == 'showPanos' || useDepthTex)
|
|
|
- && viewer.images360.currentPano.pointcloud.hasDepthTex && viewport == viewer.mainViewport && !usePointcloud;
|
|
|
-
|
|
|
-
|
|
|
- /* if(canUseDepthTex)getByDepthTex()
|
|
|
- else getByCloud() */
|
|
|
- if(canUseDepthTex && !this.isMeasuring){
|
|
|
- getByDepthTex();
|
|
|
- }else {
|
|
|
- getByCloud();
|
|
|
- /* if(!intersectPoint && canUseDepthTex ){ //若在测量,先尝试点云,再用全景 //后来发现有深度图的点云全景visibleNode为空,pick不到的//如果允许的话,裁剪掉的点云也会得到intersect
|
|
|
- getByDepthTex()
|
|
|
- } */
|
|
|
- }
|
|
|
-
|
|
|
+ if(!intersect){
|
|
|
+ let canUseDepthTex = !Potree.settings.unableUseDepTexPick && (Potree.settings.displayMode == 'showPanos' || useDepthTex)
|
|
|
+ && viewer.images360.currentPano.pointcloud.hasDepthTex && viewport == viewer.mainViewport && !usePointcloud;
|
|
|
+
|
|
|
+
|
|
|
+ /* if(canUseDepthTex)getByDepthTex()
|
|
|
+ else getByCloud() */
|
|
|
+ if(canUseDepthTex && !this.isMeasuring){
|
|
|
+ getByDepthTex();
|
|
|
+ }else {
|
|
|
+ getByCloud();
|
|
|
+ /* if(!intersectPoint && canUseDepthTex ){ //若在测量,先尝试点云,再用全景 //后来发现有深度图的点云全景visibleNode为空,pick不到的//如果允许的话,裁剪掉的点云也会得到intersect
|
|
|
+ getByDepthTex()
|
|
|
+ } */
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//console.log(viewport.name , intersectPoint && intersectPoint.location )
|
|
|
- let intersect;
|
|
|
- let intersectOnModel, allElements;
|
|
|
-
|
|
|
|
|
|
- if(Potree.settings.intersectOnObjs && !dontIntersect){
|
|
|
- if(prop.point){
|
|
|
- raycaster = new Raycaster();
|
|
|
- var dir = new Vector3().subVectors(prop.point, camera.position).normalize();
|
|
|
- raycaster.set(camera.position, dir); //var origin = new THREE.Vector3(pointer.x, pointer.y, -1).unproject(camera),
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- allElements = this.getHoveredElements(viewer.objs.children, true, raycaster);
|
|
|
-
|
|
|
-
|
|
|
- if(allElements[0]){
|
|
|
- intersectOnModel = {//模拟点云的intersectPoint的结构写法
|
|
|
- hoveredElement : allElements[0] ,
|
|
|
- location: allElements[0].point,
|
|
|
- //point: {normal: allElements[0].face.normal },
|
|
|
- normal: allElements[0].face && allElements[0].face.normal,
|
|
|
- distance: allElements[0].distance,
|
|
|
- object: allElements[0].object
|
|
|
- };
|
|
|
+ if(Potree.settings.intersectOnObjs && !dontIntersect){
|
|
|
+ if(point){
|
|
|
+ raycaster = new Raycaster();
|
|
|
+ var dir = new Vector3().subVectors(point, camera.position).normalize();
|
|
|
+ raycaster.set(camera.position, dir); //var origin = new THREE.Vector3(pointer.x, pointer.y, -1).unproject(camera),
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ allElements = this.getHoveredElements(viewer.objs.children, true, raycaster);
|
|
|
+
|
|
|
+
|
|
|
+ if(allElements[0]){
|
|
|
+ intersectOnModel = {//模拟点云的intersectPoint的结构写法
|
|
|
+ hoveredElement : allElements[0] ,
|
|
|
+ location: allElements[0].point,
|
|
|
+ //point: {normal: allElements[0].face.normal },
|
|
|
+ normal: allElements[0].face && allElements[0].face.normal,
|
|
|
+ distance: allElements[0].distance,
|
|
|
+ object: allElements[0].object
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(intersectPoint && intersectOnModel){
|
|
|
- if(intersectPoint.distance < intersectOnModel.distance){
|
|
|
- intersect = intersectPoint;
|
|
|
+ if(intersectPoint && intersectOnModel){
|
|
|
+ if(intersectPoint.distance < intersectOnModel.distance){
|
|
|
+ intersect = intersectPoint;
|
|
|
+ }else {
|
|
|
+ intersect = intersectOnModel;
|
|
|
+ }
|
|
|
}else {
|
|
|
- intersect = intersectOnModel;
|
|
|
- }
|
|
|
- }else {
|
|
|
- intersect = intersectOnModel || intersectPoint;
|
|
|
- }
|
|
|
-
|
|
|
+ intersect = intersectOnModel || intersectPoint;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
if(viewport.camera.type == 'OrthographicCamera'/* == 'mapViewport' */){
|
|
|
let pos3d = new Vector3(this.pointer.x,this.pointer.y,-1).unproject(viewport.camera); //z:-1朝外
|
|
@@ -90328,30 +90429,20 @@ void main()
|
|
|
let dontIntersect = this.drag && viewport.alignment || isFlying; /* viewer.images360.flying */ // flying 时可能卡顿
|
|
|
//console.log('dontIntersectPointcloud',dontIntersectPointcloud)
|
|
|
|
|
|
- intersect = this.getIntersect(viewport, e.onlyGetIntersect, e.pickWindowSize, !!dontIntersect, e.whichPointcloud || e.usePointcloud || this.drag); //深度图不准,尽量用点云
|
|
|
+ intersect = this.getIntersect(Object.assign({}, e, {viewport, dontIntersect, clientX:e.clientX, clientY:e.clientY })); //数据集多的时候卡顿
|
|
|
|
|
|
|
|
|
//console.log('intersectPoint', intersectPoint)
|
|
|
}
|
|
|
|
|
|
if(e.onlyGetIntersect){
|
|
|
- /* if(Potree.settings.intersectOnObjs){
|
|
|
- let hoveredElements = this.getHoveredElements() //应该不用发送mouseover事件吧
|
|
|
- let intersect = this.getWholeIntersect(hoveredElements, intersectPoint)
|
|
|
- return intersect
|
|
|
- }
|
|
|
-
|
|
|
- return intersectPoint */
|
|
|
+
|
|
|
return intersect
|
|
|
}
|
|
|
e.preventDefault();
|
|
|
|
|
|
|
|
|
- /* if(intersectPoint && intersectPoint.pointcloud){
|
|
|
- console.log(intersectPoint.pointcloud.name)
|
|
|
- } */
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
if (this.drag) {//有拖拽(不一定拖拽了物体, 也不一定按下了鼠标)
|
|
|
this.drag.mouse = isTouch ? 1 : e.buttons;
|
|
|
//add:
|
|
@@ -90683,7 +90774,7 @@ void main()
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
- }
|
|
|
+ }else interactables = interactables.filter(e=>e.visible);
|
|
|
|
|
|
let camera = this.hoverViewport.camera;
|
|
|
if(!raycaster){
|
|
@@ -90708,7 +90799,7 @@ void main()
|
|
|
//this.hoverViewport.beforeRender && this.hoverViewport.beforeRender()
|
|
|
|
|
|
viewer.dispatchEvent( {type:'raycaster', viewport: this.hoverViewport});//add
|
|
|
- let intersections = raycaster.intersectObjects(interactables.filter(o => o.visible), true, null, true); //原本是false 检测不到children
|
|
|
+ let intersections = raycaster.intersectObjects(interactables , true, null, true); //原本是false 检测不到children
|
|
|
|
|
|
let intersectionsCopy = intersections.slice();
|
|
|
|
|
@@ -98356,12 +98447,14 @@ ENDSEC
|
|
|
return this.depthSampler.sample( {dir }, pano, true )
|
|
|
}else {
|
|
|
origin = origin || pano.position;
|
|
|
- return viewer.inputHandler.getIntersect(viewer.inputHandler.hoverViewport, true, null, null, true, {
|
|
|
+ return viewer.inputHandler.getIntersect({
|
|
|
+ viewport:viewer.inputHandler.hoverViewport,
|
|
|
+ onlyGetIntersect:true, usePointcloud:true,
|
|
|
point: origin.clone().add(dir),
|
|
|
cameraPos: origin
|
|
|
})
|
|
|
}
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
|
@@ -104174,7 +104267,7 @@ ENDSEC
|
|
|
|
|
|
//自身位置
|
|
|
//let pos2d = viewer.inputHandler.pointer.clone(); //跟随鼠标
|
|
|
- let pos2d = Potree.Utils.getPos2d(aimPos, playerCamera, viewer.renderArea, viewer.mainViewport).vector; //更新目标点的实时二维位置
|
|
|
+ let pos2d = Potree.Utils.getPos2d(aimPos, viewer.mainViewport, viewer.renderArea ).vector; //更新目标点的实时二维位置
|
|
|
let margin = 0.4, maxY = 0.4;
|
|
|
let screenPos = pos2d.clone().setY(pos2d.y + (pos2d.y>maxY ? -margin : margin ));
|
|
|
|
|
@@ -134732,6 +134825,7 @@ ENDSEC
|
|
|
|
|
|
|
|
|
|
|
|
+
|
|
|
//-----------
|
|
|
CursorDeal.init(this, this.mapViewer ? [this, this.mapViewer] : [this]);//ADD
|
|
|
|