Time Dynamic Point Clouds using Ion Assets

Hi Cesium Community

I am trying to display a sequence of point clouds using a Time Dynamic Point Cloud.
My goal is to use 3D Tiles (which I previously uploaded as assets – from .las files – to Cesium Ion) as sources for my Time Dynamic Point Cloud. And I would like to load them into my Application using IonResource.fromAssetId().

Unfortunately the examples I saw on the Internet use locally stored .pnts files instead of dynamically requesting the assets to the Cesium REST API and was not able to find any much more detailed documentation on this regard.

My application actually uses Resium but I am also having trouble achieving this within the Cesium Sandbox.

I would be very glad if someone could provide some help or share any similar experience on the matter.
Thanks in advance :slight_smile:

Cheers

Hi

You can use the show/hide functionality of the point cloud and use the time change event functions to trigger which point clouds become visible.

Hi

Thank you for your response.

I tried to implement your solution but unfortunately the animation is not very smooth and one can see quite of a long break in which nothing is shown between one frame and the next one. Do you have any suggestion on how to improve this aspect?

Meanwhile I was also able to load my 3D tile assets directly from Ion via API requests.
But while with this method the animation is smooth, the problem I am facing concerns the orientation of the TimeDynamicPointCloud with respect to the globe’s surface.
The model matrix I am applying performs a simple translation. This matrix works perfectly when applied to a single point but it does not when applied to the TimeDynamicPointCloud (worth noticing is the fact that the points’ coordinates of the source assets are defined in a local/regional reference system). As far as I understood the matrix should be applied on the bounding sphere’s centre of the point cloud, so I do not understand why the matrix is not working as expected on the TimeDynamicPointCloud. Do you have any input on this regard?

Thanks in advance, cheers!

Hi

Do you have any suggestion on how to improve this aspect?

It depends on how you are switching. If you are only using the show/hide functionality, then probably the first instance could take a little bit of time as data needs to be streamed, but after that it should be quick,

I’ll ask one of our engineers to chime in on the transformation matrix question.

Shehzan

Hi @fmonze

The model matrix is applied to the origin of the pnts, not the bounding sphere center.

You can provide a transform for each pnts individually in the intervals property if you don’t want to use the same model matrix for each pnts.

Since your data is in a local reference system you may need to use Transforms.eastNorthUpToFixedFrame (or similar) to compute the matrix. This will include the translation component and rotation component so that the point cloud stays perpendicular with the surface.

I’m also curious how you’re using TimeDynamicPointCloud with tilesets on ion. Are you using the root pnts tiles? Or are we talking about two different approaches here?

Hi Shehzan and Sean

Thank you for your replies.

@Shehzan_Mohammed This approach unfortunately did not suit my requirements so I continued digging in how to correctly load my 3D tile assets from Cesium Ion in the TimeDynamicPointCloud object. And thanks for forwarding the matrix issue.

@sean_lilley Your hints did help me understanding what I was missing to achieve what I wanted. The approach I am following actually uses the pnts files associated with the tilesets and can be described as follows:

  1. Upload a series of point clouds as .las files on Cesium Ion. The points’ coordinates have been preprocessed so that they are provided directly in the cartesian coordinate system used by Cesium (EPSG:4978).
  2. In my Resium application, for each point cloud model I want to render in the animation I set the data of the corresponding TimeInterval as a pair of uri and transform. Here comes the tricky part, uri and transform are obtained from the tileset object that is returned by Cesium API. In particular I am using the uri to root pnts (actually an API call itself returning the pnts file of the zero level) and transform matrix as the multiplication of childTransform (i.e. the matrix associated to root pnts) and rootTransform.

With this approach the model is correctly georeferenced. However, it is not the optimal solution in the long term: since the API calls are performed manually (via Axios), any change to their responses will break my app. Therefore, I would be happy if you could provide an alternative and more stable approach. In which for example the Cesium wrapping functions ( IonResource.fromAssetId()) are used to feed the TimeDynamicPointCloud with data from Ion assets (similar to providing the url to a Cesium3DTileset).

Thanks again for your support.

Cheers
Francesca