Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Clamping to 3D Tiles #6934

Merged
merged 42 commits into from
Sep 28, 2018
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
ab1ed46
pick from ray functions
lilleyse Jul 19, 2018
62d6658
Removed Clamp to Tileset demo
lilleyse Sep 6, 2018
5e133ff
Add development demos
lilleyse Sep 6, 2018
318821f
Add clamp to 3d tiles demo
lilleyse Sep 6, 2018
236c850
Partial updates
lilleyse Sep 10, 2018
3e58014
Fixed sampleHeight to work with entities and updated Sandcastle example
lilleyse Sep 11, 2018
59570f5
Rename
lilleyse Sep 12, 2018
55734c7
Expand on documentation
lilleyse Sep 13, 2018
3001c5b
Organize pick tests into folders
lilleyse Sep 13, 2018
e111e3f
Merge branch 'master' into pick-ray-2
lilleyse Sep 13, 2018
e6688e8
Combine pick and pickPosition from ray functions together. Update doc
lilleyse Sep 15, 2018
653fe19
Tests
lilleyse Sep 15, 2018
3a1566c
Remove sun visibility demo
lilleyse Sep 15, 2018
4e079b7
Add warnings to Sandcastle demos
lilleyse Sep 15, 2018
1e26b8b
Renames in PickSpec
lilleyse Sep 15, 2018
1c98b5d
Merge branch 'translucent-pick-fix' into pick-ray-2
lilleyse Sep 15, 2018
d8490eb
eslint fixes
lilleyse Sep 15, 2018
7c787c7
Add initialTilesLoaded helper and cleanup sandcastle demo
lilleyse Sep 17, 2018
7799cd0
Renamed Ground Clamping to Clamp to Terrain
lilleyse Sep 17, 2018
9a8f03d
Add Clamp to 3D Model demo
lilleyse Sep 17, 2018
ffc35c6
Cleanup updates
lilleyse Sep 17, 2018
9abdbb6
Added test for initialTilesLoaded event
lilleyse Sep 17, 2018
a37ad74
Add label to Clamp to 3D Model demo
lilleyse Sep 17, 2018
9f547b4
Revert ae0a4c15 (uniform splits in 3D orthographic) which seems to be…
lilleyse Sep 17, 2018
7671f71
Added back clamping to the globe and wrote tests for checking the globe
lilleyse Sep 17, 2018
d4f6dae
Update CHANGES.md
lilleyse Sep 17, 2018
6f0b8f9
Merge branch 'master' into pick-ray-2
lilleyse Sep 18, 2018
d57b749
Merge branch 'master' into pick-ray-2
lilleyse Sep 19, 2018
45a77b3
Remove unused useLogDepthDirty
lilleyse Sep 21, 2018
7e54834
Cleanup in prep for offscreen picking
lilleyse Sep 21, 2018
9465e34
Merge branch 'master' into pick-ray-2
lilleyse Sep 25, 2018
faafedf
Add comment about writing translucent depth in pick pass and don't re…
lilleyse Sep 25, 2018
def0ddd
Attempt to fix failing Travis tests
lilleyse Sep 25, 2018
6afb0d0
Fix eslint
lilleyse Sep 26, 2018
59df7ed
Merge branch 'master' into pick-ray-2
lilleyse Sep 26, 2018
e253de6
Move hide/show objects outside of drill pick
lilleyse Sep 26, 2018
9c8c800
Update Sandcastle demo to not trigger infinite loop
lilleyse Sep 26, 2018
8209e29
Expand excludes object test
lilleyse Sep 26, 2018
1cda2e1
Revert "Update Sandcastle demo to not trigger infinite loop"
lilleyse Sep 28, 2018
7da184d
Revert "Move hide/show objects outside of drill pick"
lilleyse Sep 28, 2018
e67aaa4
Merge branch 'master' into pick-ray-2
lilleyse Sep 28, 2018
eaab71c
Add sampleHeightSupported check to demo
lilleyse Sep 28, 2018
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
130 changes: 130 additions & 0 deletions Apps/Sandcastle/gallery/Clamp to 3D Tiles.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
<!DOCTYPE html>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is missing the thumbnail? Perhaps gallery/development/Clamp to Tileset.jpg is in the wrong location?

