Rendering Gaussian Splat (3D Tiles) in Cesium does not produce splatting effect

I used the official Cesium version 1.133 to load my 3DGS data. However, the final rendering result looks like individual points (similar to a point cloud), which is not the effect I expected. I want to achieve the Gaussian splatting effect.

I’m not sure whether the issue comes from my Cesium code or from my glTF data. Below is a screenshot of my glTF data — could you help me check and judge where the problem might be?

Below is a screenshot of my tileset.json.

Below is a main text of my gltf:

{
  "accessors": [
    {
      "bufferView": 0,
      "byteOffset": 0,
      "componentType": 5126,
      "normalized": false,
      "count": 467,
      "type": "VEC3",
      "max": [-782.6873779296875, -41.3204231262207, 64.00652313232422],
      "min": [-810.9231567382812, -69.77099609375, 46.145809173583984]
    },
    {
      "bufferView": 1,
      "byteOffset": 0,
      "componentType": 5121,
      "normalized": true,
      "count": 467,
      "type": "VEC4"
    },
    {
      "bufferView": 2,
      "byteOffset": 0,
      "componentType": 5126,
      "normalized": false,
      "count": 467,
      "type": "VEC4"
    },
    {
      "bufferView": 3,
      "byteOffset": 0,
      "componentType": 5126,
      "normalized": false,
      "count": 467,
      "type": "VEC3"
    }
  ],
  "asset": {
    "generator": "pygltflib@v1.16.5",
    "version": "2.0"
  },
  "bufferViews": [
    {
      "buffer": 0,
      "byteOffset": 0,
      "byteLength": 5604,
      "target": 34962
    },
    {
      "buffer": 0,
      "byteOffset": 5604,
      "byteLength": 1868,
      "target": 34962
    },
    {
      "buffer": 0,
      "byteOffset": 7472,
      "byteLength": 7472,
      "target": 34962
    },
    {
      "buffer": 0,
      "byteOffset": 14944,
      "byteLength": 5604,
      "target": 34962
    }
  ],
  "buffers": [
    {
      "byteLength": 20548
    }
  ],
  "extensionsUsed": [
    "KHR_gaussian_splatting"
  ],
  "meshes": [
    {
      "primitives": [
        {
          "extensions": {
            "KHR_gaussian_splatting": {
              "positions": 0,
              "colors": 1,
              "scales": 2,
              "rotations": 3
            }
          },
          "attributes": {
            "POSITION": 0,
            "COLOR_0": 1,
            "_ROTATION": 2,
            "_SCALE": 3
          },
          "mode": 0
        }
      ]
    }
  ],
  "nodes": [
    {
      "mesh": 0
    }
  ],
  "scene": 0,
  "scenes": [
    {
      "nodes": [0]
    }
  ]
}

Can anyone tell me whether the issue comes from the way I converted my 3DGS data, or if it’s a problem with my Cesium code

From a quick look, there is the KHR_gaussian_splatting extension in the glTF, but no KHR_gaussian_splatting_spz_2 extension. Some of this is pretty much in flux and still changes frequently. The latest state is tracked in KHR_gaussian_splatting by weegeekps · Pull Request #2490 · KhronosGroup/glTF · GitHub

@Marco13’s post seems relevant if you’re trying to use spz data in your glTF, but there’s also issues here with the base KHR_gaussian_splatting extension. Particularly this bit:

{
    "extensions": {
        "KHR_gaussian_splatting": {
            "positions": 0,
            "colors": 1,
            "scales": 2,
            "rotations": 3
        }
    },
    "attributes": {
        "POSITION": 0,
        "COLOR_0": 1,
        "_ROTATION": 2,
        "_SCALE": 3
    },
    "mode": 0
}

As far as the current spec of KHR_gaussian_splatting is concerned, all of its properties are optional hints about how the splats should be rendered. The attributes, meanwhile, are missing the correct names: it’s now KHR_gaussian_splatting:SCALE instead of _SCALE and KHR_gaussian_splatting:ROTATION instead of _ROTATION. Putting that together:


