CesiumGS / CesiumGS/cesium

Make it trivial to relocate a Cesium3DTileset

Open
#6,394 12 comments 0 reactions 0 assignees View on GitHub
category - 3d tiles type - enhancement
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.