<html lang="en">
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For Sandcastle examples:

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added Clamp to 3D Model.

Renamed Ground Clamping to Clamp to Terrain. I added a checkbox for fixing any broken links when the next release happens.

<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
<meta name="description" content="Clamp a model to a 3D Tileset using the sampleHeight function.">
<meta name="cesium-sandcastle-labels" content="Showcases">
<title>Cesium Demo</title>
<script type="text/javascript" src="../Sandcastle-header.js"></script>
<script type="text/javascript" src="../../../ThirdParty/requirejs-2.1.20/require.js"></script>
<script type="text/javascript">
if(typeof require === 'function') {
require.config({
baseUrl : '../../../Source',
waitSeconds : 120
});
}
</script>
</head>
<body class="sandcastle-loading" data-sandcastle-bucket="bucket-requirejs.html">
<style>
@import url(../templates/bucket.css);
</style>
<div id="cesiumContainer" class="fullSize"></div>
<div id="loadingOverlay"><h1>Loading...</h1></div>
<div id="toolbar"></div>
<script id="cesium_sandcastle_script">
function startup(Cesium) {
'use strict';
//Sandcastle_Begin
var viewer = new Cesium.Viewer('cesiumContainer', {
terrainProvider : Cesium.createWorldTerrain()
});
var scene = viewer.scene;

var start = Cesium.JulianDate.fromIso8601('2018-07-19T15:18:00Z');
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This example just has so much boilerplate to basically say call scene.clampToHeight.

Can't we do better?

Is it possible to use the Entity API or CZML to define the start/stop of the route then just get a plugin point to call scene.clampToHeight?

Should we also submit a roadmap issue to add clamping support directly to the Entity API and CZML?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be a lot more simplified now. Moved the boilerplate to CZML.

Opened #7044 for Entity and CZML clamping support.

var stop = Cesium.JulianDate.fromIso8601('2018-07-19T15:18:30Z');
var duration = Cesium.JulianDate.secondsDifference(stop, start);

viewer.timeline.zoomTo(start, stop);

var clock = viewer.clock;
clock.startTime = start;
clock.currentTime = start;
clock.stopTime = stop;
clock.multiplier = 5.0;
clock.clockRange = Cesium.ClockRange.LOOP_STOP;

var tileset = viewer.scene.primitives.add(
new Cesium.Cesium3DTileset({
url: Cesium.IonResource.fromAssetId(6074)
})
);

viewer.camera.setView({
destination: new Cesium.Cartesian3(1216403.8845586285, -4736357.493351395, 4081299.715698949),
orientation: new Cesium.HeadingPitchRoll(4.2892217081808806, -0.4799070147502502, 6.279789177843313),
endTransform : Cesium.Matrix4.IDENTITY
});

var startCartographic = Cesium.Cartographic.fromRadians(-1.3194173278580692, 0.6987983245671457, 79.48429974087243);
var stopCartographic = Cesium.Cartographic.fromRadians(-1.319414626509859, 0.6987897506061312, 76.52729244635204);
var startPosition = Cesium.Cartographic.toCartesian(startCartographic);
var endPosition = Cesium.Cartographic.toCartesian(stopCartographic);

var velocity = Cesium.Cartesian3.normalize(Cesium.Cartesian3.subtract(endPosition, startPosition, new Cesium.Cartesian3()), new Cesium.Cartesian3());
var rotationMatrix = Cesium.Transforms.rotationMatrixFromPositionVelocity(startPosition, velocity);
var orientation = Cesium.Quaternion.fromRotationMatrix(rotationMatrix, new Cesium.Quaternion());

var entity = viewer.entities.add({
position : startPosition,
orientation : orientation,
model : {
uri : '../../SampleData/models/CesiumMilkTruck/CesiumMilkTruck.glb'
}
});

function toggleShow(show) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems like this will be done a lot - at least for clamping models where we want to exclude them from the pick - would it be better for scene.sampleHeight to take an optional array of primitives to exclude/hide?

Just don't assume show was true when resetting a primitive that was passed in.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was thinking the same thing and was going to leave a comment about that. Added now.

Will need #7024 to be fixed before entities can be accepted in the array.

// Toggle show for everything except the tileset
var primitives = scene.primitives;
var length = primitives.length;
for (var i = 0; i < length; ++i) {
var primitive = primitives.get(i);
if (primitive !== tileset) {
primitive.show = show;
}
}
}

