# Terrain mesh to GLTF models

**URL:** <https://community.cesium.com/t/terrain-mesh-to-gltf-models/17209>\
**Category:** CesiumJS\
**Created:** [February 7, 2022, 11:41am UTC](https://community.cesium.com/t/terrain-mesh-to-gltf-models/17209 "2022-02-07T11:41:31Z")\
**Posts on this page:** 1\
**Showing post:** 3

<div class="post-metadata">

**Author:** ![atul-sd](https://sea2.discourse-cdn.com/cesium/user_avatar/community.cesium.com/atul-sd/32/3476_2.png) [@atul-sd](https://community.cesium.com/u/atul-sd)\
**Post date:** [February 14, 2022, 9:30am UTC](https://community.cesium.com/t/terrain-mesh-to-gltf-models/17209/3 "2022-02-14T09:30:12Z")

</div>

**Progress update 2**

I tried reading the mesh data as shown [here](https://community.cesium.com/t/terrain-editing-on-the-fly/9695/6) and created a very simple OBJ file from the quantized mesh data.

```auto
const MAX_SHORT = 32767;
const tileCoord = {x:1936452, y: 711072}
const level = 20

this.map.terrainProvider.requestTileGeometry(tileCoord.x, tileCoord.y, level)
  .then((terrainData) => {
    console.log("Terrain tile data:", terrainData)
    const rect = new Cesium.GeographicTilingScheme().tileXYToRectangle(tileCoord.x, tileCoord.y, level);

    const data = terrainData as any;
    const minimumHeight = data._minimumHeight;
    const maximumHeight = data._maximumHeight;

    const indices: Uint16Array = data._indices;
    const quantizedVertices: Uint16Array = data._quantizedVertices;
    const vertexCount = quantizedVertices.length / 3;

    const vertices: [number, number, number][] = []
    const faces: [number, number, number][] = [];

    for (let i = 0; i < vertexCount; i++) {
      const rawU = quantizedVertices[i];
      const rawV = quantizedVertices[i + vertexCount];
      const rawH = quantizedVertices[i + vertexCount * 2];

      const u = rawU / MAX_SHORT;
      const v = rawV / MAX_SHORT;

      const longitude = Cesium.Math.lerp(rect.west, rect.east, u);
      const latitude = Cesium.Math.lerp(rect.south, rect.north, v);
      const height = Cesium.Math.lerp(minimumHeight, maximumHeight, rawH / MAX_SHORT);

      const carto = new Cesium.Cartographic(longitude, latitude, height);
      const cartesion = Cesium.Cartographic.toCartesian(carto)
      vertices.push([cartesion.x, cartesion.y, height])
    }

    // form triangle faces from indices
    let i = 0;
    while (i < indices.length) {
      faces.push([indices[i], indices[i + 1], indices[i + 2]])
      i += 3
    }

    console.log("Vertices:", vertices);
    console.log("faces:", faces)
  })

```

Now when I try loading that OBJ file in the Blender, I get the following error -

```auto
Python: Traceback (most recent call last):
  File "/snap/blender/1653/3.0/scripts/addons/io_scene_obj/ __init__.py", line 151, in execute
    return import_obj.load(context, **keywords)
  File "/snap/blender/1653/3.0/scripts/addons/io_scene_obj/import_obj.py", line 1264, in load
    for data in split_mesh(verts_loc, faces, unique_materials, filepath, SPLIT_OB_OR_GROUP):
  File "/snap/blender/1653/3.0/scripts/addons/io_scene_obj/import_obj.py", line 547, in split_mesh
    verts_split.append(verts_loc[vert_idx]) # add the vert to the local verts
IndexError: list index out of range

location: <unknown location>:-1

```

Can someone please tell me what I’m doing wrong?

PS: Attaching OBJ file which I created - [test.zip](https://community.cesium.com/uploads/short-url/8FPHBNfhDOkP7OFBAchRkNcmC8u.zip) (22.5 KB)

---

_[View the full topic](https://community.cesium.com/t/terrain-mesh-to-gltf-models/17209)._
