.json specifications and transforms for local coordinates .glb files

Hello,
currently I am working in a project and we have a 3D tiles folder with the following structure:
-point_cloud.glb
-mesh.glb
-tileset.json
Both .glb are in local coordinates. This is the structure for the .json:

  "asset": {
    "version": "1.1",
    "gltfUpAxis": "Z"
  },
  "extensionsUsed": [
    "3DTILES_content_gltf"
  ],
  "extensionsRequired": [
    "3DTILES_content_gltf"
  ],
  "extensions": {
    "3DTILES_content_gltf": {
      "extensionsUsed": [
        "EXT_mesh_gpu_instancing"
      ],
      "extensionsRequired": [
        "EXT_mesh_gpu_instancing"
      ]
    }
  },
  "geometricError": 500,
  "root": {
    "transform": [
      -0.0024255601192654866,
      0.4704315092866371,
      -0.8824331769195927,
      3514762.032026145,
      0.0001528101500689789,
      0.882435936822733,
      0.47043256057892546,
      785418.0209607437,
      -0.9999970466492221,
      -0.0010062177115532371,
      0.0022122881256951277,
      5246387.90004111,
      0.0,
      0.0,
      0.0,
      1.0
    ],
    "boundingVolume": {
      "region": [
        0.21976341858586895,
        0.9722567711180549,
        0.2199379515110684,
        0.9724313040432544,
        -58.61334183625877,
        41.38665816374123
      ]
    },
    "geometricError": 500,
    "refine": "ADD",
    "children": [
      {
        "boundingVolume": {
          "box": [
            0,
            0,
            0,
            50,
            0,
            0,
            0,
            50,
            0,
            0,
            0,
            50
          ]
        },
        "geometricError": 50,
        "content": {
          "uri": "3D_Tiles/mesh.glb"
        }
      },
      {
        "boundingVolume": {
          "box": [
            0,
            0,
            0,
            100,
            0,
            0,
            0,
            100,
            0,
            0,
            0,
            100
          ]
        },
        "geometricError": 50,
        "content": {
          "uri": "3D_Tiles/point_cloud.glb"
        }
      }
    ]
  }
}

where transform is the transformation matrix that rotates the points so that they are in a right handed Z-up axis, also the translation in the transform is in WSG84 EPSG:4978; and the region for the boundingVolume is in EPSG:4979 in radians.
When I try to visualize the 3DTiles folder containing this 3 files in Cesium, I only can see the boundingVolume region(is making it right) but then I can not see neither the point_cloud.glb nor the mesh.glb.
Am I doing something wrong/missing something in the .json structure?
Or is it something related with the transformations or the frames?
Thank you so much in advance.

That way of specifying the extension that are used/required in the glTF are not part of the standard, although this approach was considered e.g. in Top-level information about tile content · Issue #701 · CesiumGS/3d-tiles · GitHub. But this should not be relevant here.

The gltfUpAxis is also not part of the specification. This might already affect the behavior here. But given that the gltfUpAxis was only part of a draft (!) version of 3D Tiles 1.0 (!), I’m not fully up to date how this is handled nowadays, in CesiumJS, and when it appears in a 3D Tiles 1.1 (!) data set.

And (most importantly), when looking at the transform: It looks like you inserted this in row-major form. It should be in column-major form. This usually means that these large values (like 3514762.0...) that describe the translation appear at the places that currently contain 0.0

If you can share the full tileset as a ZIP (i.e. if it is not too large, and does not contain proprietary data), then this might be easier to analyze. But maybe the points that I mentioned can already help to resolve the issue.

Hello,
thank you for the feedback. I tried again after applying this changes but still I can´t see the point cloud or the mesh.
I attach the .zip, hope it helps.
3D_Tiles.zip (3.2 MB)

When you try to load this tileset in a viewer, you’ll notice some console messages like these:

A 3D tile failed to load: http://localhost:8003/3D_Tiles/point_cloud.glb
Error: Request has failed. Status Code: 404
undefined
A 3D tile failed to load: http://localhost:8003/3D_Tiles/mesh.glb
Error: Request has failed. Status Code: 404
undefined

The reason for that is that the tileset.json and the GLB files are in the same directory. But the tileset.json refers to these files as

        "content": {
          "uri": "3D_Tiles/mesh.glb"
        }
...
        "content": {
          "uri": "3D_Tiles/point_cloud.glb"
        }

Note the "3D_Tiles/" part. This means these files should be located in a subdirectory. Either move these files into such a subdirectory, or change the URLs to remove the "3D_Tiles/" part.


With this change, you should at least see the point cloud:

You will not see the mesh, however. The reason for that can be seen when dragging-and-dropping the mesh.glb into https://gltf.report/ and looking at the ‘Metadata’:

Cesium Forum 36986

(Yes, I intentionally captured the flickering and jittering of the rendered mesh here).

The bounding box of the mesh indicates that the geometry data itself is located at ~“a certain position on the globe”. But the root tile transform additionally translates it by 3514762.0, 785418.2, 5246387.86, meaning that this object ends up … somewhere in outer space.

Depending on how that mesh.glb was created, you should try to create it in a way so that its bounding box is closer to the origin - similar to the bounding box of the point cloud:

Theoretically, you could adjust the structure of the tileset.json and the transform information to make it visible without modifying the GLB. But as you can see in the screen capture above: The huge values will cause the geometry to flicker and jitter when it is rendered, so that won’t be a viable solution here…

Amazing, I will try to make it work for the mesh.glb metadata.
Thank you much for the feedback, the rest seems to work perfectly.
Best regards,
Javier