Make it trivial to relocate a Cesium3DTileset
- Dominant language
- JavaScript
- Stars
- 15.7k
- Forks
- 3.9k
- Avg merge
- 4d 6h
- Merged PRs (30d)
- 34
Description
Right now, you need to jump through a bunch of hoops to relocate an already geolocated tileset. We should be able to turn this into a one-liner, something like `tileset.setPositionHeadingPitchRoll`
Here's an example of what I had to do today to move a tileset. Do we have an easier way that I'm already missing? CC @lilleyse @likangning93
```js
var setCartoScratch = new Cesium.Cartesian3();
var setCartoPosScratch = new Cesium.Cartesian3();
var setCartoTransformScratch = new Cesium.Matrix4();
function setWorldPositionFromCartographic(transform, positionCartographic) {
var oldPositionCartesian = Cesium.Matrix4.multiplyByPoint(transform, Cesium.Cartesian3.ZERO, setCartoScratch);
var newPositionCartesian = Cesium.Ellipsoid.WGS84.cartographicToCartesian(positionCartographic, setCartoPosScratch);
newPositionCartesian = Cesium.Cartesian3.subtract(newPositionCartesian, oldPositionCartesian, newPositionCartesian);
var translationMatrix = Cesium.Matrix4.fromTranslation(newPositionCartesian, setCartoTransformScratch);
return Cesium.Matrix4.multiply(translationMatrix, transform, transform);
}
var setHprQuaternion = new Cesium.Quaternion();
var setHprQuaternion2 = new Cesium.Quaternion();
var setHprTranslation = new Cesium.Cartesian3();
var setHprScale = new Cesium.Cartesian3();
var setHprCenter = new Cesium.Cartesian3();
var setHprTransform = new Cesium.Matrix4();
var setHprRotation = new Cesium.Matrix3();
function setRotationFromHeadingPitchRoll(transform, headingPitchRoll) {
var rotationQuaternion = Cesium.Quaternion.fromHeadingPitchRoll(headingPitchRoll, setHprQuaternion);
var translation = Cesium.Matrix4.getTranslation(transform, setHprTranslation);
var scale = Cesium.Matrix4.getScale(transform, setHprScale);
var center = Cesium.Matrix4.multiplyByPoint(transform, Cesium.Cartesian3.ZERO, setHprCenter);
var backTransform = Cesium.Transforms.eastNorthUpToFixedFrame(center, undefined, setHprTransform);
var rotationFixed = Cesium.Matrix4.getRotation(backTransform, setHprRotation);
var quaternionFixed = Cesium.Quaternion.fromRotationMatrix(rotationFixed, setHprQuaternion2);
var rotation = Cesium.Quaternion.multiply(quaternionFixed, rotationQuaternion, rotationFixed);
return Cesium.Matrix4.fromTranslationQuaternionRotationScale(translation, rotation, scale, transform);
}
tileset.readyPromise.then(function(tileset) {
var offset = Cesium.Cartographic.fromDegrees(-76.0, 40.0, 40);
tileset._root.transform = setWorldPositionFromCartographic(tileset._root.transform, offset);
var hpr = Cesium.HeadingPitchRoll.fromDegrees(0,0,0);
tileset._root.transform = setRotationFromHeadingPitchRoll(tileset._root.transform, hpr);
viewer.scene.primitives.add(tileset);
viewer.zoomTo(tileset, new Cesium.HeadingPitchRange(0.0, -0.5, tileset.boundingSphere.radius * 2.0));
}).otherwise(function(error) {
console.log(error);
});
```
Contributor guide
Research direction
Start with the Cesium3DTileset API and the tileset._root.transform usage shown in the issue. Review how position and heading-pitch-roll transforms are currently applied, then define and validate a public one-line relocation interface that covers the requested placement behavior.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- javascript
- Domain
- computer-graphics
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 25/100