Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 16 additions & 2 deletions packages/engine/Source/Scene/Scene.js
Original file line number Diff line number Diff line change
Expand Up @@ -3831,12 +3831,26 @@ function callAfterRenderFunctions(scene) {
functions.length = 0;
}

/**
* Calculate the height of the globe at the camera position based on the value of {@link ScreenSpaceCameraController.collisionHeightReference},
* or undefined if the height cannot be determined.
*
* @param {Scene} scene
* @returns {number|undefined}
*/
function getGlobeHeight(scene) {
if (scene.mode === SceneMode.MORPHING) {
if (
scene.mode === SceneMode.MORPHING ||
scene._screenSpaceCameraController.collisionHeightReference ===
HeightReference.NONE
) {
return;
}
const cartographic = scene.camera.positionCartographic;
return scene.getHeight(cartographic);
return scene.getHeight(
cartographic,
scene._screenSpaceCameraController.collisionHeightReference,
);
}

function getMaxPrimitiveHeight(primitive, cartographic, scene) {
Expand Down
34 changes: 28 additions & 6 deletions packages/engine/Source/Scene/ScreenSpaceCameraController.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import MapMode2D from "./MapMode2D.js";
import SceneMode from "./SceneMode.js";
import SceneTransforms from "./SceneTransforms.js";
import TweenCollection from "./TweenCollection.js";
import HeightReference from "./HeightReference.js";

/**
* Modifies the camera position and orientation based on mouse input to a canvas.
Expand Down Expand Up @@ -265,13 +266,13 @@ function ScreenSpaceCameraController(scene) {
: ellipsoid.minimumRadius * 1.175;
this._minimumTrackBallHeight = this.minimumTrackBallHeight;
/**
* When disabled, the values of <code>maximumZoomDistance</code> and <code>minimumZoomDistance</code> are ignored.
* Also used in conjunction with {@link Cesium3DTileset#enableCollision} to prevent the camera from moving through or below a 3D Tileset surface.
* This may also affect clamping behavior when using {@link HeightReference.CLAMP_TO_GROUND} on 3D Tiles.
* @type {boolean}
* @default true
* This value controls the height reference for the {@link ScreenSpaceCameraController} collision, which is used to limit the camera minimum and maximum zoom.
* When set to {@link HeightReference.NONE}, the camera can go underground, and the values of <code>maximumZoomDistance</code> and <code>minimumZoomDistance</code> are ignored.
* For all other values, the camera is constrained to be above the terrain and/or 3D Tiles (depending on {@link Cesium3DTileset#enableCollision}).
* @type {HeightReference}
* @default HeightReference.CLAMP_TO_GROUND
*/
this.enableCollisionDetection = true;
this.collisionHeightReference = HeightReference.CLAMP_TO_GROUND;
/**
* The angle, relative to the ellipsoid normal, restricting the maximum amount that the user can tilt the camera. If <code>undefined</code>, the angle of the camera tilt is unrestricted.
* @type {number|undefined}
Expand Down Expand Up @@ -353,6 +354,27 @@ function ScreenSpaceCameraController(scene) {
this._maximumUndergroundPickDistance = 10000.0;
}

Object.defineProperties(ScreenSpaceCameraController.prototype, {
/**
* When disabled, the values of <code>maximumZoomDistance</code> and <code>minimumZoomDistance</code> are ignored.
* Also used in conjunction with {@link Cesium3DTileset#enableCollision} to prevent the camera from moving through or below a 3D Tileset surface.
* This may also affect clamping behavior when using {@link HeightReference.CLAMP_TO_GROUND} on 3D Tiles.
* @type {boolean}
* @default true
* @deprecated Use {@link ScreenSpaceCameraController#collisionHeightReference} instead.
*/
enableCollisionDetection: {
get: function () {
return this.collisionHeightReference !== HeightReference.NONE;
},
set: function (value) {
this.collisionHeightReference = value
? HeightReference.CLAMP_TO_GROUND
: HeightReference.NONE;
},
},
});

function decay(time, coefficient) {
if (time < 0) {
return 0.0;
Expand Down