|
@@ -591,22 +591,12 @@ class NavigationCube{
|
|
|
faceMesh.addEventListener('click', (e)=>{
|
|
|
this.changingView = true
|
|
|
faceMesh.material.uniforms.faceColor.value.set(Colors.blue)
|
|
|
-
|
|
|
- if(viewer.mainViewport.camera != viewer.scene.cameraO){
|
|
|
- viewer.scene.cameraO.position.copy(viewer.mainViewport.camera.position)
|
|
|
- viewer.scene.cameraO.quaternion.copy(viewer.mainViewport.camera.quaternion)
|
|
|
- viewer.mainViewport.camera = viewer.scene.cameraO
|
|
|
- viewer.setCameraMode(CameraMode.ORTHOGRAPHIC)
|
|
|
- navCubeViewer.controls.setEnable(false)
|
|
|
- }
|
|
|
-
|
|
|
- viewer.focusOnObject(viewer.bound, 'boundingBox', 1000, {dir:directions[name].clone()}).promise.done(()=>{
|
|
|
+ navCubeViewer.switchView('ortho', directions[name].clone(),()=>{
|
|
|
this.changingView = false
|
|
|
faceMesh.material.uniforms.faceColor.value.set(Colors.black)
|
|
|
- //console.log('回2', name)
|
|
|
- navCubeViewer.dispatchEvent('content_changed')
|
|
|
})
|
|
|
|
|
|
+
|
|
|
});
|
|
|
|
|
|
})
|
|
@@ -767,6 +757,7 @@ class NavCubeViewer extends ViewerBase{
|
|
|
updateCamera(){
|
|
|
let view = this.listenViewport.view
|
|
|
this.view.quaternion = view.quaternion //this.view.rotation = view.rotation
|
|
|
+ this.view.yaw = view.yaw
|
|
|
var dir = view.direction; //相机朝向
|
|
|
this.view.position.copy(dir.multiplyScalar(this.view.radius).negate()) //相机绕着指南针中心(000)转动
|
|
|
|
|
@@ -779,27 +770,122 @@ class NavCubeViewer extends ViewerBase{
|
|
|
}
|
|
|
|
|
|
pushHomeBtn(){
|
|
|
- if(viewer.mainViewport.camera == viewer.scene.cameraO){
|
|
|
- //viewer.scene.cameraP.position.copy(viewer.mainViewport.camera.position)
|
|
|
- //viewer.scene.cameraP.quaternion.copy(viewer.mainViewport.camera.quaternion)
|
|
|
- viewer.mainViewport.camera = viewer.scene.cameraP
|
|
|
- viewer.setCameraMode(CameraMode.PERSPECTIVE)
|
|
|
+ this.switchView('perspective')
|
|
|
+ }
|
|
|
+
|
|
|
+ /* switchView(type, dir, done){
|
|
|
+ let view = viewer.mainViewport.view
|
|
|
+ if(type == 'ortho'){
|
|
|
+ if(viewer.mainViewport.camera != viewer.scene.cameraO){
|
|
|
+ viewer.scene.cameraO.position.copy(viewer.mainViewport.camera.position)
|
|
|
+ viewer.scene.cameraO.quaternion.copy(viewer.mainViewport.camera.quaternion)
|
|
|
+ viewer.mainViewport.camera = viewer.scene.cameraO
|
|
|
+ viewer.setCameraMode(CameraMode.ORTHOGRAPHIC)
|
|
|
+ navCubeViewer.controls.setEnable(false)
|
|
|
+
|
|
|
+ //假设保持到目前中心的视角范围不变
|
|
|
+ splitScreen.setShiftTarget(viewer.mainViewport, viewer.bound.center)
|
|
|
+ let dis = new THREE.Vector3().subVectors(viewer.mainViewport.shiftTarget, viewer.scene.cameraO.position).length() ; //-nearestPano[0].score
|
|
|
+
|
|
|
+ //根据2d->3d的式子逆求zoom
|
|
|
+ let halfHeight = Math.abs(dis) * Math.tan( THREE.Math.degToRad(viewer.scene.cameraP.fov/2));
|
|
|
+ viewer.scene.cameraO.zoom = viewer.scene.cameraO.top / halfHeight;
|
|
|
+ viewer.scene.cameraO.updateProjectionMatrix();
|
|
|
+
|
|
|
+ console.log('zoom', viewer.scene.cameraO.zoom)
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
- //假设保持到目前中心的视角范围不变
|
|
|
- let view = viewer.mainViewport.view
|
|
|
- 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 )
|
|
|
-
|
|
|
- let halfHeight = viewer.scene.cameraO.top/viewer.scene.cameraO.zoom
|
|
|
- let dis = halfHeight / Math.tan( THREE.Math.degToRad(viewer.scene.cameraP.fov/2))
|
|
|
+ viewer.focusOnObject(viewer.bound, 'boundingBox', 1000, {dir }).promise.done(()=>{
|
|
|
+ done && done()
|
|
|
+ //console.log('回2', name)
|
|
|
+ navCubeViewer.dispatchEvent('content_changed')
|
|
|
+ })
|
|
|
+ }else{
|
|
|
|
|
|
- view.position.copy(viewer.mainViewport.shiftTarget).sub(view.direction.clone().multiplyScalar(dis));
|
|
|
- this.controls.setEnable(true)
|
|
|
+ if(viewer.mainViewport.camera == viewer.scene.cameraO){
|
|
|
+ //viewer.scene.cameraP.position.copy(viewer.mainViewport.camera.position)
|
|
|
+ //viewer.scene.cameraP.quaternion.copy(viewer.mainViewport.camera.quaternion)
|
|
|
+ viewer.mainViewport.camera = viewer.scene.cameraP
|
|
|
+ viewer.setCameraMode(CameraMode.PERSPECTIVE)
|
|
|
+
|
|
|
+ //假设保持到目前中心的视角范围不变
|
|
|
+
|
|
|
+ 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 )
|
|
|
+
|
|
|
+ let halfHeight = viewer.scene.cameraO.top/viewer.scene.cameraO.zoom
|
|
|
+ let dis = halfHeight / Math.tan( THREE.Math.degToRad(viewer.scene.cameraP.fov/2))
|
|
|
+
|
|
|
+ view.position.copy(viewer.mainViewport.shiftTarget).sub(view.direction.clone().multiplyScalar(dis));
|
|
|
+ this.controls.setEnable(true)
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
+ } */
|
|
|
+ switchView(type, dir, done){
|
|
|
+ let view = viewer.mainViewport.view
|
|
|
+ if(type == 'ortho'){
|
|
|
+ let startCamera, endCamera
|
|
|
+ if(viewer.mainViewport.camera != viewer.scene.cameraO){
|
|
|
+ startCamera = viewer.scene.cameraP
|
|
|
+ endCamera = viewer.scene.cameraO
|
|
|
+ viewer.scene.cameraO.position.copy(viewer.mainViewport.camera.position)
|
|
|
+ viewer.scene.cameraO.quaternion.copy(viewer.mainViewport.camera.quaternion)
|
|
|
+ viewer.mainViewport.camera = viewer.scene.cameraO //先设置为cameraO, 才能计算top
|
|
|
+ viewer.setCameraMode(CameraMode.ORTHOGRAPHIC) //updateScreenSize set cameraO.top
|
|
|
+
|
|
|
+ navCubeViewer.controls.setEnable(false)
|
|
|
+
|
|
|
+ //假设保持到目前中心的视角范围不变
|
|
|
+ splitScreen.setShiftTarget(viewer.mainViewport, viewer.bound.center)
|
|
|
+ let dis = new THREE.Vector3().subVectors(viewer.mainViewport.shiftTarget, viewer.scene.cameraO.position).length() ; //-nearestPano[0].score
|
|
|
+
|
|
|
+ //根据2d->3d的式子逆求zoom
|
|
|
+ let halfHeight = Math.abs(dis) * Math.tan( THREE.Math.degToRad(viewer.scene.cameraP.fov/2));
|
|
|
+ viewer.scene.cameraO.zoom = viewer.scene.cameraO.top / halfHeight;
|
|
|
+ viewer.scene.cameraO.updateProjectionMatrix();
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ viewer.focusOnObject(viewer.bound, 'boundingBox', 1000, {
|
|
|
+ dir , startCamera, endCamera
|
|
|
+ }).promise.done(()=>{
|
|
|
+
|
|
|
+ done && done()
|
|
|
+ navCubeViewer.dispatchEvent('content_changed')
|
|
|
+ })
|
|
|
+ }else{
|
|
|
+
|
|
|
+ if(viewer.mainViewport.camera == viewer.scene.cameraO){
|
|
|
+ //viewer.scene.cameraP.position.copy(viewer.mainViewport.camera.position)
|
|
|
+ //viewer.scene.cameraP.quaternion.copy(viewer.mainViewport.camera.quaternion)
|
|
|
+ viewer.mainViewport.camera = viewer.scene.cameraP
|
|
|
+ viewer.setCameraMode(CameraMode.PERSPECTIVE)
|
|
|
+
|
|
|
+ //假设保持到目前中心的视角范围不变
|
|
|
+
|
|
|
+ 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 )
|
|
|
+
|
|
|
+ let halfHeight = viewer.scene.cameraO.top/viewer.scene.cameraO.zoom
|
|
|
+ let dis = halfHeight / Math.tan( THREE.Math.degToRad(viewer.scene.cameraP.fov/2))
|
|
|
+
|
|
|
+ let position = new THREE.Vector3().copy(viewer.mainViewport.shiftTarget).sub(view.direction.clone().multiplyScalar(dis));
|
|
|
+ //view.position.copy(viewer.mainViewport.shiftTarget).sub(view.direction.clone().multiplyScalar(dis));
|
|
|
+ this.controls.setEnable(true)
|
|
|
|
|
|
|
|
|
+ view.tranCamera(viewer.mainViewport, { position ,
|
|
|
+ callback:()=>{
|
|
|
+ }, startCamera:viewer.scene.cameraO, endCamera:viewer.scene.cameraP, midCamera:viewer.scene.cameraBasic
|
|
|
+ }, 500)
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
rotateSideCamera(angle){
|
|
|
splitScreen.rotateSideCamera(viewer.mainViewport,angle)
|
|
|
}
|