feat(assets): publish reusable area packages
This commit is contained in:
13
examples/asset-package-resolver.js
Normal file
13
examples/asset-package-resolver.js
Normal file
@@ -0,0 +1,13 @@
|
||||
"use strict";
|
||||
|
||||
function resolveAsset(manifestUrl, manifest, id = "main") {
|
||||
const asset = manifest.assets.find((candidate) => candidate.id === id);
|
||||
if (!asset) throw new Error(`Unknown asset '${id}'`);
|
||||
return new URL(asset.uri, manifestUrl).href;
|
||||
}
|
||||
|
||||
function placement(manifest) {
|
||||
return { ...manifest.placement, coordinateSystem: manifest.coordinateSystem };
|
||||
}
|
||||
|
||||
module.exports = { resolveAsset, placement };
|
||||
20
examples/cesium-asset-package.js
Normal file
20
examples/cesium-asset-package.js
Normal file
@@ -0,0 +1,20 @@
|
||||
"use strict";
|
||||
|
||||
const { resolveAsset, placement } = require("./asset-package-resolver");
|
||||
|
||||
async function loadPackage(viewer, manifestUrl, assetId = "main") {
|
||||
const manifest = await fetch(manifestUrl).then((response) => {
|
||||
if (!response.ok) throw new Error(`Could not load manifest: ${response.status}`);
|
||||
return response.json();
|
||||
});
|
||||
const p = placement(manifest);
|
||||
const origin = Cesium.Cartesian3.fromDegrees(p.longitude, p.latitude, p.height);
|
||||
const enu = Cesium.Transforms.eastNorthUpToFixedFrame(origin);
|
||||
const rotation = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(p.headingCorrectionDegrees));
|
||||
const modelMatrix = Cesium.Matrix4.multiplyByMatrix3(enu, rotation, new Cesium.Matrix4());
|
||||
const model = await Cesium.Model.fromGltfAsync({ url: resolveAsset(manifestUrl, manifest, assetId), modelMatrix });
|
||||
viewer.scene.primitives.add(model);
|
||||
return { manifest, model, placement: p };
|
||||
}
|
||||
|
||||
module.exports = { loadPackage };
|
||||
17
examples/three-asset-package.js
Normal file
17
examples/three-asset-package.js
Normal file
@@ -0,0 +1,17 @@
|
||||
"use strict";
|
||||
|
||||
const { resolveAsset, placement } = require("./asset-package-resolver");
|
||||
|
||||
async function loadPackage(loader, manifestUrl, assetId = "main", handoffEnuPlacement) {
|
||||
const manifest = await fetch(manifestUrl).then((response) => {
|
||||
if (!response.ok) throw new Error(`Could not load manifest: ${response.status}`);
|
||||
return response.json();
|
||||
});
|
||||
const scene = await loader.loadAsync(resolveAsset(manifestUrl, manifest, assetId));
|
||||
// Three.js does not georeference local ENU itself; the embedding host owns it.
|
||||
const enuPlacement = placement(manifest);
|
||||
if (handoffEnuPlacement) handoffEnuPlacement(enuPlacement, scene.scene);
|
||||
return { manifest, scene: scene.scene, placement: enuPlacement };
|
||||
}
|
||||
|
||||
module.exports = { loadPackage };
|
||||
Reference in New Issue
Block a user