{
    "extensions": {
        "KHR_gaussian_splatting": {}
    },
    "attributes": {
        "POSITION": 0,
        "COLOR_0": 1,
        "KHR_gaussian_splatting:ROTATION": 2,
        "KHR_gaussian_splatting:SCALE": 3
    },
    "mode": 0
}

That might work better.

@azrogers Thank you very much for your reply!

I’ve modified my glTF data structure according to your suggestions. The current data format is as follows:

{
  "accessors": [
    {
      "bufferView": 0,
      "byteOffset": 0,
      "componentType": 5126,
      "normalized": false,
      "count": 8563,
      "type": "VEC3",
      "max": [
        72.12738037109375,
        -98.28071594238281,
        73.16584777832031
      ],
      "min": [
        39.063865661621094,
        -155.24761962890625,
        50.584835052490234
      ]
    },
    {
      "bufferView": 1,
      "byteOffset": 0,
      "componentType": 5121,
      "normalized": true,
      "count": 8563,
      "type": "VEC4"
    },
    {
      "bufferView": 2,
      "byteOffset": 0,
      "componentType": 5126,
      "normalized": false,
      "count": 8563,
      "type": "VEC4"
    },
    {
      "bufferView": 3,
      "byteOffset": 0,
      "componentType": 5126,
      "normalized": false,
      "count": 8563,
      "type": "VEC3"
    }
  ],
  "asset": {
    "generator": "pygltflib@v1.16.5",
    "version": "2.0"
  },
  "bufferViews": [
    {
      "buffer": 0,
      "byteOffset": 0,
      "byteLength": 102756,
      "target": 34962
    },
    {
      "buffer": 0,
      "byteOffset": 102756,
      "byteLength": 34252,
      "target": 34962
    },
    {
      "buffer": 0,
      "byteOffset": 137008,
      "byteLength": 137008,
      "target": 34962
    },
    {
      "buffer": 0,
      "byteOffset": 274016,
      "byteLength": 102756,
      "target": 34962
    }
  ],
  "buffers": [
    {
      "byteLength": 376772
    }
  ],
  "extensionsUsed": [
    "KHR_gaussian_splatting"
  ],
  "meshes": [
    {
      "primitives": [
        {
          "extensions": {
            "KHR_gaussian_splatting": {}
          },
          "attributes": {
            "POSITION": 0,
            "COLOR_0": 1,
            "KHR_gaussian_splatting:ROTATION": 2,
            "KHR_gaussian_splatting:SCALE": 3
          },
          "mode": 0
        }
      ]
    }
  ],
  "nodes": [
    {
      "mesh": 0
    }
  ],
  "scene": 0,
  "scenes": [
    {
      "nodes": [0]
    }
  ]
}

However, when I render it in Cesium, it still appears as individual points, similar to a point cloud, instead of showing the Gaussian splatting effect.

Could you please help me check my latest data format? Does the issue still come from the data format itself?

Or, as @Marco13 mentioned, is it that the splatting effect only works when using the KHR_gaussian_splatting_spz_2extension, and not KHR_gaussian_splatting?

Below is the image of my current rendering result — it still looks like a point cloud rather than the expected Gaussian splatting effect.

Thank you very much!

I believe that to be the case.

The KHR_gaussian_splatting_compression_spz_2 extension depends on (or “is an instance of”) the KHR_gaussian_splatting extension. And the intention is that it should be possible to provide the required splat attribute values either directly, in uncompressed form (as you did) or in compressed form, from the SPZ buffer.

I’m 99% sure that CesiumJS currently only supports the case where they are provided via the KHR_gaussian_splatting_compression_spz_2 extension. (And I’m 99.9% sure that if the other case should be supported, it was not tested yet).

hi there!

Thank you for the clarification!
I followed your advice and changed the extension to KHR_gaussian_splatting_compression_spz_2. After doing that, the rendering result has changed — it’s no longer just a point cloud, and now I can actually see the Gaussian splatting effect. That solved the previous issue!

However, I’ve run into a new problem. The rendered result now looks somewhat abnormal — the splats appear to be spreading out or diverging in a strange way (as shown in the image below).

I’m not sure what might be causing this issue. I’ve provided my conversion code below — could you please help me take a look?

def splat_to_gltf_with_gaussian_extension(points: List[Point], output_path: str):
    # --- Extract data ---
    positions = np.array([p.position for p in points], dtype=np.float32)
    colors = np.array([p.color for p in points], dtype=np.uint8)   # RGBA bytes
    scales = np.array([p.scale for p in points], dtype=np.float32)
    rotations = np.array([p.rotation for p in points], dtype=np.uint8)  # Quaternion bytes (w, x, y, z)

    # Reorder quaternion from [w, x, y, z] to [x, y, z, w] for later use
    rotations_xyzw = rotations[:, [1, 2, 3, 0]].astype(np.float32)
    # Linearly map to range [-1, 1]
    rotations_xyzw = (rotations_xyzw - 128.0) / 128.0
    # Normalize each quaternion
    norms = np.linalg.norm(rotations_xyzw, axis=1, keepdims=True)
    # Prevent division by zero
    norms[norms == 0] = 1
    rotations_xyzw /= norms

    # --- Convert to SPZ format ---
    gaussian_cloud = spz.GaussianCloud()
    gaussian_cloud.positions = np.ascontiguousarray(positions.reshape(-1), dtype=np.float32)
    # Extract RGB and normalize to [0, 1]
    colors_rgb = (colors.astype(np.float32) / 255.0)[:, :3]
    gaussian_cloud.colors = np.ascontiguousarray(colors_rgb.reshape(-1), dtype=np.float32)
    gaussian_cloud.scales = np.ascontiguousarray(scales.reshape(-1), dtype=np.float32)
    gaussian_cloud.rotations = np.ascontiguousarray(rotations_xyzw.reshape(-1), dtype=np.float32)
    # Provide alpha channel separately
    alphas = (colors[:, 3].astype(np.float32) / 255.0)
    gaussian_cloud.alphas = np.ascontiguousarray(alphas.reshape(-1), dtype=np.float32)

    pack_options = spz.PackOptions()
    # Specify LUF coordinate system to match glTF (Cesium) convention
    pack_options.from_coord = spz.CoordinateSystem.LUF

    temp_spz_path = "temp.spz"
    success = spz.save_spz(gaussian_cloud, pack_options, temp_spz_path)
    if not success:
        raise RuntimeError("SPZ compression failed")

    with open(temp_spz_path, "rb") as f:
        compressed_bytes = f.read()

    # --- Build glTF structure ---
    gltf = GLTF2()
    gltf.extensionsUsed = ["KHR_gaussian_splatting", "KHR_gaussian_splatting_compression_spz_2"]
    gltf.extensionsRequired = gltf.extensionsUsed.copy()

    # Create BufferView to store SPZ binary data blob
    buffer = Buffer()
    gltf.buffers.append(buffer)
    buffer_view = BufferView(buffer=0, byteOffset=0, byteLength=len(compressed_bytes))
    gltf.bufferViews.append(buffer_view)

    # Define accessors (without bufferViews)
    accessor_position = Accessor(
        componentType=5126, normalized=False,
        count=len(positions), type="VEC3",
        max=positions.max(axis=0).tolist(),
        min=positions.min(axis=0).tolist()
    )
    accessor_color = Accessor(
        componentType=5121, normalized=True,
        count=len(colors), type="VEC4"
    )
    accessor_scale = Accessor(
        componentType=5126, normalized=False,
        count=len(scales), type="VEC3"
    )
    accessor_rotation = Accessor(
        componentType=5126, normalized=False,
        count=len(rotations_xyzw), type="VEC4"
    )
    gltf.accessors.extend([accessor_position, accessor_color, accessor_scale, accessor_rotation])

    primitive = Primitive(
        attributes={
            "POSITION": 0,
            "COLOR_0": 1,
            "KHR_gaussian_splatting:SCALE": 2,
            "KHR_gaussian_splatting:ROTATION": 3
        },
        mode=0,
        extensions={
            "KHR_gaussian_splatting": {
                "extensions": {
                    "KHR_gaussian_splatting_compression_spz_2": {
                        "bufferView": 0
                    }
                }
            }
        }
    )
    mesh = Mesh(primitives=[primitive])
    gltf.meshes.append(mesh)
    node = Node(mesh=0)
    gltf.nodes.append(node)
    scene = Scene(nodes=[0])
    gltf.scenes.append(scene)
    gltf.scene = 0

    # Embed compressed data as base64 URI
    gltf.buffers[0].uri = "data:application/octet-stream;base64," + base64.b64encode(compressed_bytes).decode()

    # Remove bufferView references from accessors (data handled by extension)
    for accessor in gltf.accessors:
        accessor.bufferView = None
        accessor.byteOffset = None

    gltf.save(output_path)

