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