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

Initial support for AGI_articulations #7835

Merged
merged 12 commits into from
May 30, 2019
2 changes: 1 addition & 1 deletion Apps/Sandcastle/CesiumSandcastle.css
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ html, body {
height: 100%;
transition-property: transform;
transition-duration: 0.5s;
transform-origin: 200px 150px;
transform-origin: 200px 152px; /* These numbers should be divisible by 4 because of scaling in .makeThumbnail */
}

.makeThumbnail {
Expand Down
152 changes: 152 additions & 0 deletions Apps/Sandcastle/gallery/development/3D Models Articulations.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
<!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="Explore node transformations of 3D models.">
<meta name="cesium-sandcastle-labels" content="Development">
<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);
#toolbar {
background: rgba(42, 42, 42, 0.8);
padding: 4px;
border-radius: 4px;
}
#toolbar input {
vertical-align: middle;
padding-top: 2px;
padding-bottom: 2px;
}
</style>
<div id="cesiumContainer" class="fullSize"></div>
<div id="loadingOverlay"><h1>Loading...</h1></div>
<div id="toolbar">
<div>Articulation:
<select class="cesium-button" data-bind="options: articulations,
optionsText: 'name',
value: selectedArticulation"></select>
</div>
<table>
<tbody data-bind="foreach: stages">
<tr>
<td data-bind="text: name"></td>
<td>
<input type="range" min="-3" max="3" step="0.01" data-bind="value: current,
valueUpdate: 'input',
attr: {
min: minimum,
max: maximum
}">
<input type="text" size="2" data-bind="value: currentText">
</td>
</tr>
</tbody>
</table>
</div>
<script id="cesium_sandcastle_script">
function startup(Cesium) {
'use strict';
//Sandcastle_Begin
// this can be changed to any glTF model
var modelUrl = 'https://assets.agi.com/models/launchvehicle.glb';

var viewModel = {
articulations: [],
stages: [],
selectedArticulation: undefined
};

Cesium.knockout.track(viewModel);

Cesium.knockout.getObservable(viewModel, 'selectedArticulation').subscribe(function(newArticulation) {
viewModel.stages = newArticulation.stages;
});

var toolbar = document.getElementById('toolbar');
Cesium.knockout.applyBindings(viewModel, toolbar);

var viewer = new Cesium.Viewer('cesiumContainer');
var scene = viewer.scene;

var height = 220000.0;
var origin = Cesium.Cartesian3.fromDegrees(-74.693, 28.243, height);
var modelMatrix = Cesium.Transforms.headingPitchRollToFixedFrame(origin, new Cesium.HeadingPitchRoll());

var model = scene.primitives.add(Cesium.Model.fromGltf({
url : modelUrl,
modelMatrix : modelMatrix,
minimumPixelSize : 128
}));

model.readyPromise.then(function(model) {
var camera = viewer.camera;

// Zoom to model
var controller = scene.screenSpaceCameraController;
var r = 2.0 * Math.max(model.boundingSphere.radius, camera.frustum.near);
controller.minimumZoomDistance = r * 0.2;

var center = Cesium.Matrix4.multiplyByPoint(model.modelMatrix, Cesium.Cartesian3.ZERO, new Cesium.Cartesian3());
var heading = Cesium.Math.toRadians(0.0);
var pitch = Cesium.Math.toRadians(-10.0);
camera.lookAt(center, new Cesium.HeadingPitchRange(heading, pitch, r * 0.8));

viewModel.articulations = Object.keys(model._runtime.articulationsByName).map(function(articulationName) {
shunter marked this conversation as resolved.
Show resolved Hide resolved
return {
name: articulationName,
stages: model._runtime.articulationsByName[articulationName].stages.map(function(stage) {
var stageModel = {
name: stage.name,
minimum: stage.minimumValue,
maximum: stage.maximumValue,
current: stage.currentValue
};
Cesium.knockout.track(stageModel);
Cesium.knockout.defineProperty(stageModel, 'currentText', {
get: function() {
return stageModel.current.toString();
},
set: function(value) {
// coerce values to number
stageModel.current = +value;
}
});
Cesium.knockout.getObservable(stageModel, 'current').subscribe(function(newValue) {
model.setArticulationStage(articulationName + ' ' + stage.name, +stageModel.current);
model.applyArticulations();
});
return stageModel;
})
};
});
viewModel.selectedArticulation = viewModel.articulations[0];

}).otherwise(function(error){
console.error(error);
});

//Sandcastle_End
Sandcastle.finishedLoading();
}
if (typeof Cesium !== 'undefined') {
startup(Cesium);
} else if (typeof require === 'function') {
require(['Cesium'], startup);
}
</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.
1 change: 1 addition & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ Change Log
* Added syntax to delete data from existing properties via CZML. [#7818](https://github.com/AnalyticalGraphicsInc/cesium/pull/7818)
* Added `checkerboard` material to CZML. [#7845](https://github.com/AnalyticalGraphicsInc/cesium/pull/7845)
* `BingMapsImageryProvider` now uses `DiscardEmptyTileImagePolicy` by default to detect missing tiles as zero-length responses instead of inspecting pixel values. [#7810](https://github.com/AnalyticalGraphicsInc/cesium/pull/7810)
* Added support for the [AGI_articulations](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/AGI_articulations) vendor extension of glTF 2.0 to the Model primitive graphics API. [#7835](https://github.com/AnalyticalGraphicsInc/cesium/pull/7835)
* Reduce the number of Bing transactions and ion Bing sessions used when destroying and recreating the same imagery layer to 1. [#7848](https://github.com/AnalyticalGraphicsInc/cesium/pull/7848)

##### Fixes :wrench:
Expand Down
10 changes: 1 addition & 9 deletions Source/DataSources/ModelVisualizer.js
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,6 @@ define([
url : resource.url,
animationsRunning : false,
nodeTransformationsScratch : {},
originalNodeMatrixHash : {},
emackey marked this conversation as resolved.
Show resolved Hide resolved
loadFail : false
};
modelHash[entity.id] = modelData;
Expand Down Expand Up @@ -179,7 +178,6 @@ define([
// Apply node transformations
var nodeTransformations = Property.getValueOrUndefined(modelGraphics._nodeTransformations, time, modelData.nodeTransformationsScratch);
if (defined(nodeTransformations)) {
var originalNodeMatrixHash = modelData.originalNodeMatrixHash;
var nodeNames = Object.keys(nodeTransformations);
for (var nodeIndex = 0, nodeLength = nodeNames.length; nodeIndex < nodeLength; ++nodeIndex) {
var nodeName = nodeNames[nodeIndex];
Expand All @@ -194,14 +192,8 @@ define([
continue;
}

var originalNodeMatrix = originalNodeMatrixHash[nodeName];
if (!defined(originalNodeMatrix)) {
originalNodeMatrix = modelNode.matrix.clone();
originalNodeMatrixHash[nodeName] = originalNodeMatrix;
}

var transformationMatrix = Matrix4.fromTranslationRotationScale(nodeTransformation, nodeMatrixScratch);
modelNode.matrix = Matrix4.multiply(originalNodeMatrix, transformationMatrix, transformationMatrix);
modelNode.matrix = Matrix4.multiply(modelNode.originalMatrix, transformationMatrix, transformationMatrix);
}
}
}
Expand Down
Loading