# Is there any documentation for tiling 3DGS (.ply) files?

**URL:** <https://community.cesium.com/t/is-there-any-documentation-for-tiling-3dgs-ply-files/45654>\
**Category:** Cesium ion\
**Created:** [March 25, 2026, 12:31pm UTC](https://community.cesium.com/t/is-there-any-documentation-for-tiling-3dgs-ply-files/45654 "2026-03-25T12:31:11Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![will\_riddy](https://sea2.discourse-cdn.com/cesium/user_avatar/community.cesium.com/will_riddy/32/28173_2.png) [@will\_riddy](https://community.cesium.com/u/will_riddy)\
**Post date:** [March 25, 2026, 12:31pm UTC](https://community.cesium.com/t/is-there-any-documentation-for-tiling-3dgs-ply-files/45654/1 "2026-03-25T12:31:11Z")

</div>

Hi,

I haven’t had much success with tiling 3DGS .ply files.

Is there any documentation about the structure a .ply file needs to follow to be successfully tiled?

Thanks in advance.

---

<div class="post-metadata">

**Author:** ![Marco13](https://sea2.discourse-cdn.com/cesium/user_avatar/community.cesium.com/marco13/32/2757_2.png) [@Marco13](https://community.cesium.com/u/Marco13)\
**Post date:** [March 25, 2026, 1:21pm UTC](https://community.cesium.com/t/is-there-any-documentation-for-tiling-3dgs-ply-files/45654/2 "2026-03-25T13:21:32Z")

</div>

I think that there is no “official” documentation for that - at least, not on this low technical level. One problem is that the concept of “splat PLY files” is underspecified. The PLY format _itself_ is specified clearly. But a PLY file can literally contain _anything_.

However, there is a “de-facto” standard of what constitutes a “splat PLY file”. This happened “by chance”, derived from some research paper that made splats popular. Most of the common splat-generation tools do export splats in PLY files with this format. And this format should have a header like this one:

```auto
ply
format binary_little_endian 1.0
element vertex 9
property float x
property float y
property float z
property float opacity
property float scale_0
property float scale_1
property float scale_2
property float rot_0
property float rot_1
property float rot_2
property float rot_3
property float f_dc_0
property float f_dc_1
property float f_dc_2
property float f_rest_0
property float f_rest_1
property float f_rest_2
property float f_rest_3
property float f_rest_4
property float f_rest_5
property float f_rest_6
property float f_rest_7
property float f_rest_8
property float f_rest_9
property float f_rest_10
property float f_rest_11
property float f_rest_12
property float f_rest_13
property float f_rest_14
property float f_rest_15
property float f_rest_16
property float f_rest_17
property float f_rest_18
property float f_rest_19
property float f_rest_20
property float f_rest_21
property float f_rest_22
property float f_rest_23
property float f_rest_24
property float f_rest_25
property float f_rest_26
property float f_rest_27
property float f_rest_28
property float f_rest_29
property float f_rest_30
property float f_rest_31
property float f_rest_32
property float f_rest_33
property float f_rest_34
property float f_rest_35
property float f_rest_36
property float f_rest_37
property float f_rest_38
property float f_rest_39
property float f_rest_40
property float f_rest_41
property float f_rest_42
property float f_rest_43
property float f_rest_44
end_header

```

(The order of the properties does not matter. The `f_rest_<n>` properties are optional)

If you encounter any issues when tiling such a PLY file, then it could be good to describe the error more specifically, if possible. I know, it won’t tell you more than “Something went wrong”, unfortunately. So maybe when you post the ‘asset ID’ of the asset where the tiling processed failed, someone can have a closer look.

---

<div class="post-metadata">

**Author:** ![will\_riddy](https://sea2.discourse-cdn.com/cesium/user_avatar/community.cesium.com/will_riddy/32/28173_2.png) [@will\_riddy](https://community.cesium.com/u/will_riddy)\
**Post date:** [March 25, 2026, 2:23pm UTC](https://community.cesium.com/t/is-there-any-documentation-for-tiling-3dgs-ply-files/45654/3 "2026-03-25T14:23:51Z")

</div>

Thanks @Marco13 🙂 that’s really useful.

Do you also know if there will be native support for .spz files within Ion?

---

<div class="post-metadata">

**Author:** ![Marco13](https://sea2.discourse-cdn.com/cesium/user_avatar/community.cesium.com/marco13/32/2757_2.png) [@Marco13](https://community.cesium.com/u/Marco13)\
**Post date:** [March 25, 2026, 3:23pm UTC](https://community.cesium.com/t/is-there-any-documentation-for-tiling-3dgs-ply-files/45654/4 "2026-03-25T15:23:51Z")

</div>

Support for SPZ files as the _input_ for the tiling _could_ be fairly easy. But there actually are good reasons to **not** offer this: SPZ is a _(lossy) compressed_ format. And it has some limitations for its use as a “general format for splats”.

For example, it will quantize the _positions_ of the splats, to 12 bits by default. This means that it cannot represent “large value ranges”. I stumbled over this, with some details summarized in [Question about position encoding · Issue #52 · nianticlabs/spz · GitHub](https://github.com/nianticlabs/spz/issues/52#issuecomment-3217258916) . On top of that, the other compression approaches in SPZ (like quantization for spherical harmonics) will cause small errors. And when the _input_ data already has small errors, and is passed through the tiling pipeline, and then _written_ as SPZ, this will “accumulate” additional errors, meaning that this may cause some rendering artifacts or low(er) visual quality in the final output.

In general, the _input_ for any processing pipeline should preferably be an _uncompressed_ (or _losslessly_ compressed) format. (We might think about the option to upload ZIPped PLY files, for example, just to save on transmission size…)

An aside: Cesium ion is currently _writing_ glTF assets with SPZ-compressed splat data by default. And this makes sense: It is in a form that is intended for “last-mile” delivery, and should therefore be in a compact representation. Limitations of SPZ - like the limited value range for the positions - are not so critical when the data is divided into smaller tiles.

However, sooner or later someone _will_ upload a “large” model (i.e. with a large spatial extent), and the position limitations will kick in. I already opened an issue for that. People can call this “pessimism” or “foresight”, but right now, I’m just waiting for that issue to become “active”, so to speak.
