Transform Property on Point Clouds

I think this is the right place for this question, even though it’s more about 3D tiles specification rather than Ion the product.

I’m trying to shift a tile of tiles containing only point clouds in the positive Z direction by X meters. I’m generating the tiles myself and manually editing in a transformation matrix on the root tile. The matrix I’m using is the default matrix with X value in the 11th index (should be transpose Z). This doesn’t appear to be working.

I did notice the documentation says “transform does not apply to any volume property when the volume is a region, defined in EPSG:4979 coordinates.”. All my boundaries are defined by world coordinates. But I’m unclear on if this is referring just to the bounding box, or does it mean that transforms won’t work on the content? Changing the other values in the matrix seem to have an effect, though they only really make the points disappear. So maybe I’ve got it all wrong.

Has anyone had success with manually shifting a tile with the transformation array in a similar way?

Hi Marc

Can you reconfirm whether you are uploading this data to Cesium ion, or writing your own pipeline to convert point clouds into 3D Tiles?

Hi, I’m writing my own pipeline. Which is working well, but the translation matrix isn’t working like I expected. I’ve found a way around it on the client, but I’m still curious how that matrix is used in the Cesium tile 3D spec.

You mentioned the transformation matrix of the root tile, and the 11th index being “transpose Z”. Maybe I misunderstood something here, but in order to ~“move stuff 42 meters up”, the transform would be

"transform": [
  1,  0,  0,  0,
  0,  1,  0,  0,
  0,  0,  1,  0,
  0,  0, 42,  1
],

(with the 42 appearing at index 15 instead of 11). The matrix is given in column-major order. This means that the first row in the JSON is actually the first column of the matrix, with the last column - the translation - being 0,0,42 here.

Maybe you already tried that out, leading to the effect …

though they only really make the points disappear.

In this case, it might be that the bounding volume and the actual contents of the object no longer match. Roughly speaking: The viewer thinks that the object is at the floor (because that’s where the bounding volume is), but it is actually 42 meters above the ground. The viewer might then cull away and not render the object, because it thinks that it is not visible. The latter is a wild, handwaving guess for now. But it might be good to try out a small translation first, to alleviate the effect. And maybe create the tileset with the debugShowBoundingVolume flag set

var tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
  debugShowBoundingVolume: true,
...

to see where the viewer assumes the objects to be located.