Mesh (3D Tiles)
A mesh as one 3D Tiles tileset (a tileset.json with its tiles, or a single .3tz archive), or as OBJ exports that processing tiles into one. Everything must be in the dataset's coordinate system; nothing is reprojected.
A textured mesh (a city model, a photogrammetry scene, a scan of a station) delivered as a 3D Tiles tileset, as Cesium ion, Bentley ContextCapture, Agisoft Metashape and RealityCapture export it, or as OBJ exports, as Pix4D exports it. A tileset is shown as delivered; OBJ exports are tiled into one.
Folder layout#
Either a folder with the tileset in it:
<dataset bucket>/
└── station/ any name, or none
├── tileset.json the root of the tileset
├── subtrees/ implicit tiling, if your exporter writes it
│ └── 0/0/0/0.subtree
└── tiles/
├── 0/0/0/0.glb
└── 1/0/0/0.glb
or one archive:
<dataset bucket>/
└── station.3tz a .3tz with tileset.json at its root
The tileset may sit at the top of the bucket or in a folder of any name and
depth. Its root file must be called tileset.json; files below it,
external child tilesets included, belong to it.
One tileset per dataset. Two tilesets side by side fail the delivery: deliver each as a dataset of its own.
Upload with the file manager, rclone or the aws command line. Some
upload tools put a / in front of every name (a folder with no name);
those files cannot be read, and the delivery fails.
The tileset#
3D Tiles 1.0 and 1.1 are both read, with an explicit tile tree, implicit
tiling, or external child tilesets. Only the root tileset.json is read
during indexing; the tiles are not downloaded.
The tiles must be a mesh: glTF (.glb, .gltf) or Batched 3D Model
(.b3dm). Point clouds (.pnts) belong in a point cloud dataset, and
instanced (.i3dm) and composite (.cmpt) tiles are not shown.
A .3tz is the tileset in one ZIP file, with tileset.json at its root.
It is read in place, by ranged reads, so a large archive is fine and is
quicker to upload than many small tiles. A folder and an archive of the same
tileset are one tileset delivered twice: deliver one of them. A .3tz
inside the tileset's folder fails the delivery.
- The delivery must be one tileset: one
tileset.json(the shallowest one in the bucket; any below it belong to it) or one.3tzarchive. Two tilesets side by side fail the delivery, and so does a delivery whose root file is named anything else, such asscene.json. A tileset folder is packed into one.3tz, which cannot hold another, so a.3tzinside the tileset's folder fails too. A delivery of OBJ exports passes, unless a tileset is delivered beside them: deliver one or the other. - The root
tileset.jsonmust be a 3D Tiles tileset: JSON with anasset.versionand aroottile. In a.3tzit is read from the archive's central directory, so the archive must be a ZIP withtileset.jsonat its root, stored or deflated. A file whose stored name begins with/(an empty folder name, which some upload tools write) is listed but cannot be read, and fails here too. - The root tile's bounding volume must be a
boxor asphere(with the roottransform, if any): its outline in plan is the dataset's footprint. Aregionis longitude and latitude on WGS 84, which places the tileset on the globe, not in the dataset's coordinate system, and fails. - The tileset must lie where the dataset's coordinate reference system is used. Nothing is reprojected, so the root bounding volume's footprint is compared with that CRS's registered area of use, with a 5% margin. A tileset in earth-centred coordinates (a georeferenced export) or in a local frame lies far outside it and fails. A CRS without a registered area of use is not checked.
- Every tile content the root
tileset.jsonnames must be a mesh: glTF (.gltf,.glb) or Batched 3D Model (.b3dm), or an external tileset (.json). Point clouds (.pnts), instanced models (.i3dm) and composite tiles (.cmpt) are not shown and fail. Only the root file is read: content named in external tilesets is not checked. - Every OBJ export must hold the files its OBJs name. An export is a folder holding
.objfiles, loose or in a.zip(stored or deflated). Eachmtlliban OBJ names must be in the export, and so must each texture (map_Kd) those MTL files name, as JPEG, PNG or TIFF. An export has at most one offset file (*_offset.xyz, three numbers: x y z). A.zipthat cannot be read, or holds no.obj, fails too: a.zipin a mesh delivery is read for OBJ exports only. - Each OBJ export must lie where the dataset's coordinate reference system is used. Its place is its offset (the
*_offset.xyz, if any) plus its first OBJ's first vertex, compared with that CRS's registered area of use, with a 5% margin. Nothing is reprojected: an export in a local frame or in another CRS lies far outside and fails. A CRS without a registered area of use is not checked.
OBJ exports#
Instead of a tileset, deliver the textured mesh as OBJ, the way Pix4D and most photogrammetry software export it. Processing turns it into one tileset with coarser levels for viewing from a distance.
<dataset bucket>/
├── Enl-3d_mesh_obj.zip an export in a .zip (files at its top or in a folder)
└── Enl_2/ or an export as a folder
├── Enl_2_mesh_0.obj
├── Enl_2_mesh_0.mtl
├── Enl_2_mesh_0.jpg
├── …
└── Enl_2_offset.xyz the offset, if your software writes one
- An export is a folder holding
.objfiles, with the.mtlfiles they name and the textures those name (JPEG, PNG or TIFF), in that folder or below it. A.zipholds one export or more; its files may be stored or deflated. A.zipis only read for OBJ exports. - Coordinates are the dataset's CRS, in metres, with z up (the third
coordinate is the height). Pix4D writes them relative to an offset, in
*_offset.xyz: at most one per export. Without one, the vertices are the CRS's coordinates themselves. - Several exports become one tileset. Exports that overlap are drawn over each other, so deliver an area once.
- A tileset beside OBJ exports fails the delivery: deliver one or the other.
Coordinate reference system#
Nothing is reprojected. The tileset's coordinates, after its root
transform, or an OBJ export's, after its offset, must be in the dataset's
coordinate system, heights included.
In Cesium ion that is a tileset that is not georeferenced; in
ContextCapture and Metashape, export in the dataset's CRS (for the
Netherlands, RD New with NAP heights) rather than in "ECEF" or "WGS 84".
The root tile's bounding volume must be a box or a sphere. Its outline
in plan is the dataset's footprint, and it must lie where the dataset's CRS
is used. A tileset in earth-centred coordinates lies thousands of
kilometres away and fails. See Coordinates.
Ingest parameters#
None.
What you get back#
A tileset folder becomes one archive. Processing packs it into
tileset.3tz, next to its tileset.json, reads the archive back, and then
deletes the loose files: afterwards the dataset holds that one file (and
any hand-over documents). Nothing is lost: a .3tz is a ZIP file of exactly
the files you delivered, which any unzip tool opens. A delivered .3tz is
kept as it is. Viewers read the archive directly, and an export copies it as
one file.
OBJ exports become a tileset, tileset.3tz at the top of the bucket:
every export in one tileset, its finest tiles at the exports' own detail
and texture resolution, and coarser levels above them, simplified and with
textures made anew, so the whole mesh can be seen from a distance. The OBJ
files stay in the bucket: the tiles are made from them, not a copy of them.
One indexed tileset, in a set named mesh, with the footprint of its root
bounding volume as the dataset's coverage.
A tileset carries no capture dates. Enter the acquisition period when you submit the delivery, or at checkup; the dataset cannot be accepted without it.
Re-running is safe — see Re-running is safe.
Common failures#
| Symptom | Cause |
|---|---|
| "no tileset.json or .3tz archive" | The root file has another name, such as scene.json |
| "the delivery holds 2 tilesets" | Two tilesets side by side; deliver them as two datasets |
| "sits beside …; the tileset is packed into one .3tz" | A .3tz inside the tileset's folder; deliver the folder or the archive, not both |
| "is listed but cannot be read" | The files were uploaded with a / in front of their names |
"its root bounding volume is a region" | The tileset was exported on the globe (WGS 84) |
| "far outside where EPSG:… is used" | The tileset is in earth-centred (ECEF) or local coordinates |
| "which a mesh dataset does not show" | The tileset holds .pnts, .i3dm or .cmpt tiles |
| "names …, which is not in the export" | An OBJ's .mtl or an MTL's texture was not uploaded, or has another name |
| "holds no OBJ export" | A .zip in the delivery holds no .obj files |
| "the delivery holds OBJ exports and a tileset" | Both were delivered; deliver one |
| "(its offset plus its first vertex), far outside" | The OBJ export is in another CRS or a local frame |