From af0a45aa017060a4ea9fd3f158f9c03fde4d856e Mon Sep 17 00:00:00 2001 From: wqy Date: Thu, 28 Mar 2024 15:17:14 +0800 Subject: [PATCH 1/8] modify the terrain adjust condition --- .../Scene/ScreenSpaceCameraController.js | 54 +++++++++++-------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/packages/engine/Source/Scene/ScreenSpaceCameraController.js b/packages/engine/Source/Scene/ScreenSpaceCameraController.js index eb47b352dea5..06677828bb4b 100644 --- a/packages/engine/Source/Scene/ScreenSpaceCameraController.js +++ b/packages/engine/Source/Scene/ScreenSpaceCameraController.js @@ -2855,6 +2855,7 @@ function update3D(controller) { const scratchAdjustHeightTransform = new Matrix4(); const scratchAdjustHeightCartographic = new Cartographic(); +const transformOrigin = new Cartesian3(); function adjustHeightForTerrain(controller, cameraChanged) { controller._adjustedHeightForTerrain = true; @@ -2888,31 +2889,38 @@ function adjustHeightForTerrain(controller, cameraChanged) { let heightUpdated = false; if (cartographic.height < controller._minimumCollisionTerrainHeight) { - const globeHeight = controller._scene.globeHeight; - if (defined(globeHeight)) { - const height = globeHeight + controller.minimumZoomDistance; - const difference = globeHeight - controller._lastGlobeHeight; - const percentDifference = difference / controller._lastGlobeHeight; - - // Unless the camera has been moved by user input, to avoid big jumps during tile loads - // only make height updates when the globe height has been fairly stable across several frames - if ( - cartographic.height < height && - (cameraChanged || Math.abs(percentDifference) <= 0.1) - ) { - cartographic.height = height; - if (mode === SceneMode.SCENE3D) { - ellipsoid.cartographicToCartesian(cartographic, camera.position); - } else { - projection.project(cartographic, camera.position); + let transformOriginLen = Infinity; + if (defined(transform)) { + Matrix4.getTranslation(transform, transformOrigin); + transformOriginLen = Cartesian3.magnitude(transformOrigin); + } + if (transformOriginLen > controller._minimumCollisionTerrainHeight) { + const globeHeight = controller._scene.globeHeight; + if (defined(globeHeight)) { + const height = globeHeight + controller.minimumZoomDistance; + const difference = globeHeight - controller._lastGlobeHeight; + const percentDifference = difference / controller._lastGlobeHeight; + + // Unless the camera has been moved by user input, to avoid big jumps during tile loads + // only make height updates when the globe height has been fairly stable across several frames + if ( + cartographic.height < height && + (cameraChanged || Math.abs(percentDifference) <= 0.1) + ) { + cartographic.height = height; + if (mode === SceneMode.SCENE3D) { + ellipsoid.cartographicToCartesian(cartographic, camera.position); + } else { + projection.project(cartographic, camera.position); + } + heightUpdated = true; } - heightUpdated = true; - } - if (cameraChanged || Math.abs(percentDifference) <= 0.1) { - controller._lastGlobeHeight = globeHeight; - } else { - controller._lastGlobeHeight += difference * 0.1; + if (cameraChanged || Math.abs(percentDifference) <= 0.1) { + controller._lastGlobeHeight = globeHeight; + } else { + controller._lastGlobeHeight += difference * 0.1; + } } } } From ca2e7c08a6c4386cde3b59b1567cd28b5e6d4db5 Mon Sep 17 00:00:00 2001 From: BraveDream <37433156+HapDragon@users.noreply.github.com> Date: Fri, 27 Dec 2024 17:06:30 +0800 Subject: [PATCH 2/8] change adjustHeightForTerrain function scale to another ellipsoid according to the percentage of geocentric length in the condition of camera transform. --- .../Scene/ScreenSpaceCameraController.js | 75 +++++++++++-------- 1 file changed, 43 insertions(+), 32 deletions(-) diff --git a/packages/engine/Source/Scene/ScreenSpaceCameraController.js b/packages/engine/Source/Scene/ScreenSpaceCameraController.js index 0ef23d884af3..d2f09a238083 100644 --- a/packages/engine/Source/Scene/ScreenSpaceCameraController.js +++ b/packages/engine/Source/Scene/ScreenSpaceCameraController.js @@ -2901,7 +2901,7 @@ function update3D(controller) { const scratchAdjustHeightTransform = new Matrix4(); const scratchAdjustHeightCartographic = new Cartographic(); -const transformOrigin = new Cartesian3(); +const percentRadius = new Cartesian3(); function adjustHeightForTerrain(controller, cameraChanged) { controller._adjustedHeightForTerrain = true; @@ -2914,7 +2914,7 @@ function adjustHeightForTerrain(controller, cameraChanged) { } const camera = scene.camera; - const ellipsoid = defaultValue(scene.ellipsoid, Ellipsoid.WGS84); + let ellipsoid = defaultValue(scene.ellipsoid, Ellipsoid.WGS84); const projection = scene.mapProjection; let transform; @@ -2927,6 +2927,24 @@ function adjustHeightForTerrain(controller, cameraChanged) { const cartographic = scratchAdjustHeightCartographic; if (mode === SceneMode.SCENE3D) { + if (defined(transform)) + { + //scale position to another ellipsoid according to percentage of geocentric length + //in the condition of transform camera + const percentR=Math.sqrt( + camera.position.x*camera.position.x*ellipsoid.oneOverRadiiSquared.x+ + camera.position.y*camera.position.y*ellipsoid.oneOverRadiiSquared.y+ + camera.position.z*camera.position.z*ellipsoid.oneOverRadiiSquared.z + ); + + if(percentR<0.99) + { + percentRadius.x=ellipsoid.radii.x*percentR; + percentRadius.y=ellipsoid.radii.y*percentR; + percentRadius.z=ellipsoid.radii.z*percentR; + ellipsoid=Ellipsoid.fromCartesian3(percentRadius); + } + } ellipsoid.cartesianToCartographic(camera.position, cartographic); } else { projection.unproject(camera.position, cartographic); @@ -2934,38 +2952,31 @@ function adjustHeightForTerrain(controller, cameraChanged) { let heightUpdated = false; if (cartographic.height < controller._minimumCollisionTerrainHeight) { - let transformOriginLen = Infinity; - if (defined(transform)) { - Matrix4.getTranslation(transform, transformOrigin); - transformOriginLen = Cartesian3.magnitude(transformOrigin); - } - if (transformOriginLen > controller._minimumCollisionTerrainHeight) { - const globeHeight = controller._scene.globeHeight; - if (defined(globeHeight)) { - const height = globeHeight + controller.minimumZoomDistance; - const difference = globeHeight - controller._lastGlobeHeight; - const percentDifference = difference / controller._lastGlobeHeight; - - // Unless the camera has been moved by user input, to avoid big jumps during tile loads - // only make height updates when the globe height has been fairly stable across several frames - if ( - cartographic.height < height && - (cameraChanged || Math.abs(percentDifference) <= 0.1) - ) { - cartographic.height = height; - if (mode === SceneMode.SCENE3D) { - ellipsoid.cartographicToCartesian(cartographic, camera.position); - } else { - projection.project(cartographic, camera.position); - } - heightUpdated = true; - } - - if (cameraChanged || Math.abs(percentDifference) <= 0.1) { - controller._lastGlobeHeight = globeHeight; + const globeHeight = controller._scene.globeHeight; + if (defined(globeHeight)) { + const height = globeHeight + controller.minimumZoomDistance; + const difference = globeHeight - controller._lastGlobeHeight; + const percentDifference = difference / controller._lastGlobeHeight; + + // Unless the camera has been moved by user input, to avoid big jumps during tile loads + // only make height updates when the globe height has been fairly stable across several frames + if ( + cartographic.height < height && + (cameraChanged || Math.abs(percentDifference) <= 0.1) + ) { + cartographic.height = height; + if (mode === SceneMode.SCENE3D) { + ellipsoid.cartographicToCartesian(cartographic, camera.position); } else { - controller._lastGlobeHeight += difference * 0.1; + projection.project(cartographic, camera.position); } + heightUpdated = true; + } + + if (cameraChanged || Math.abs(percentDifference) <= 0.1) { + controller._lastGlobeHeight = globeHeight; + } else { + controller._lastGlobeHeight += difference * 0.1; } } } From 742f5a77ddddfb1a72c881eddf778beb54b5d86d Mon Sep 17 00:00:00 2001 From: BraveDream <37433156+HapDragon@users.noreply.github.com> Date: Fri, 27 Dec 2024 17:34:06 +0800 Subject: [PATCH 3/8] Update ScreenSpaceCameraController.js format code --- .../Scene/ScreenSpaceCameraController.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/engine/Source/Scene/ScreenSpaceCameraController.js b/packages/engine/Source/Scene/ScreenSpaceCameraController.js index d2f09a238083..47d322644bc7 100644 --- a/packages/engine/Source/Scene/ScreenSpaceCameraController.js +++ b/packages/engine/Source/Scene/ScreenSpaceCameraController.js @@ -2931,18 +2931,18 @@ function adjustHeightForTerrain(controller, cameraChanged) { { //scale position to another ellipsoid according to percentage of geocentric length //in the condition of transform camera - const percentR=Math.sqrt( - camera.position.x*camera.position.x*ellipsoid.oneOverRadiiSquared.x+ - camera.position.y*camera.position.y*ellipsoid.oneOverRadiiSquared.y+ - camera.position.z*camera.position.z*ellipsoid.oneOverRadiiSquared.z + const percentR = Math.sqrt( + camera.position.x * camera.position.x * ellipsoid.oneOverRadiiSquared.x + + camera.position.y * camera.position.y * ellipsoid.oneOverRadiiSquared.y + + camera.position.z * camera.position.z * ellipsoid.oneOverRadiiSquared.z ); - if(percentR<0.99) + if(percentR < 0.99) { - percentRadius.x=ellipsoid.radii.x*percentR; - percentRadius.y=ellipsoid.radii.y*percentR; - percentRadius.z=ellipsoid.radii.z*percentR; - ellipsoid=Ellipsoid.fromCartesian3(percentRadius); + percentRadius.x = ellipsoid.radii.x * percentR; + percentRadius.y = ellipsoid.radii.y * percentR; + percentRadius.z = ellipsoid.radii.z * percentR; + ellipsoid = Ellipsoid.fromCartesian3(percentRadius); } } ellipsoid.cartesianToCartographic(camera.position, cartographic); From d61f7101e6eb40f67f7e779605d3efbdf911ba0a Mon Sep 17 00:00:00 2001 From: BraveDream <37433156+HapDragon@users.noreply.github.com> Date: Fri, 27 Dec 2024 19:00:43 +0800 Subject: [PATCH 4/8] Update ScreenSpaceCameraController.js Scale to another ellipsoid according to geocentric length in condition of camera transform --- .../engine/Source/Scene/ScreenSpaceCameraController.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/engine/Source/Scene/ScreenSpaceCameraController.js b/packages/engine/Source/Scene/ScreenSpaceCameraController.js index 47d322644bc7..aa85bf229f84 100644 --- a/packages/engine/Source/Scene/ScreenSpaceCameraController.js +++ b/packages/engine/Source/Scene/ScreenSpaceCameraController.js @@ -2927,8 +2927,7 @@ function adjustHeightForTerrain(controller, cameraChanged) { const cartographic = scratchAdjustHeightCartographic; if (mode === SceneMode.SCENE3D) { - if (defined(transform)) - { + if (defined(transform)) { //scale position to another ellipsoid according to percentage of geocentric length //in the condition of transform camera const percentR = Math.sqrt( @@ -2936,9 +2935,8 @@ function adjustHeightForTerrain(controller, cameraChanged) { camera.position.y * camera.position.y * ellipsoid.oneOverRadiiSquared.y + camera.position.z * camera.position.z * ellipsoid.oneOverRadiiSquared.z ); - - if(percentR < 0.99) - { + + if (percentR < 0.99) { percentRadius.x = ellipsoid.radii.x * percentR; percentRadius.y = ellipsoid.radii.y * percentR; percentRadius.z = ellipsoid.radii.z * percentR; From 235c08f6b565a7ca71c313c3b4d348b3eb0fd621 Mon Sep 17 00:00:00 2001 From: BraveDream <37433156+HapDragon@users.noreply.github.com> Date: Fri, 27 Dec 2024 19:17:00 +0800 Subject: [PATCH 5/8] Update ScreenSpaceCameraController.js Scale to another ellipsoid according to geocentric length in condition of camera transform. --- .../Source/Scene/ScreenSpaceCameraController.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/engine/Source/Scene/ScreenSpaceCameraController.js b/packages/engine/Source/Scene/ScreenSpaceCameraController.js index aa85bf229f84..af3eadea5dbf 100644 --- a/packages/engine/Source/Scene/ScreenSpaceCameraController.js +++ b/packages/engine/Source/Scene/ScreenSpaceCameraController.js @@ -2928,12 +2928,18 @@ function adjustHeightForTerrain(controller, cameraChanged) { const cartographic = scratchAdjustHeightCartographic; if (mode === SceneMode.SCENE3D) { if (defined(transform)) { - //scale position to another ellipsoid according to percentage of geocentric length + //scale position to another ellipsoid according to percentage of geocentric length //in the condition of transform camera const percentR = Math.sqrt( - camera.position.x * camera.position.x * ellipsoid.oneOverRadiiSquared.x + - camera.position.y * camera.position.y * ellipsoid.oneOverRadiiSquared.y + - camera.position.z * camera.position.z * ellipsoid.oneOverRadiiSquared.z + camera.position.x * + camera.position.x * + ellipsoid.oneOverRadiiSquared.x + + camera.position.y * + camera.position.y * + ellipsoid.oneOverRadiiSquared.y + + camera.position.z * + camera.position.z * + ellipsoid.oneOverRadiiSquared.z, ); if (percentR < 0.99) { From c542b28095337c07b674fbad56ef9fb6ce660e45 Mon Sep 17 00:00:00 2001 From: BraveDream <37433156+HapDragon@users.noreply.github.com> Date: Thu, 2 Jan 2025 16:40:54 +0800 Subject: [PATCH 6/8] Update ScreenSpaceCameraController.js Use percent radius to scale to another ellipsoid when change the cartographic height. --- .../Scene/ScreenSpaceCameraController.js | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/packages/engine/Source/Scene/ScreenSpaceCameraController.js b/packages/engine/Source/Scene/ScreenSpaceCameraController.js index af3eadea5dbf..8f474e46ad30 100644 --- a/packages/engine/Source/Scene/ScreenSpaceCameraController.js +++ b/packages/engine/Source/Scene/ScreenSpaceCameraController.js @@ -2919,6 +2919,11 @@ function adjustHeightForTerrain(controller, cameraChanged) { let transform; let mag; + let percentR = 1; + percentRadius.x = ellipsoid.radii.x; + percentRadius.y = ellipsoid.radii.y; + percentRadius.z = ellipsoid.radii.z; + if (!Matrix4.equals(camera.transform, Matrix4.IDENTITY)) { transform = Matrix4.clone(camera.transform, scratchAdjustHeightTransform); mag = Cartesian3.magnitude(camera.position); @@ -2927,10 +2932,11 @@ function adjustHeightForTerrain(controller, cameraChanged) { const cartographic = scratchAdjustHeightCartographic; if (mode === SceneMode.SCENE3D) { + ellipsoid.cartesianToCartographic(camera.position, cartographic); if (defined(transform)) { //scale position to another ellipsoid according to percentage of geocentric length //in the condition of transform camera - const percentR = Math.sqrt( + percentR = Math.sqrt( camera.position.x * camera.position.x * ellipsoid.oneOverRadiiSquared.x + @@ -2941,15 +2947,13 @@ function adjustHeightForTerrain(controller, cameraChanged) { camera.position.z * ellipsoid.oneOverRadiiSquared.z, ); - - if (percentR < 0.99) { + if (percentR > 1 - CesiumMath.EPSILON4) percentR = 1; + else { percentRadius.x = ellipsoid.radii.x * percentR; percentRadius.y = ellipsoid.radii.y * percentR; percentRadius.z = ellipsoid.radii.z * percentR; - ellipsoid = Ellipsoid.fromCartesian3(percentRadius); } } - ellipsoid.cartesianToCartographic(camera.position, cartographic); } else { projection.unproject(camera.position, cartographic); } @@ -2968,9 +2972,12 @@ function adjustHeightForTerrain(controller, cameraChanged) { cartographic.height < height && (cameraChanged || Math.abs(percentDifference) <= 0.1) ) { - cartographic.height = height; + cartographic.height = height * percentR; if (mode === SceneMode.SCENE3D) { - ellipsoid.cartographicToCartesian(cartographic, camera.position); + Ellipsoid.fromCartesian3(percentRadius).cartographicToCartesian( + cartographic, + camera.position, + ); } else { projection.project(cartographic, camera.position); } From 088f0053029d98203f4d7eae4d5a0ded23bf20ab Mon Sep 17 00:00:00 2001 From: BraveDream <37433156+HapDragon@users.noreply.github.com> Date: Thu, 2 Jan 2025 16:42:15 +0800 Subject: [PATCH 7/8] Update ScreenSpaceCameraControllerSpec.js change test spec . --- packages/engine/Specs/Scene/ScreenSpaceCameraControllerSpec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/engine/Specs/Scene/ScreenSpaceCameraControllerSpec.js b/packages/engine/Specs/Scene/ScreenSpaceCameraControllerSpec.js index f46ed5410c4b..5d0951cb136e 100644 --- a/packages/engine/Specs/Scene/ScreenSpaceCameraControllerSpec.js +++ b/packages/engine/Specs/Scene/ScreenSpaceCameraControllerSpec.js @@ -2019,7 +2019,7 @@ describe("Scene/ScreenSpaceCameraController", function () { updateController(); expect(camera.positionCartographic.height).toBeGreaterThanOrEqual( - controller.minimumZoomDistance, + controller.minimumZoomDistance - CesiumMath.EPSILON4, ); }); From 31544b9d71c9455478ac56c2d78bde4c0eeb46c2 Mon Sep 17 00:00:00 2001 From: BraveDream <37433156+HapDragon@users.noreply.github.com> Date: Thu, 2 Jan 2025 16:51:39 +0800 Subject: [PATCH 8/8] Update ScreenSpaceCameraController.js update code according to lint check last time. --- .../engine/Source/Scene/ScreenSpaceCameraController.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/engine/Source/Scene/ScreenSpaceCameraController.js b/packages/engine/Source/Scene/ScreenSpaceCameraController.js index 8f474e46ad30..85b0926c2693 100644 --- a/packages/engine/Source/Scene/ScreenSpaceCameraController.js +++ b/packages/engine/Source/Scene/ScreenSpaceCameraController.js @@ -2914,7 +2914,7 @@ function adjustHeightForTerrain(controller, cameraChanged) { } const camera = scene.camera; - let ellipsoid = defaultValue(scene.ellipsoid, Ellipsoid.WGS84); + const ellipsoid = defaultValue(scene.ellipsoid, Ellipsoid.WGS84); const projection = scene.mapProjection; let transform; @@ -2947,8 +2947,9 @@ function adjustHeightForTerrain(controller, cameraChanged) { camera.position.z * ellipsoid.oneOverRadiiSquared.z, ); - if (percentR > 1 - CesiumMath.EPSILON4) percentR = 1; - else { + if (percentR > 1 - CesiumMath.EPSILON4) { + percentR = 1; + } else { percentRadius.x = ellipsoid.radii.x * percentR; percentRadius.y = ellipsoid.radii.y * percentR; percentRadius.z = ellipsoid.radii.z * percentR;