function calculatePosition(offset) {
var currentPosition = Cesium.Cartesian3.lerp(startPosition, endPosition, offset, new Cesium.Cartesian3());
var currentCartographic = Cesium.Cartographic.fromCartesian(currentPosition);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this line until the end of the function also basically be a helper in the Cesium API, e.g.,

scene.clampToHeight(cartesian);

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added this helper function but I feel like it is kind of trivial and not deserving of a function in Scene. In general it doesn't seem like we have two functions that perform the same task but with cartesian vs. cartographic inputs.

This is what it looks like, what do you think?

    /**
     * Clamps the given Cartesian position to the scene geometry along the geodetic surface normal.
     * May be used to clamp objects to the globe, 3D Tiles, or primitives in the scene.
     * <p>
     * This function only samples height from globe tiles and 3D Tiles that are rendered in the current view. All other
     * primitives are sampled regardless of visibility.
     * </p>
     *
     * @param {Cartesian3} cartesian The Cartesian position.
     * @param {Object[]} primitivesToExclude A list of primitives and/or entities to exclude when clamping.
     * @param {Cartesian3} [result] An optional object to return the clamped position.
     * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if one was not provided.  This may be <code>undefined</code> if there is nothing to clamp to.
     */
    Scene.prototype.clampToHeight = function(cartesian, primitivesToExclude, result) {
        var globe = this.globe;
        var ellipsoid = defined(globe) ? globe.ellipsoid : this.mapProjection.ellipsoid;
        var cartographic = Cartographic.fromCartesian(cartesian, ellipsoid, scratchPickCartographic);
        var height = this.sampleHeight(cartographic, primitivesToExclude);
        if (defined(height)) {
            cartographic.height = height;
            return Cartographic.toCartesian(cartographic, ellipsoid, result);
        }
    };

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems OK to me. It feels trivial to you, but to the end user I think it is separate enough use cases. If we end up with too many functions on Scene, we can evaluate grouping them into a new sub-object or elsewhere.

toggleShow(false);
var height = scene.sampleHeight(currentCartographic);
toggleShow(true);
if (Cesium.defined(height)) {
currentCartographic.height = height;
currentPosition = Cesium.Cartographic.toCartesian(currentCartographic);
return currentPosition;
}
}

function initialViewReady(tileset, callback) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is awkward, does it make does to replace it with a one-line helper on Cesium3DTileset?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added Cesium3DTileset.initialTilesLoaded

var allTilesLoadedFunction = function() {
callback();
tileset.allTilesLoaded.removeEventListener(allTilesLoadedFunction);
};
tileset.allTilesLoaded.addEventListener(allTilesLoadedFunction);
}

initialViewReady(tileset, function() {
viewer.clock.shouldAnimate = true;
scene.postRender.addEventListener(function() {
var timer = Cesium.JulianDate.secondsDifference(viewer.clock.currentTime, start);
var offset = Cesium.Math.clamp(timer / duration, 0.0, 1.0);
entity.position = calculatePosition(offset);
});
});
//Sandcastle_End
Sandcastle.finishedLoading();
}
if (typeof Cesium !== 'undefined') {
startup(Cesium);
} else if (typeof require === 'function') {
require(['Cesium'], startup);
}
</script>
</body>
</html>
154 changes: 0 additions & 154 deletions Apps/Sandcastle/gallery/development/Clamp to Tileset.html

This file was deleted.

Binary file not shown.
Loading