|
@@ -90458,217 +90458,6 @@ void main()
|
|
|
|
|
|
}
|
|
|
|
|
|
- class SplitScreen extends EventDispatcher{
|
|
|
- constructor (args = {}) {
|
|
|
- super();
|
|
|
-
|
|
|
- }
|
|
|
- /*
|
|
|
- viewport.targetPlane // bound中心点处的plane,方向和view一致
|
|
|
- viewport.shiftTarget // camera的位置project在targetPlane上的位置
|
|
|
- 这两个参数的主要目的是为了getPosOutOfModel,以及rotateSideCamera时保持相对位置
|
|
|
- */
|
|
|
- splitStart(cameraProps){
|
|
|
- let viewports = [];
|
|
|
-
|
|
|
- let subViewports = [viewer.mainViewport];
|
|
|
- if(viewer.mapViewer){
|
|
|
- subViewports.push(viewer.mapViewer.viewports[0]);
|
|
|
- }
|
|
|
-
|
|
|
- let length = cameraProps.length;
|
|
|
- for(let i=0;i<length;i++){
|
|
|
- let prop = cameraProps[i];
|
|
|
- let viewport;
|
|
|
- let v = subViewports.find(e=>e.name == (prop.name2||prop.name));
|
|
|
- if(v){
|
|
|
- viewport = v;
|
|
|
- viewport.left = prop.left; viewport.bottom = prop.bottom; viewport.width = prop.width; viewport.height = prop.height;
|
|
|
- }
|
|
|
-
|
|
|
- if(!viewport){
|
|
|
- let view = new ExtendView();
|
|
|
- if(prop.limitBound)view.limitBound = prop.limitBound;
|
|
|
- prop.direction && (view.direction = prop.direction);
|
|
|
-
|
|
|
- viewport = new Viewport(view , this.getOrthoCamera(), prop );
|
|
|
- if(prop.viewContainsPoints)viewport.viewContainsPoints = prop.viewContainsPoints;
|
|
|
-
|
|
|
- //viewport.unableDepth = true //depthBasicMaterial等在此viewport中不开启depth
|
|
|
-
|
|
|
- }
|
|
|
- if(viewport.camera.type == 'OrthographicCamera' ){
|
|
|
- viewport.targetPlane = new Plane();
|
|
|
- viewport.shiftTarget = new Vector3; //project在targetPlane上的位置
|
|
|
- }
|
|
|
- viewport.fitMargin = prop.margin;
|
|
|
- viewports.push(viewport);
|
|
|
- }
|
|
|
- viewer.viewports = viewports;
|
|
|
- viewer.updateScreenSize({forceUpdateSize:true});
|
|
|
- viewports.forEach(viewport=>{
|
|
|
- if(viewport.name == 'MainView')return
|
|
|
- this.viewportFitBound(viewport, viewer.bound.boundingBox , viewer.bound.center , 0, viewport.fitMargin);
|
|
|
- });
|
|
|
- return viewports
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- unSplit(){
|
|
|
- this.unfocusViewport();
|
|
|
- viewer.viewports = [viewer.mainViewport];
|
|
|
- viewer.mainViewport.width = 1;
|
|
|
- viewer.mainViewport.height = 1;
|
|
|
- viewer.mainViewport.left = 0;
|
|
|
- viewer.mainViewport.bottom = 0;
|
|
|
- viewer.updateScreenSize({forceUpdateSize:true});
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- viewportFitBound(viewport, bound, center, duration=0, margin){
|
|
|
- let view = viewport.view;
|
|
|
- let info = {bound};
|
|
|
-
|
|
|
-
|
|
|
- let {boundSize, boundCenter} = this.getViewBound(viewport, bound );
|
|
|
-
|
|
|
- //this.setShiftTarget(viewport, boundCenter)
|
|
|
-
|
|
|
- viewport.targetPlane.setFromNormalAndCoplanarPoint( view.direction.clone(), boundCenter );
|
|
|
- viewport.targetPlane.projectPoint(center, viewport.shiftTarget); //target转换到过模型中心的平面,以保证镜头一定在模型外 this.shiftTarget是得到的
|
|
|
-
|
|
|
- info.endPosition = this.getPosOutOfModel(viewport, boundSize);
|
|
|
-
|
|
|
- //if(viewport.name == 'mapViewport')info.endPosition.z = Math.max(Potree.config.map.cameraHeight, info.endPosition.z)
|
|
|
-
|
|
|
- info.margin = margin || {x:30, y:30};
|
|
|
- view.moveOrthoCamera(viewport, info , duration );
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- getViewBound(viewport, boundingBox){
|
|
|
- if(boundingBox){
|
|
|
- boundSize = boundingBox.getSize(new Vector3);
|
|
|
- center = boundingBox.getCenter(new Vector3);
|
|
|
- }else {
|
|
|
- var {boundSize, center, boundingBox} = viewer.bound;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- if(viewport.viewContainsPoints){//视野范围内必须要包含的点,直接算入模型区域。这时候得到的boundCenter和模型中心不重合
|
|
|
- boundingBox = boundingBox.clone();
|
|
|
- viewport.viewContainsPoints.forEach(point=>{
|
|
|
- boundingBox.expandByPoint(point);
|
|
|
- });
|
|
|
- boundSize = boundingBox.getSize(new Vector3);
|
|
|
- center = boundingBox.getCenter(new Vector3);
|
|
|
- }
|
|
|
-
|
|
|
- return {boundSize, boundCenter:center }
|
|
|
- }
|
|
|
-
|
|
|
- getPosOutOfModel(viewport, boundSize){
|
|
|
- //let {boundSize, center} = viewer.bound
|
|
|
- boundSize = boundSize || this.getViewBound(viewport).boundSize;
|
|
|
- let expand = 10;
|
|
|
- let radius = boundSize.length(); // / 2
|
|
|
- let position = viewport.shiftTarget.clone().sub(viewport.view.direction.clone().multiplyScalar(radius + expand));
|
|
|
-
|
|
|
- return position
|
|
|
- }
|
|
|
-
|
|
|
- updateCameraOutOfModel(){//因为移动模型导致模型超出相机外,所以更新位置
|
|
|
- viewer.viewports.forEach((viewport, i )=>{
|
|
|
- if(viewport != viewer.mainViewport){
|
|
|
- let {boundSize, boundCenter} = this.getViewBound(viewport);
|
|
|
- /* viewport.targetPlane.setFromNormalAndCoplanarPoint( viewport.view.direction.clone(), boundCenter)
|
|
|
- viewport.targetPlane.projectPoint(viewport.view.position, viewport.shiftTarget) //target转换到过模型中心的平面,以保证镜头一定在模型外 this.shiftTarget是得到的
|
|
|
- */
|
|
|
- this.setShiftTarget(viewport, boundCenter);
|
|
|
- let endPosition = this.getPosOutOfModel(viewport, boundSize);
|
|
|
- //if(viewport.name == 'mapViewport')endPosition.z = Math.max(Potree.config.map.cameraHeight, endPosition.z)
|
|
|
- viewport.view.position.copy(endPosition);
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- setShiftTarget(viewport, center){
|
|
|
- if(!viewport.targetPlane ){
|
|
|
- viewport.targetPlane = new Plane();
|
|
|
- viewport.shiftTarget = new Vector3; //project在targetPlane上的位置
|
|
|
- }
|
|
|
-
|
|
|
- viewport.targetPlane.setFromNormalAndCoplanarPoint(viewport.view.direction, center );
|
|
|
- viewport.targetPlane.projectPoint(viewport.view.position, viewport.shiftTarget ); //target转换到过模型中心的平面,以保证镜头一定在模型外
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- rotateSideCamera(viewport, angle){//侧视图绕模型中心水平旋转
|
|
|
-
|
|
|
- //let {boundSize, center} = viewer.bound
|
|
|
- let {boundSize, boundCenter } = this.getViewBound(viewport);
|
|
|
- let center = this.focusCenter || boundCenter; //旋转中心,一般是所有模型的中心,除非想指定中心点
|
|
|
- this.setShiftTarget(viewport, center);
|
|
|
- //找到平移向量
|
|
|
- let vec = new Vector3().subVectors(center, viewport.shiftTarget);//相对于中心的偏移值,旋转后偏移值也旋转
|
|
|
-
|
|
|
- //旋转
|
|
|
- var rotMatrix = new Matrix4().makeRotationAxis(new Vector3(0,0,1), angle);
|
|
|
-
|
|
|
- viewport.view.direction = viewport.view.direction.applyMatrix4(rotMatrix);
|
|
|
-
|
|
|
-
|
|
|
- vec.applyMatrix4(rotMatrix);
|
|
|
- viewport.shiftTarget.subVectors(center,vec); //新的
|
|
|
-
|
|
|
-
|
|
|
- viewport.view.position = this.getPosOutOfModel(viewport, boundSize);
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- getOrthoCamera(){
|
|
|
- let camera = new OrthographicCamera(-100, 100, 100, 100, 0.01, 10000);
|
|
|
- camera.up.set(0,0,1);
|
|
|
- return camera
|
|
|
- }
|
|
|
-
|
|
|
- focusOnViewport(name){//全屏
|
|
|
- viewer.viewports.forEach((viewport, i )=>{
|
|
|
- if(viewport.name == name){
|
|
|
- this.focusInfo = {
|
|
|
- name,
|
|
|
- left : viewport.left, bottom : viewport.bottom, height : viewport.height, width : viewport.width
|
|
|
- };
|
|
|
- viewport.left = 0; viewport.bottom = 0; viewport.height = 1; viewport.width = 1;
|
|
|
-
|
|
|
- }else {
|
|
|
- viewport.active = false;
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- viewer.updateScreenSize({forceUpdateSize:true});
|
|
|
- }
|
|
|
-
|
|
|
- unfocusViewport(){
|
|
|
- if(!this.focusInfo)return
|
|
|
- viewer.viewports.forEach((viewport, i )=>{
|
|
|
- if(this.focusInfo.name == viewport.name){//全屏的恢复
|
|
|
- viewport.left = this.focusInfo.left;
|
|
|
- viewport.bottom = this.focusInfo.bottom;
|
|
|
- viewport.height = this.focusInfo.height;
|
|
|
- viewport.width = this.focusInfo.width;
|
|
|
- }
|
|
|
- viewport.active = true;
|
|
|
- });
|
|
|
- viewer.updateScreenSize({forceUpdateSize:true});
|
|
|
- this.focusInfo = null;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* @author mschuetz / http://mschuetz.at
|
|
|
*
|
|
@@ -91819,8 +91608,7 @@ void main()
|
|
|
}) ];
|
|
|
|
|
|
this.cube = new NavigationCube(this.scene, w/2 );
|
|
|
- this.splitScreen = new SplitScreen();
|
|
|
-
|
|
|
+
|
|
|
|
|
|
viewer.addEventListener('camera_changed', e => {
|
|
|
if (e.viewport == listenViewport && (/* e.changeInfo.positionChanged || */e.changeInfo.quaternionChanged)) {
|
|
@@ -91855,7 +91643,7 @@ void main()
|
|
|
viewContainsPoints:[new Vector3(0,0,0)],
|
|
|
margin:{x:300, y:250} ,
|
|
|
} ];
|
|
|
- this.splitScreen.splitStart(viewportProps);
|
|
|
+ viewer.splitScreen.splitStart(viewportProps);
|
|
|
|
|
|
|
|
|
viewer.images360.addEventListener('beginChangeMode',(e)=>{
|
|
@@ -91947,7 +91735,7 @@ void main()
|
|
|
this.controls.setEnable(false);
|
|
|
|
|
|
//假设保持到目前中心的视角范围不变
|
|
|
- this.splitScreen.setShiftTarget(viewer.mainViewport, viewer.bound.center);
|
|
|
+ viewer.splitScreen.setShiftTarget(viewer.mainViewport, viewer.bound.center);
|
|
|
let dis = new Vector3().subVectors(viewer.mainViewport.shiftTarget, viewer.scene.cameraO.position).length() ; //-nearestPano[0].score
|
|
|
|
|
|
//根据2d->3d的式子逆求zoom
|
|
@@ -91984,9 +91772,7 @@ void main()
|
|
|
|
|
|
//假设保持到目前中心的视角范围不变
|
|
|
|
|
|
- this.splitScreen.setShiftTarget(viewer.mainViewport, viewer.bound.center);
|
|
|
- viewer.mainViewport.targetPlane.setFromNormalAndCoplanarPoint( view.direction.clone(), viewer.bound.center );
|
|
|
- viewer.mainViewport.targetPlane.projectPoint(view.position, viewer.mainViewport.shiftTarget );
|
|
|
+ viewer.splitScreen.setShiftTarget(viewer.mainViewport, viewer.bound.center);
|
|
|
|
|
|
let halfHeight = viewer.scene.cameraO.top/viewer.scene.cameraO.zoom;
|
|
|
let dis = halfHeight / Math.tan( MathUtils$1.degToRad(viewer.scene.cameraP.fov/2));
|
|
@@ -92090,7 +91876,7 @@ void main()
|
|
|
|
|
|
|
|
|
rotateSideCamera(angle){
|
|
|
- this.splitScreen.rotateSideCamera(viewer.mainViewport,angle);
|
|
|
+ viewer.splitScreen.rotateSideCamera(viewer.mainViewport,angle);
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -102615,6 +102401,217 @@ ENDSEC
|
|
|
|
|
|
};
|
|
|
|
|
|
+ class SplitScreen extends EventDispatcher{
|
|
|
+ constructor (args = {}) {
|
|
|
+ super();
|
|
|
+
|
|
|
+ }
|
|
|
+ /*
|
|
|
+ viewport.targetPlane // bound中心点处的plane,方向和view一致
|
|
|
+ viewport.shiftTarget // camera的位置project在targetPlane上的位置
|
|
|
+ 这两个参数的主要目的是为了getPosOutOfModel,以及rotateSideCamera时保持相对位置
|
|
|
+ */
|
|
|
+ splitStart(cameraProps){
|
|
|
+ let viewports = [];
|
|
|
+
|
|
|
+ let subViewports = [viewer.mainViewport];
|
|
|
+ if(viewer.mapViewer){
|
|
|
+ subViewports.push(viewer.mapViewer.viewports[0]);
|
|
|
+ }
|
|
|
+
|
|
|
+ let length = cameraProps.length;
|
|
|
+ for(let i=0;i<length;i++){
|
|
|
+ let prop = cameraProps[i];
|
|
|
+ let viewport;
|
|
|
+ let v = subViewports.find(e=>e.name == (prop.name2||prop.name));
|
|
|
+ if(v){
|
|
|
+ viewport = v;
|
|
|
+ viewport.left = prop.left; viewport.bottom = prop.bottom; viewport.width = prop.width; viewport.height = prop.height;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(!viewport){
|
|
|
+ let view = new ExtendView();
|
|
|
+ if(prop.limitBound)view.limitBound = prop.limitBound;
|
|
|
+ prop.direction && (view.direction = prop.direction);
|
|
|
+
|
|
|
+ viewport = new Viewport(view , this.getOrthoCamera(), prop );
|
|
|
+ if(prop.viewContainsPoints)viewport.viewContainsPoints = prop.viewContainsPoints;
|
|
|
+
|
|
|
+ //viewport.unableDepth = true //depthBasicMaterial等在此viewport中不开启depth
|
|
|
+
|
|
|
+ }
|
|
|
+ if(viewport.camera.type == 'OrthographicCamera' ){
|
|
|
+ viewport.targetPlane = new Plane();
|
|
|
+ viewport.shiftTarget = new Vector3; //project在targetPlane上的位置
|
|
|
+ }
|
|
|
+ viewport.fitMargin = prop.margin;
|
|
|
+ viewports.push(viewport);
|
|
|
+ }
|
|
|
+ viewer.viewports = viewports;
|
|
|
+ viewer.updateScreenSize({forceUpdateSize:true});
|
|
|
+ viewports.forEach(viewport=>{
|
|
|
+ if(viewport.name == 'MainView')return
|
|
|
+ this.viewportFitBound(viewport, viewer.bound.boundingBox , viewer.bound.center , 0, viewport.fitMargin);
|
|
|
+ });
|
|
|
+ return viewports
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ unSplit(){
|
|
|
+ this.unfocusViewport();
|
|
|
+ viewer.viewports = [viewer.mainViewport];
|
|
|
+ viewer.mainViewport.width = 1;
|
|
|
+ viewer.mainViewport.height = 1;
|
|
|
+ viewer.mainViewport.left = 0;
|
|
|
+ viewer.mainViewport.bottom = 0;
|
|
|
+ viewer.updateScreenSize({forceUpdateSize:true});
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ viewportFitBound(viewport, bound, center, duration=0, margin){
|
|
|
+ let view = viewport.view;
|
|
|
+ let info = {bound};
|
|
|
+
|
|
|
+
|
|
|
+ let {boundSize, boundCenter} = this.getViewBound(viewport, bound );
|
|
|
+
|
|
|
+ //this.setShiftTarget(viewport, boundCenter)
|
|
|
+
|
|
|
+ viewport.targetPlane.setFromNormalAndCoplanarPoint( view.direction.clone(), boundCenter );
|
|
|
+ viewport.targetPlane.projectPoint(center, viewport.shiftTarget); //target转换到过模型中心的平面,以保证镜头一定在模型外 this.shiftTarget是得到的
|
|
|
+
|
|
|
+ info.endPosition = this.getPosOutOfModel(viewport, boundSize);
|
|
|
+
|
|
|
+ //if(viewport.name == 'mapViewport')info.endPosition.z = Math.max(Potree.config.map.cameraHeight, info.endPosition.z)
|
|
|
+
|
|
|
+ info.margin = margin || {x:30, y:30};
|
|
|
+ view.moveOrthoCamera(viewport, info , duration );
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ getViewBound(viewport, boundingBox){
|
|
|
+ if(boundingBox){
|
|
|
+ boundSize = boundingBox.getSize(new Vector3);
|
|
|
+ center = boundingBox.getCenter(new Vector3);
|
|
|
+ }else {
|
|
|
+ var {boundSize, center, boundingBox} = viewer.bound;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if(viewport.viewContainsPoints){//视野范围内必须要包含的点,直接算入模型区域。这时候得到的boundCenter和模型中心不重合
|
|
|
+ boundingBox = boundingBox.clone();
|
|
|
+ viewport.viewContainsPoints.forEach(point=>{
|
|
|
+ boundingBox.expandByPoint(point);
|
|
|
+ });
|
|
|
+ boundSize = boundingBox.getSize(new Vector3);
|
|
|
+ center = boundingBox.getCenter(new Vector3);
|
|
|
+ }
|
|
|
+
|
|
|
+ return {boundSize, boundCenter:center }
|
|
|
+ }
|
|
|
+
|
|
|
+ getPosOutOfModel(viewport, boundSize){
|
|
|
+ //let {boundSize, center} = viewer.bound
|
|
|
+ boundSize = boundSize || this.getViewBound(viewport).boundSize;
|
|
|
+ let expand = 10;
|
|
|
+ let radius = boundSize.length(); // / 2
|
|
|
+ let position = viewport.shiftTarget.clone().sub(viewport.view.direction.clone().multiplyScalar(radius + expand));
|
|
|
+
|
|
|
+ return position
|
|
|
+ }
|
|
|
+
|
|
|
+ updateCameraOutOfModel(){//因为移动模型导致模型超出相机外,所以更新位置
|
|
|
+ viewer.viewports.forEach((viewport, i )=>{
|
|
|
+ if(viewport != viewer.mainViewport){
|
|
|
+ let {boundSize, boundCenter} = this.getViewBound(viewport);
|
|
|
+ /* viewport.targetPlane.setFromNormalAndCoplanarPoint( viewport.view.direction.clone(), boundCenter)
|
|
|
+ viewport.targetPlane.projectPoint(viewport.view.position, viewport.shiftTarget) //target转换到过模型中心的平面,以保证镜头一定在模型外 this.shiftTarget是得到的
|
|
|
+ */
|
|
|
+ this.setShiftTarget(viewport, boundCenter);
|
|
|
+ let endPosition = this.getPosOutOfModel(viewport, boundSize);
|
|
|
+ //if(viewport.name == 'mapViewport')endPosition.z = Math.max(Potree.config.map.cameraHeight, endPosition.z)
|
|
|
+ viewport.view.position.copy(endPosition);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ setShiftTarget(viewport, center){
|
|
|
+ if(!viewport.targetPlane ){
|
|
|
+ viewport.targetPlane = new Plane();
|
|
|
+ viewport.shiftTarget = new Vector3; //project在targetPlane上的位置
|
|
|
+ }
|
|
|
+
|
|
|
+ viewport.targetPlane.setFromNormalAndCoplanarPoint(viewport.view.direction, center );
|
|
|
+ viewport.targetPlane.projectPoint(viewport.view.position, viewport.shiftTarget ); //target转换到过模型中心的平面,以保证镜头一定在模型外
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ rotateSideCamera(viewport, angle){//侧视图绕模型中心水平旋转
|
|
|
+
|
|
|
+ //let {boundSize, center} = viewer.bound
|
|
|
+ let {boundSize, boundCenter } = this.getViewBound(viewport);
|
|
|
+ let center = this.focusCenter || boundCenter; //旋转中心,一般是所有模型的中心,除非想指定中心点
|
|
|
+ this.setShiftTarget(viewport, center);
|
|
|
+ //找到平移向量
|
|
|
+ let vec = new Vector3().subVectors(center, viewport.shiftTarget);//相对于中心的偏移值,旋转后偏移值也旋转
|
|
|
+
|
|
|
+ //旋转
|
|
|
+ var rotMatrix = new Matrix4().makeRotationAxis(new Vector3(0,0,1), angle);
|
|
|
+
|
|
|
+ viewport.view.direction = viewport.view.direction.applyMatrix4(rotMatrix);
|
|
|
+
|
|
|
+
|
|
|
+ vec.applyMatrix4(rotMatrix);
|
|
|
+ viewport.shiftTarget.subVectors(center,vec); //新的
|
|
|
+
|
|
|
+
|
|
|
+ viewport.view.position = this.getPosOutOfModel(viewport, boundSize);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ getOrthoCamera(){
|
|
|
+ let camera = new OrthographicCamera(-100, 100, 100, 100, 0.01, 10000);
|
|
|
+ camera.up.set(0,0,1);
|
|
|
+ return camera
|
|
|
+ }
|
|
|
+
|
|
|
+ focusOnViewport(name){//全屏
|
|
|
+ viewer.viewports.forEach((viewport, i )=>{
|
|
|
+ if(viewport.name == name){
|
|
|
+ this.focusInfo = {
|
|
|
+ name,
|
|
|
+ left : viewport.left, bottom : viewport.bottom, height : viewport.height, width : viewport.width
|
|
|
+ };
|
|
|
+ viewport.left = 0; viewport.bottom = 0; viewport.height = 1; viewport.width = 1;
|
|
|
+
|
|
|
+ }else {
|
|
|
+ viewport.active = false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ viewer.updateScreenSize({forceUpdateSize:true});
|
|
|
+ }
|
|
|
+
|
|
|
+ unfocusViewport(){
|
|
|
+ if(!this.focusInfo)return
|
|
|
+ viewer.viewports.forEach((viewport, i )=>{
|
|
|
+ if(this.focusInfo.name == viewport.name){//全屏的恢复
|
|
|
+ viewport.left = this.focusInfo.left;
|
|
|
+ viewport.bottom = this.focusInfo.bottom;
|
|
|
+ viewport.height = this.focusInfo.height;
|
|
|
+ viewport.width = this.focusInfo.width;
|
|
|
+ }
|
|
|
+ viewport.active = true;
|
|
|
+ });
|
|
|
+ viewer.updateScreenSize({forceUpdateSize:true});
|
|
|
+ this.focusInfo = null;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
const FEET_TO_INCHES_FACTOR = 12;
|
|
|
const EIGHTHS_SYMBOLS = ["", "⅛", "¼", "⅜", "½", "⅝", "¾", "⅞"];//eighths 八分之……
|
|
|
|
|
@@ -106322,7 +106319,7 @@ ENDSEC
|
|
|
|
|
|
this.position.copy(playerPos.clone().add(dir));
|
|
|
}else {
|
|
|
- viewer.navCubeViewer.splitScreen.setShiftTarget(viewer.mainViewport, viewer.bound.center);
|
|
|
+ viewer.splitScreen.setShiftTarget(viewer.mainViewport, viewer.bound.center);
|
|
|
viewer.mainViewport.targetPlane.setFromNormalAndCoplanarPoint( viewer.mainViewport.view.direction.clone(), viewer.bound.center );
|
|
|
viewer.mainViewport.targetPlane.projectPoint(newPos, viewer.mainViewport.shiftTarget );
|
|
|
this.position.copy(viewer.mainViewport.shiftTarget.clone() );
|
|
@@ -136099,7 +136096,8 @@ ENDSEC
|
|
|
}
|
|
|
|
|
|
|
|
|
-
|
|
|
+ this.splitScreen = new SplitScreen();
|
|
|
+
|
|
|
this.navigateMode = 'free'; // 'panorama'; 'free'自由模式是只显示点云或者未进入到漫游点,
|
|
|
this.isEdit = true;
|
|
|
this.waitQueue = [];
|
|
@@ -139506,7 +139504,13 @@ ENDSEC
|
|
|
boundSize.y = Math.max(min, boundSize.y);
|
|
|
}
|
|
|
if(camera.type == 'OrthographicCamera'){
|
|
|
- dis = boundSize.length();
|
|
|
+ //dis = boundSize.length()
|
|
|
+ o.dontChangeCamDir = true; //强制不改方向
|
|
|
+ //必须在模型外部
|
|
|
+ this.mainViewport.targetPlane.setFromNormalAndCoplanarPoint(this.mainViewport.view.direction, this.bound.center );
|
|
|
+ this.mainViewport.targetPlane.projectPoint(target, this.mainViewport.shiftTarget ); //得到target在中心面的投影
|
|
|
+ let pos = this.splitScreen.getPosOutOfModel(this.mainViewport, this.bound.size); //得到观察位置(shiftTarget投影到模型外部)
|
|
|
+ dis = pos.distanceTo(target);
|
|
|
}else {
|
|
|
let aspect = boundSize.x / boundSize.y;
|
|
|
if(camera.aspect > aspect){//视野更宽则用bound的纵向来决定
|
|
@@ -139523,8 +139527,11 @@ ENDSEC
|
|
|
//三个顶点以上的由于measure的中心不等于bound的中心,所以点会超出bound外。 且由于视椎近大远小,即使是两个点的,bound居中后线看上去仍旧不居中.
|
|
|
|
|
|
//获得相机最佳位置
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
let dir;
|
|
|
- if(o.dontChangeCamDir){
|
|
|
+ if(o.dontChangeCamDir){
|
|
|
dir = viewer.mainViewport.view.direction.negate();
|
|
|
}else {
|
|
|
dir = new Vector3().subVectors(cameraPos, target).normalize();
|