-
Notifications
You must be signed in to change notification settings - Fork 3.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add support for explicit control over model animations
- Loading branch information
markw65
committed
Jan 25, 2021
1 parent
4e931e3
commit dd84add
Showing
6 changed files
with
247 additions
and
39 deletions.
There are no files selected for viewing
Binary file not shown.
172 changes: 172 additions & 0 deletions
172
Apps/Sandcastle/gallery/Manually Controlled Animation.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,172 @@ | ||
<!DOCTYPE html> | ||
<html lang="en"> | ||
<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="Manually control a model's animations." /> | ||
<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="../../../Build/CesiumUnminified/Cesium.js" | ||
nomodule | ||
></script> | ||
<script type="module" src="../load-cesium-es6.js"></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", { | ||
shouldAnimate: true, | ||
}); | ||
|
||
//Make sure viewer is at the desired time. | ||
var start = Cesium.JulianDate.fromDate(new Date(2018, 11, 12, 15)); | ||
var totalSeconds = 30; | ||
var stop = Cesium.JulianDate.addSeconds( | ||
start, | ||
totalSeconds, | ||
new Cesium.JulianDate() | ||
); | ||
viewer.clock.startTime = start.clone(); | ||
viewer.clock.stopTime = stop.clone(); | ||
viewer.clock.currentTime = start.clone(); | ||
viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP; | ||
viewer.timeline.zoomTo(start, stop); | ||
|
||
var wheelRadius = 0.52; //in meters. | ||
var circumference = Math.PI * wheelRadius * 2; | ||
// Create a path for our vehicle by lerping between two positions. | ||
var position = new Cesium.SampledPositionProperty(); | ||
var distance = new Cesium.SampledProperty(Number); | ||
var startPosition = new Cesium.Cartesian3( | ||
-2379556.799372864, | ||
-4665528.205030263, | ||
3628013.106599678 | ||
); | ||
var endPosition = new Cesium.Cartesian3( | ||
-2379603.7074103747, | ||
-4665623.48990283, | ||
3627860.82704567 | ||
); | ||
// A velocity vector property will give us the entity's speed and direction at any given time. | ||
var velocityVectorProperty = new Cesium.VelocityVectorProperty( | ||
position, | ||
false | ||
); | ||
var velocityVector = new Cesium.Cartesian3(); | ||
|
||
var numberOfSamples = 100; | ||
var prevLocation = startPosition; | ||
var totalDistance = 0; | ||
for (var i = 0; i <= numberOfSamples; ++i) { | ||
var factor = i / numberOfSamples; | ||
var time = Cesium.JulianDate.addSeconds( | ||
start, | ||
factor * totalSeconds, | ||
new Cesium.JulianDate() | ||
); | ||
|
||
// Lerp using a non-linear factor so that the vehicle accelerates. | ||
var locationFactor = Math.pow(factor, 2); | ||
var location = Cesium.Cartesian3.lerp( | ||
startPosition, | ||
endPosition, | ||
locationFactor, | ||
new Cesium.Cartesian3() | ||
); | ||
position.addSample(time, location); | ||
distance.addSample( | ||
time, | ||
(totalDistance += Cesium.Cartesian3.distance( | ||
location, | ||
prevLocation | ||
)) | ||
); | ||
prevLocation = location; | ||
} | ||
|
||
function updateSpeedLabel(time, result) { | ||
velocityVectorProperty.getValue(time, velocityVector); | ||
var metersPerSecond = Cesium.Cartesian3.magnitude(velocityVector); | ||
var kmPerHour = Math.round(metersPerSecond * 3.6); | ||
|
||
return kmPerHour + " km/hr"; | ||
} | ||
|
||
// Add our vehicle model. | ||
var vehiclePrimitive = viewer.scene.primitives.add( | ||
Cesium.Model.fromGltf({ | ||
url: "../../SampleData/models/Elliptigo/elliptigo.glb", | ||
cull: false, | ||
}) | ||
); | ||
var vehicleLabel = viewer.entities.add({ | ||
position: position, | ||
orientation: new Cesium.VelocityOrientationProperty(position), // Automatically set the vehicle's orientation to the direction it's facing. | ||
label: { | ||
text: new Cesium.CallbackProperty(updateSpeedLabel, false), | ||
font: "20px sans-serif", | ||
showBackground: true, | ||
distanceDisplayCondition: new Cesium.DistanceDisplayCondition( | ||
0.0, | ||
100.0 | ||
), | ||
eyeOffset: new Cesium.Cartesian3(0, 2.3, 0), | ||
}, | ||
}); | ||
|
||
Cesium.when(vehiclePrimitive.readyPromise).then(function (model) { | ||
model.activeAnimations.addAll({ | ||
loop: Cesium.ModelAnimationLoop.REPEAT, | ||
}); | ||
model.activeAnimations.manualAnimation = true; | ||
var rot = new Cesium.Matrix3(); | ||
viewer.scene.preUpdate.addEventListener(function () { | ||
var time = viewer.clock.currentTime; | ||
var pos = position.getValue(time); | ||
var vel = velocityVectorProperty.getValue(time); | ||
Cesium.Cartesian3.normalize(vel, vel); | ||
Cesium.Transforms.rotationMatrixFromPositionVelocity( | ||
pos, | ||
vel, | ||
viewer.scene.globe.ellipsoid, | ||
rot | ||
); | ||
Cesium.Matrix4.fromRotationTranslation(rot, pos, model.modelMatrix); | ||
var dist = distance.getValue(time); | ||
var animations = model.activeAnimations; | ||
var length = animations.length; | ||
for (var i = 0; i < length; ++i) { | ||
animations.get(i).animationTime = dist; | ||
} | ||
}); | ||
}); | ||
viewer.trackedEntity = vehicleLabel; | ||
vehicleLabel.viewFrom = new Cesium.Cartesian3(-10.0, 7.0, 4.0); | ||
//Sandcastle_End | ||
Sandcastle.finishedLoading(); | ||
} | ||
if (typeof Cesium !== "undefined") { | ||
window.startupCalled = true; | ||
startup(Cesium); | ||
} | ||
</script> | ||
</body> | ||
</html> |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters