3D mesh visualization

Load and display 3D meshes from common file formats.

This example demonstrates how to load and visualize 3D meshes using viser’s mesh rendering capabilities. Meshes are fundamental for displaying complex 3D geometry from CAD models, 3D scans, or generated content.

Key features:

The example shows two ways to display the same mesh: using raw vertices/faces arrays or directly from a trimesh object. This flexibility allows integration with various 3D processing pipelines and file formats supported by trimesh.

Note

This example requires external assets. To download them, run:

cd /path/to/viser/examples/assets
./download_assets.sh

Source: examples/01_scene/02_meshes.py

3D mesh visualization

Code

 1import time
 2from pathlib import Path
 3
 4import numpy as np
 5import trimesh
 6
 7import viser
 8import viser.transforms as tf
 9
10
11def main():
12    mesh = trimesh.load_mesh(str(Path(__file__).parent / "../assets/dragon.obj"))
13    assert isinstance(mesh, trimesh.Trimesh)
14    mesh.apply_scale(0.05)
15
16    vertices = mesh.vertices
17    faces = mesh.faces
18    print(f"Loaded mesh with {vertices.shape} vertices, {faces.shape} faces")
19
20    server = viser.ViserServer()
21    server.scene.add_mesh_simple(
22        "/simple",
23        vertices=vertices,
24        faces=faces,
25        wxyz=tf.SO3.from_x_radians(np.pi / 2).wxyz,
26        position=(0.0, 0.0, 0.0),
27    )
28    server.scene.add_mesh_trimesh(
29        "/trimesh",
30        mesh=mesh,
31        wxyz=tf.SO3.from_x_radians(np.pi / 2).wxyz,
32        position=(0.0, 5.0, 0.0),
33    )
34    server.scene.add_grid(
35        "/grid",
36        width=20.0,
37        height=20.0,
38        position=np.array([0.0, 0.0, -2.0]),
39    )
40
41    while True:
42        time.sleep(10.0)
43
44
45if __name__ == "__main__":
46    main()