From eb4b9ef46f77121bff93b8a30c8dcfdc7df7463d Mon Sep 17 00:00:00 2001 From: jiangheng <jiangheng@geoway.com.cn> Date: Thu, 23 Feb 2023 12:16:30 +0800 Subject: [PATCH 1/3] fix camera go througth building --- .../engine/Source/Scene/ScreenSpaceCameraController.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/engine/Source/Scene/ScreenSpaceCameraController.js b/packages/engine/Source/Scene/ScreenSpaceCameraController.js index 38e767dd16d..825fede4987 100644 --- a/packages/engine/Source/Scene/ScreenSpaceCameraController.js +++ b/packages/engine/Source/Scene/ScreenSpaceCameraController.js @@ -2158,6 +2158,8 @@ function pan3D(controller, startPosition, movement, ellipsoid) { const zoom3DUnitPosition = new Cartesian3(); const zoom3DCartographic = new Cartographic(); +let preIntersectionDistance = 0; + function zoom3D(controller, startPosition, movement) { if (defined(movement.distance)) { movement = movement.distance; @@ -2189,10 +2191,10 @@ function zoom3D(controller, startPosition, movement) { zoom3DCartographic ).height; - const inertiaMovementApproachingGround = Math.abs(height) < 50; + const approachingCollision = Math.abs(preIntersectionDistance) < 100; const needPickGlobe = inertiaMovement - ? inertiaMovementApproachingGround + ? approachingCollision : height < controller._minimumPickingTerrainHeight; if (needPickGlobe) { intersection = pickGlobe(controller, windowPosition, zoomCVIntersection); @@ -2201,6 +2203,7 @@ function zoom3D(controller, startPosition, movement) { let distance; if (defined(intersection)) { distance = Cartesian3.distance(ray.origin, intersection); + preIntersectionDistance = distance; } if (cameraUnderground) { From b182960ac6f80313df42d90994b23c4b242fad8b Mon Sep 17 00:00:00 2001 From: jiangheng <jiangheng@geoway.com.cn> Date: Fri, 24 Feb 2023 10:24:13 +0800 Subject: [PATCH 2/3] adjust max approaching collision distance --- packages/engine/Source/Scene/ScreenSpaceCameraController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/engine/Source/Scene/ScreenSpaceCameraController.js b/packages/engine/Source/Scene/ScreenSpaceCameraController.js index 825fede4987..ba2b91264bf 100644 --- a/packages/engine/Source/Scene/ScreenSpaceCameraController.js +++ b/packages/engine/Source/Scene/ScreenSpaceCameraController.js @@ -2191,7 +2191,7 @@ function zoom3D(controller, startPosition, movement) { zoom3DCartographic ).height; - const approachingCollision = Math.abs(preIntersectionDistance) < 100; + const approachingCollision = Math.abs(preIntersectionDistance) < 4000; const needPickGlobe = inertiaMovement ? approachingCollision From 456f01c9057de46c7f036f1bd6300f104342f176 Mon Sep 17 00:00:00 2001 From: jiangheng <jiangheng@geoway.com.cn> Date: Tue, 28 Feb 2023 09:53:06 +0800 Subject: [PATCH 3/3] add minimumPickingTerrainDistanceWithInertia --- .../engine/Source/Scene/ScreenSpaceCameraController.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/engine/Source/Scene/ScreenSpaceCameraController.js b/packages/engine/Source/Scene/ScreenSpaceCameraController.js index ba2b91264bf..5d592c00670 100644 --- a/packages/engine/Source/Scene/ScreenSpaceCameraController.js +++ b/packages/engine/Source/Scene/ScreenSpaceCameraController.js @@ -223,6 +223,12 @@ function ScreenSpaceCameraController(scene) { */ this.minimumPickingTerrainHeight = 150000.0; this._minimumPickingTerrainHeight = this.minimumPickingTerrainHeight; + /** + * The minimum distance the camera must be before testing for collision with terrain when zoom with inertia. + * @type {number} + * @default 4000.0 + */ + this.minimumPickingTerrainDistanceWithInertia = 4000.0; /** * The minimum height the camera must be before testing for collision with terrain. * @type {number} @@ -2191,7 +2197,9 @@ function zoom3D(controller, startPosition, movement) { zoom3DCartographic ).height; - const approachingCollision = Math.abs(preIntersectionDistance) < 4000; + const approachingCollision = + Math.abs(preIntersectionDistance) < + controller.minimumPickingTerrainDistanceWithInertia; const needPickGlobe = inertiaMovement ? approachingCollision