Bugs or Not: CesiumVoxelMetadata & Cesium3DTilesetVoxel

Hi, everyone,

I’m using UE 5.6 and Cesium for Unreal 2.25.0, with the Cesium3DTiles Voxel sample data:

https://github.com/CesiumGS/cesium/tree/main/Apps/SampleData/Cesium3DTiles/Voxel/

I have two questions regarding 3DTILES_content_voxels and CesiumVoxelMetadata. As I have limited experience with Voxel data, I would like to confirm whether the following two issues are bugs.

1. In the Build Shader section of CesiumVoxelMetadata, I clicked Min, Max and the related plus icons. Related content was generated in the Statistics panel, but both Min and Max display No value. However, the actual tileset.json contains valid values of 0.0 and 1.0. It seems CesiumVoxelMetadata fails to correctly read the min and max values. Is this an expected behavior or a bug?

2. The pivot point of Cesium3DTilesetVoxel is always located at the Earth’s center, no matter how I adjust the Origin of CesiumGeoreference. I have fully reset its transform . This is inconsistent with the performance of standard Cesium3DTileset actors. Could this also be a bug?

Hey @pjiang9,

Thanks for the detailed writeup and screenshots, that really helps. Both of these look like they could be genuine bugs to me rather than expected behavior, but I’m not super familiar with CesiumVoxelMetadata to be sure, I’m going to reach out to the Cesium for Unreal team for insight on this one. Potentially for your first issue you may need to recompile shaders? Or clear shader cache then recompile them?

In the meantime, could you try reproducing this from scratch in Cesium for Unreal Samples? Then post the detailed steps here? This is a great blank slate to start from to parse out any other Project specifics that may potentially be interfering and will help us better to be able to reproduce the issue.

Cheers!

Hi @pjiang9, thanks for trying out our 3D Tiles voxel support!

For the first issue you reported with the min/max values, this is definitely a bug and I confirmed that I can reproduce it. I’ve opened a GitHub issue for this here:

The second issue, though, I can’t seem to reproduce. This is what I see on my screen:

And here is my georeference, if it matters:

But I did change my georeference values to yours, and I saw the origin of the tileset was still offset :thinking: so I’m not sure what’s going on there. Is there something I’m missing?

Thank you,darcyvdd. Thank you, janine.

Regarding the second question, I think I didn’t explain it clearly earlier.

I’ve checked it again now. I scaled down the Cesium3DTilesetVoxel significantly, then adjusted the longitude value of CesiumGeoreference to two different settings: one in the Western Hemisphere and the other in the Eastern Hemisphere . This makes the behavior much easier to observe.

The two screenshots below show the scenario when the CesiumGeoreference longitude is set to West Longitude.

The two screenshots below show the scenario when the CesiumGeoreference longitude is set to East Longitude.

I have two questions:

1. Why is the center of the VoxelBox not located at the geometric center of the box? According to the definition of boundingVolume in tileset.json, its positional center should align with the box’s geometric center, right?

2.From the rendering performance, it seems the positional center of the VoxelBox shifts as the CesiumGeoreference longitude changes?

Hi @pjiang9,

First, an update on `CesiumVoxelMetadata` not picking up statistic values from CesiumJS sample data · Issue #1830 · CesiumGS/cesium-unreal · GitHub – it turned out that the sample data itself was incorrectly specifying the min/max as individual floats. They should have been vec4 values instead. I closed the issue and submitted Fix statistics in sample voxel tilesets by j9liu · Pull Request #13468 · CesiumGS/cesium · GitHub to correct these errors.

Second, I think I understand the confusion and unexpected behavior; I will try to explain:

CesiumGeoreference has two Origin Placement modes, but most oftenly used is Longitude / latitude / height. This option positions the Unreal origin (0, 0, 0) at whatever coordinates you specify. Cesium will load all 3D Tiles relative to that point on Earth. However, this relative positioning all happens “under the hood” – you won’t see it as a user. So you’ll see tilesets move when you change the CesiumGeoreference origin, even if you keep the Unreal location at (0, 0, 0).

This means that the gizmo that appears for the object (the red, green, and blue axes) will always be at the Unreal location, even though the actual geometry may be somewhere else. You can
see this happen for other tilesets too, like the one in 02_CesiumMelbourne:

Before changing CesiumGeoreference origin After

This is more counterintuitive for that voxel tileset because it’s large and positioned at the center of the Earth. If you’d like the transform axes to always be at the tileset’s center, then you should switch the Origin Placement mode to True Origin.

I acknowledge that this is unintuitive, and perhaps there’s a way to better communicate that behavior to users (or even change it!). But does that explanation make sense, at least?

Hi, janine,

Thank you very much for your reply.

Regarding the first issue, CesiumVoxelMetadata can now read the data correctly after the min and max values in tileset.json were changed to arrays.

As for the second question, your detailed explanation — especially the screenshots — helped me understand clearly. Indeed, the gizmos of other Cesium3DTileset Actors also shift along CesiumGeoreference Origin.

Thanks again for your explanation. Have a nice day!