Problem with instanced tilesets

A recent update to the Cesium plugin for Unreal (5.3) seems to have introduced a problem with instanced tilesets.

Included are two screenshots of the logs for when I tried to load the Rotterdam tree set, but similar sets that used to work fine in UE show the same problem.

You can also see they’re still working fine in our Cesium viewer. These are many tilesets that include trees, light posts, benches, bicycle storage, waste bins, etc, that we can no longer access in UE.

https://www.3drotterdam.nl/datasource-data/b9294d5b-79e0-4744-ac88-b61e3e90d5bc/tileset.json


Only some results of a quick investigation, as (hopefully helpful) pointers for those who might investigate this in detail:

The message is emitted at cesium-native/Cesium3DTilesContent/src/BatchTableToGltfStructuralMetadata.cpp at 688904b3e2f9b459759cf4fab7f3d5b84b4829bc · CesiumGS/cesium-native · GitHub

It is emitted because it cannot create a BatchIdSemantic object that is properly initialized (with a valid byteLength). The reason for that seems to be (from skimming over it) that it tries to access the componentType property in the feature table, and bails out if it doesn’t find it.

Indeed, the feature table of one if the I3DMs that is contained in that CMPT is shown here:

{
  "INSTANCES_LENGTH" : 22,
  "QUANTIZED_VOLUME_OFFSET" : [
    3925159.0,
    312556.0,
    5000477.0
  ],
  "QUANTIZED_VOLUME_SCALE" : [
    347.0,
    667.0,
    236.0
  ],
  "POSITION_QUANTIZED" : {
    "byteOffset" : 0
  },
  "SCALE_NON_UNIFORM" : {
    "byteOffset" : 132
  },
  "NORMAL_UP" : {
    "byteOffset" : 396
  },
  "NORMAL_RIGHT" : {
    "byteOffset" : 660
  },
  "BATCH_ID" : {
    "byteOffset" : 924
  }
}

The BATCH_ID does not have a componentType. Based on the I3DM specification, the componentType is optional and should default to uint16.


So I think that this is indeed a bug (but it’s not exactly clear where and when this was introduced)

1 Like

Thanks for looking into it, if it turns out we need to change something in our tiles I’d love to hear that as well of course.

From my current understanding, the tiles should be valid, and I suspect that this is a bug.

(Not sure who is familiar enough with the code to confirm that - maybe @Timothy_Moore ?)

In doubt, I’ll open an issue with a link to this thread, just to keep track of it.

@Marco13 thanks for the diagnosis; I will take a further look.

@Marco13 I want to confirm that the default BATCH_ID componentType is uint16? That’s how I interpret Table 2 at 3d-tiles/specification/TileFormats/Instanced3DModel/README.adoc at main · CesiumGS/3d-tiles · GitHub

You’re right, that should have been uint16 (I’ll fix it in the post as well)

I’ve opened i3dm BATCH_ID parsing does not use default component type · Issue #1201 · CesiumGS/cesium-native · GitHub to track this bug. Thanks for the good sample data set!

Thank you, and let us know if there’s anything else we can provide.

This problem is addressed by Fix problem parsing i3dm BATCH_ID by timoore · Pull Request #1205 · CesiumGS/cesium-native · GitHub , which will be included in the next release of Cesium Native and Cesium for Unreal.

2 Likes

Excellent!

Unfortunately the problem seems to persist with the latest update from Cesium. I am using v2.16.1 and UE 5.3.2.

I have tried different tilesets, here’s one for our trees:
https://www.3drotterdam.nl/datasource-data/b9294d5b-79e0-4744-ac88-b61e3e90d5bc/tileset.json

Here’s part of the log:

[2025.07.08-10.08.22:221][531]LogCesium: Loading tileset from URL
[2025.07.08-10.08.22:221][531]LogCesium: Loading tileset from URL done
[2025.07.08-10.08.26:929][737]LogCesium: Warning: “Enable World Bounds Checks” in the world settings is currently enabled. Please consider disabling it to avoid potential issues.
[2025.07.08-10.08.26:929][737]LogCesium: Loading tileset from URL https://www.3drotterdam.nl/datasource-data/b9294d5b-79e0-4744-ac88-b61e3e90d5bc/tileset.json
[2025.07.08-10.08.26:929][737]LogCesium: Loading tileset from URL https://www.3drotterdam.nl/datasource-data/b9294d5b-79e0-4744-ac88-b61e3e90d5bc/tileset.json done
[2025.07.08-10.08.27:244][748]LogCesium: Error: [2025-07-08 12:08:27.245] [error] [ErrorList.h:89] Failed to load https://www.3drotterdam.nl/datasource-data/b9294d5b-79e0-4744-ac88-b61e3e90d5bc/13/8399/1734.cmpt:

  • Invalid Batch ID Semantic
  • Invalid Batch ID Semantic
  • Invalid Batch ID Semantic
  • Invalid Batch ID Semantic

[2025.07.08-10.08.27:246][748]LogCesium: Error: [2025-07-08 12:08:27.246] [error] [ErrorList.h:89] Failed to load https://www.3drotterdam.nl/datasource-data/b9294d5b-79e0-4744-ac88-b61e3e90d5bc/13/8396/1734.cmpt:

  • Invalid Batch ID Semantic
  • Invalid Batch ID Semantic
  • Invalid Batch ID Semantic
  • Invalid Batch ID Semantic

…etcera etcetera, but also sometimes:

[2025.07.08-10.08.27:587][761]LogCesium: Warning: [2025-07-08 12:08:27.587] [warning] [ErrorList.h:108] Warning when loading https://www.3drotterdam.nl/datasource-data/b9294d5b-79e0-4744-ac88-b61e3e90d5bc/15/33597/6924.cmpt:

  • Matrix decompose failed. Default identity values copied to instance buffer.

This seems to be the data set for which the issue was originally reported. @Timothy_Moore Did you have a chance to try out this data set? I’ve seen that there is test data in the PR, but maybe the data set contains something else that is throwing off the batch ID parsing, in addition to the missing data type. From skimming over the PR, it looks like the error is caused by byteSize==0, which could also be caused by numElements == 0, but I haven’t looked into the details yet.

I did test with the dataset, though not in the released version of Cesium for Unreal. I will investigate.

[2025.07.08-10.08.27:587][761]LogCesium: Warning: [2025-07-08 12:08:27.587] [warning] [ErrorList.h:108] Warning when loading https://www.3drotterdam.nl/datasource-data/b9294d5b-79e0-4744-ac88-b61e3e90d5bc/15/33597/6924.cmpt:

  • Matrix decompose failed. Default identity values copied to instance buffer.

Some of the instance scale factors contain zeros in this dataset. In our Native integrations (Unreal, Unity, Omniverse and various 3rd party), i3dm instances are translated to glTF models that use the EXT_mesh_gpu_instancing extension. This process involves creating matrices from the source data, doing some manipulation, and then extracting translation, rotation and scale; if the matrices become singular, then these errors are produced.

The fix is in Cesium Native v.0.49.0, which is included in Cesium for Unreal v2.17.0.

Hey @Jorri, just an FYI that we’re dropping support for UE 5.3 because Fab only lets us publish the plugin for at most 3 versions of Unreal. However, for v2.17.0, we did release binaries for 5.3 on Github. You’ll just have to manually copy them into the folder of your Unreal Engine install, e.g., C:\Program Files\Epic Games\UE_5.3\Engine\Plugins\Marketplace.

Thanks for your swift replies, I can confirm that worked!

Is there an update for the fab page in the works? I’m not always the brightest but there might be more who make the same mistake.

Whoops, that text is definitely outdated. I just submitted an update and it should be published once approved by the Fab team. Thanks for bringing it to our attention!

1 Like