> For the complete documentation index, see [llms.txt](https://docs.multiset.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.multiset.ai/fundamentals/maps/output-asset/mesh.md).

# Mesh

Every map produces a raw (untextured) and a textured GLB mesh of the scanned space.

## Overview

The mesh is the geometric representation of a mapped space. It is produced for **every input type**, including Gaussian Splat uploads, where the mesh is reconstructed from the splat. It is what you use for occlusion, collision, and navigation at runtime, and for placing content against real-world geometry before you deploy.

## Two variants

| Variant      | What it is                                                | File   | Use it for                                                                                                                                                                        |
| ------------ | --------------------------------------------------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Raw**      | Untextured, low-poly geometry                             | `.glb` | [Occlusion](/unity-sdk/ar-foundation/features/occlusion.md), colliders, [NavMesh](/unity-sdk/ar-foundation/features/navmesh-navigation.md) baking, anything shipped to the device |
| **Textured** | The same geometry carrying photo texture from the capture | `.glb` | Visual preview, editor-time content placement, sharing the scan, BIM and analytics pipelines                                                                                      |

Ship the **raw** mesh when the mesh runs on device: it is far smaller, and occlusion and physics only need geometry. Use the **textured** mesh when a human is looking at it. You can reduce the raw mesh further in any 3D tool (Blender, for example) by lowering the poly count.

{% hint style="info" %}
People captured during scanning are masked out when the mesh is textured, so passers-by do not end up baked into the texture.
{% endhint %}

## Coordinate frame

Both meshes sit in the map's local frame:

* origin at `(0, 0, 0)`,
* `+Y` up,
* metric scale, where 1 unit is 1 metre.

A VPS query returns poses in that same frame, so anything you align to the mesh in the editor appears in the same physical spot at runtime. See [Coordinate Systems](/fundamentals/localization/coordinate-systems.md) for the left-handed and right-handed conventions.

{% hint style="danger" %}
Do not move the origin of a downloaded mesh. It must stay at `(0, 0, 0)`, otherwise everything you place against it will be offset once VPS poses arrive.
{% endhint %}

## Getting the mesh

### Developer Portal

Open the map from the **Maps** list and click **View Mesh** in the Map Details toolbar. The viewer lets you inspect the mesh and download the raw and textured GLB files.

### Unity Editor

The [Map Mesh Downloader](/unity-sdk/meta-quest/map-mesh-downloader.md) pulls the mesh straight into your scene under the `MapSpace` GameObject, so you can lay out content against real geometry. Downloaded meshes are tagged `EditorOnly` and excluded from the build. At runtime, [MapMeshHandler](/unity-sdk/ar-foundation/api-reference/mapmeshhandler.md) can fetch and display the mesh instead.

### REST API

Meshes are stored per map and fetched through the [`/file`](/fundamentals/rest-api-docs/map-operations.md) endpoint, which exchanges a storage key such as `<accountId>/<mapId>/Mesh/TexturedMesh.glb` for a short-lived, pre-signed download URL.

## Point cloud

Alongside the mesh, every processed map publishes a point cloud at `PointCloud/map.pcd`.

| Property         | Value                                                 |
| ---------------- | ----------------------------------------------------- |
| Format           | Binary PCD, `XYZ` fields only (no colour, no normals) |
| Spacing          | Voxel downsampled at **5 cm**                         |
| Coordinate frame | **Right-handed, `+Z` up**                             |
| Storage key      | `<accountId>/<mapId>/PointCloud/map.pcd`              |

Use it for measurement, clash detection, and importing the space into CAD, BIM, or point cloud tooling that does not read GLB. For occlusion, collision, and content placement, use the mesh instead.

### Its frame differs from the mesh

{% hint style="warning" %}
**The point cloud does not share the mesh's frame.** `map.pcd` is right-handed with `+Z` up, while the mesh and the `Pose/*.json` files are left-handed with `+Y` up. Overlay the two without converting and the cloud appears rotated 90° about `X`.

To place the cloud in the mesh's frame, swap the `Y` and `Z` components of every point: `(x, y, z)` becomes `(x, z, y)`. The swap flips handedness, which is what makes the two agree. A rotation on its own leaves a mirrored cloud.
{% endhint %}

This is true for every map, whatever the input, so a single conversion works across your whole account.

### Getting the point cloud

Open the map from the **Maps** list and use the point cloud download on the **Map Details** meshes card.

Over REST, [Map details](/fundamentals/rest-api-docs/map-details.md) reports the cloud on the map object:

```json
{
  "pointCloud": {
    "type": "pcd",
    "key": "<accountId>/<mapId>/PointCloud/map.pcd"
  }
}
```

Exchange that `key` for a short-lived download URL through the [`/file`](/fundamentals/rest-api-docs/map-operations.md) endpoint, the same way as for a mesh. A map with no `pointCloud` field has no cloud published.

## Replacing a mesh

If you clean up or re-texture a mesh externally, you can push it back to the map with `POST /vps/map/{mapCode}/mesh-upload-url`, choosing `meshType: textured` or `meshType: raw`. See [Map Operations](/fundamentals/rest-api-docs/map-operations.md).

{% hint style="success" %}
Replacing a mesh does not affect localization accuracy. Queries run on the map's feature data, not on the mesh, so the visual mesh can be updated at any time without re-processing the map.
{% endhint %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.multiset.ai/fundamentals/maps/output-asset/mesh.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