It’s a bit hard to tell from the screenshot alone (and without the possibility to actually run the code).

A wild guess is that mainly the scales could be wrong.

Specifically: I can see the line
scales = np.array([p.scale for p in points], dtype=np.float32)
in your code. Depending on what p.scale is, you might just try out to replace this with log(p.scale) (the logarithm).

(I could justify that guess on different levels, with the td;dr being: Everything is un(der)specified. More elaborately: Some ~“in-memory representations of splats” apply some ~“scaling factors” or ~“conversions” or ~“computations” on some values. Some splat formats store the logarithm or exponent of that scale value, and some renderers expect the exponent or logarithm, respectively. Depending on which splat producer/consumer makes which assumptions, you may have to throw in some log or exp here and there. I hope that Specifying the data format · Issue #42 · nianticlabs/spz · GitHub or some discussion around https://github.com/KhronosGroup/glTF/pull/2490 will help to sort this out)

If this doesn’t solve it, one might have to switch from “trying stuff out” to “thinking about stuff” :slight_smile:


EDIT: Are you reading these points from .splat/gsplat data? I noticed that this seems be one of the formats that store the power (escale), and that may have to be compensated here…

Another EDIT: I can see that you’re also doing the [w,x,y,z] to [x,y,z,w] conversion for the quaternions. So the plot thickens :slight_smile:

I followed your suggestion and modified the way I generate the scale values. The previous issue has now been resolved. Thank you so much!

However, I’ve encountered a new issue while converting my data from .splat to .glb for rendering in Cesium using the KHR_gaussian_splatting_compression_spz_2 extension.

The issue is that the rendered result in Cesium doesn’t look as expected — it doesn’t show the correct Gaussian Splatting effect. I’m not sure which attribute might be causing the rendering issue.

Below are my abnormal rendering result.

My guesses are: scale, alpha, color, rotation, or sh (spherical harmonics?).

I’ll attach my code below.
Could you please help me analyze which attribute might be incorrectly converted, and how I can fix it?

Here are my code.

def splat_to_gltf_with_gaussian_extension(points: List[Point], output_path: str):
    # --- Extract data ---
    positions = np.array([p.position for p in points], dtype=np.float32)
    colors = np.array([p.color for p in points], dtype=np.uint8)   # RGBA bytes
    scales = np.array([p.scale for p in points], dtype=np.float32)
    rotations = np.array([p.rotation for p in points], dtype=np.uint8)  # quaternion bytes (w,x,y,z)
    sh_coeffs_list = np.array([p.sh_coeffs for p in points], dtype=np.float32)  # shape: (N, 15, 3)

    positions = positions[:, [0, 2, 1]]  # Swap Y and Z

    # --- Convert to SPZ format ---
    gaussian_cloud = spz.GaussianCloud()

    # 1. Process positions (placed first as required)
    gaussian_cloud.positions = np.ascontiguousarray(positions.reshape(-1), dtype=np.float32)

    # 2. Process colors
    colors_rgb = colors[:, :3].astype(np.float32) / 255.0  # Normalize to [0,1]
    colors_rgb = 0.282095 * colors_rgb  # Apply spherical harmonics constant
    gaussian_cloud.colors = np.ascontiguousarray(colors_rgb.reshape(-1), dtype=np.float32)

    # 3. Process Alpha
    # Alpha processing - store logit values (sigmoid input)

    alphas_raw = colors[:, 3].astype(np.float32) / 255.0  # Normalize to [0,1]
    alphas_clamped = np.clip(alphas_raw, 1e-6, 1 - 1e-6)
    alphas_logit = np.log(alphas_clamped / (1 - alphas_clamped))
    gaussian_cloud.alphas = np.ascontiguousarray(alphas_logit.reshape(-1), dtype=np.float32)

    # 4. Process scales
    # Fix: .splat files store exp(scale) values, but GLB needs log(scale) values
    # Since the renderer applies exp() transformation, we need to apply log() here
    scales = np.log(np.maximum(scales, 1e-10))  # Avoid log(0)
    gaussian_cloud.scales = np.ascontiguousarray(scales.reshape(-1), dtype=np.float32)

    # 5. Process rotations
    # 5.1: Adjust quaternion order [w,x,y,z] → [x,y,z,w] (compliant with glTF specification)
    rotations_xyzw = rotations[:, [1, 2, 3, 0]].astype(np.float32)

    # 5.2: Dequantize uint8[0,255] → float[-1,1]
    rotations_xyzw = (rotations_xyzw - 128.0) / 128.0

    # 5.3: Normalize to unit quaternion q̂ = q / |q|
    # |q| = sqrt(qx² + qy² + qz² + qw²)
    norms = np.linalg.norm(rotations_xyzw, axis=1, keepdims=True)
    norms[norms == 0] = 1  # Prevent division by zero
    rotations_xyzw /= norms

    gaussian_cloud.rotations = np.ascontiguousarray(rotations_xyzw.reshape(-1), dtype=np.float32)

    # 6. Process spherical harmonics
    # [point0_coef0_r, point0_coef0_g, point0_coef0_b, point0_coef1_r, ..., point1_coef0_r, ...]
    sh_coeffs_flat = sh_coeffs_list.reshape(-1)  # (N*15*3,)
    gaussian_cloud.sh_degree = 3
    gaussian_cloud.sh = np.ascontiguousarray(sh_coeffs_flat, dtype=np.float32)

    pack_options = spz.PackOptions()
    pack_options.from_coord = spz.CoordinateSystem.LUF

    temp_spz_path = "temp.spz"
    success = spz.save_spz(gaussian_cloud, pack_options, temp_spz_path)
    if not success:
        raise RuntimeError("SPZ compression failed")

    with open(temp_spz_path, "rb") as f:
        compressed_bytes = f.read()


    # --- Build glTF ---
    gltf = GLTF2()
    gltf.extensionsUsed = ["KHR_gaussian_splatting", "KHR_gaussian_splatting_compression_spz_2","KHR_materials_unlit"]
    gltf.extensionsRequired = gltf.extensionsUsed.copy()

    buffer = Buffer()
    gltf.buffers.append(buffer)
    buffer_view = BufferView(buffer=0, byteOffset=0, byteLength=len(compressed_bytes))
    gltf.bufferViews.append(buffer_view)
    gltf.materials.append({
      "extensions": {
        "KHR_materials_unlit": {}
      }
    })

    num_points = len(positions)

    # Accessors for base attributes
    accessor_position = Accessor(
        componentType=5126, normalized=False,
        count=num_points, type="VEC3",
        max=positions.max(axis=0).tolist(),
        min=positions.min(axis=0).tolist()
    )
    accessor_color = Accessor(
        componentType=5121, normalized=True,
        count=num_points, type="VEC4"
    )
    accessor_scale = Accessor(
        componentType=5126, normalized=False,
        count=num_points, type="VEC3"
    )
    accessor_rotation = Accessor(
        componentType=5126, normalized=False,
        count=num_points, type="VEC4"
    )

    # Add accessors for spherical harmonics coefficients
    # Degree 1: 3 coefficients, each coefficient is VEC4 (RGB + padding)
    sh_degree_1_accessors = []
    for i in range(3):
        accessor = Accessor(
            componentType=5126, normalized=False,
            count=num_points, type="VEC4"
        )
        sh_degree_1_accessors.append(accessor)

    # Degree 2: 5 coefficients, each coefficient is VEC4 (RGB + padding)
    sh_degree_2_accessors = []
    for i in range(5):
        accessor = Accessor(
            componentType=5126, normalized=False,
            count=num_points, type="VEC4"
        )
        sh_degree_2_accessors.append(accessor)

    # Degree 3: 7 coefficients, each coefficient is VEC4 (RGB + padding)
    sh_degree_3_accessors = []
    for i in range(7):
        accessor = Accessor(
            componentType=5126, normalized=False,
            count=num_points, type="VEC4"
        )
        sh_degree_3_accessors.append(accessor)

    # Add all accessors
    gltf.accessors.extend([accessor_position, accessor_color, accessor_scale, accessor_rotation])
    gltf.accessors.extend(sh_degree_1_accessors)  # accessor indices 4-6
    gltf.accessors.extend(sh_degree_2_accessors)  # accessor indices 7-11
    gltf.accessors.extend(sh_degree_3_accessors)  # accessor indices 12-18

    attributes = {
        "POSITION": 0,
        "COLOR_0": 1,
        "KHR_gaussian_splatting:SCALE": 2,
        "KHR_gaussian_splatting:ROTATION": 3,
    }

    # Add 3 coefficients for SH Degree 1 (accessor indices 4-6)
    for i in range(3):
        attributes[f"KHR_gaussian_splatting:SH_DEGREE_1_COEF_{i}"] = 4 + i

    # Add 5 coefficients for SH Degree 2 (accessor indices 7-11)
    for i in range(5):
        attributes[f"KHR_gaussian_splatting:SH_DEGREE_2_COEF_{i}"] = 7 + i

    # Add 7 coefficients for SH Degree 3 (accessor indices 12-18)
    for i in range(7):
        attributes[f"KHR_gaussian_splatting:SH_DEGREE_3_COEF_{i}"] = 12 + i

    primitive = Primitive(
        attributes=attributes,
        mode=0,
        material= 0,
        extensions={
            "KHR_gaussian_splatting": {
                "extensions": {
                    "KHR_gaussian_splatting_compression_spz_2": {
                        "bufferView": 0
                    }
                }
            }
        }
    )
    mesh = Mesh(primitives=[primitive])
    gltf.meshes.append(mesh)

    # Create Node and Scene
    node = Node(mesh=0)
    gltf.nodes.append(node)
    scene = Scene(nodes=[0])
    gltf.scenes.append(scene)
    gltf.scene = 0

    # Write compressed data to buffer URI
    gltf.buffers[0].uri = "data:application/octet-stream;base64," + base64.b64encode(compressed_bytes).decode()
    for accessor in gltf.accessors:
        accessor.bufferView = None
        accessor.byteOffset = None
    gltf.save(output_path)

Thank you very much for your help and technical support!

The screenshot just shows some gray area. (What happens when you zoom in?). The code cannot be executed without further libraries. There is no example data. Everything here would just be guesswork - as indicated by the guess that it may be related to “scale, alpha, color, rotation, or sh” (which you could have summarized with “it’s not the ‘position’”).

When you drag-and-drop the .splat file into https://sandbox.babylonjs.com/, is it rendered correctly? Can you share the .splat file (if it is not too large)?

I dropped my .splat file into https://sandbox.babylonjs.com/, and it was rendered correctly. I’d be happy to share my dataset with you. I’ve currently prepared LOD 19 to 21, and each level directory contains many small files.

If you find that there are too many small files and it’s inconvenient to review them, you can use the attachment with “merged” in its name instead.

I’ve merged the .splat files by LOD level to make it easier to check.

I’ve included my test data in the attachment. Thank you for taking a look at it.
Don’t hesitate to let me know if you need any further details or files

splat-data.zip (26.7 MB)

splat-data-merged.zip (26.7 MB)

The resulting SPZ data and (separately) the resulting GLB file could help.

But… it’s not unlikely that this is related to some aspect of the conversion code where I’d have to spend more time with reading and analyzing the code in order to figure out what is wrong there.

It might still be an issue in CesiumJS - there are quite a few ongoing changes for the extension specification of KHR_gaussian_splatting, KHR_spz_gaussian_splats_compression and KHR_gaussian_splatting_compression_spz_2. Maybe something in CesiumJS was not yet updated to the latest state.

I quickly used my own tools (JSpz and JSplat) to convert the .splat to SPZ and create a GLB+tileset for the GLB. These tools are still using an old extension version! But I’ll attach the result here for now, maybe it’s helpful in some way:

converted-2025-10-15.zip (5.5 MB)

Rendered in CesiumJS:

(Yes, the orientation is wrong - if that’s our only problem, we’re lucky…)

I’ve modified the way I calculate the colors, as shown in the code below.
Previously, the colors were converted once during the .splat processing, so they needed to be converted back before generating the .gltf file.
The issue is now resolved.

SH_C0 = 0.28209479177387814
colors_rgb = colors[:, :3].astype(np.float32)
f_dc = (colors_rgb / 255.0 - 0.5) / SH_C0
gaussian_cloud.colors = np.ascontiguousarray(f_dc.reshape(-1), dtype=np.float32)

Many thanks to @Marco for the continuous technical support during this time — I really appreciate it. :folded_hands:

我想知道,cesium1.130.1是否支持KHR_spz_gaussian_splats_compression扩展?为什么我的GLB无法加载呢?
结构如下:
JSON{
“accessors”:[
{“componentType”:5126,“count”:2187587,“max”:[1.0,1.0,1.0],“min”:[-1.0,-1.0,-1.0],“type”:“VEC3”},
{“componentType”:5121,“count”:2187587,“normalized”:true,“type”:“VEC4”},
{“componentType”:5126,“count”:2187587,“type”:“VEC4”},
{“componentType”:5126,“count”:2187587,“type”:“VEC3”}],
“asset”:{“generator”:“GISLab”,“version”:“2.0”},
“bufferViews”:[{“buffer”:0,“byteLength”:39528407}],
“buffers”:[{“byteLength”:39528407}],
“extensionsRequired”:[“KHR_spz_gaussian_splats_compression”],
“extensionsUsed”:[“KHR_spz_gaussian_splats_compression”,“KHR_materials_unlit”],
“materials”:[{“extensions”:{“KHR_materials_unlit”:{}}}],
“meshes”:[
{“primitives”:[
{“attributes”:{“COLOR_0”:1,“POSITION”:0,“_ROTATION”:2,“_SCALE”:3},
“extensions”:{“KHR_spz_gaussian_splats_compression”:{“bufferView”:0,“extras”:{},“name”:“KHR_spz_gaussian_splats_compression”,“quantizedPositionScale”:1}},
“material”:0,
“mode”:0}]
}],
“nodes”:[{“matrix”:[1.0,0.0,0.0,0.0,0.0,0.0,-1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0],“mesh”:0}],
“scene”:0,
“scenes”:[{“nodes”:[0]}]}

Why can’t the processed data be loaded in ceisum1.130.1? Does the KHR_spz_gaussian_splats_compression extension not support cesium1.130.1?