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:
viser.SceneApi.add_mesh_simple()
for basic vertex/face arraysviser.SceneApi.add_mesh_trimesh()
for direct trimesh object integrationviser.SceneApi.add_grid()
for reference groundingMesh transformation using viser’s transform utilities
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

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()