Camera pose tracking¶
Monitor and read camera poses from connected clients in real-time.
This example demonstrates how to track camera movements and handle multiple connected clients. Camera pose tracking is essential for applications like telepresence, collaborative visualization, or recording user viewpoints for replay.
Key features:
viser.ViserServer.on_client_connect()
for detecting new client connectionsviser.CameraHandle.on_update()
for real-time camera movement callbacksviser.CameraHandle.wxyz
andviser.CameraHandle.position
for pose dataviser.CameraHandle.fov
andviser.CameraHandle.aspect
for camera parameters
The example shows how to access camera intrinsics (FOV, aspect ratio, canvas size) and extrinsics (position, orientation) from each connected client, enabling synchronized multi-user experiences or camera-based interactions.
Source: examples/03_interaction/03_camera_poses.py

Code¶
1import time
2
3import viser
4
5server = viser.ViserServer()
6server.scene.world_axes.visible = True
7
8
9@server.on_client_connect
10def _(client: viser.ClientHandle) -> None:
11 print("new client!")
12
13 # This will run whenever we get a new camera!
14 @client.camera.on_update
15 def _(_: viser.CameraHandle) -> None:
16 print(f"New camera on client {client.client_id}!")
17
18 # Show the client ID in the GUI.
19 gui_info = client.gui.add_text("Client ID", initial_value=str(client.client_id))
20 gui_info.disabled = True
21
22
23while True:
24 # Get all currently connected clients.
25 clients = server.get_clients()
26 print("Connected client IDs", clients.keys())
27
28 for id, client in clients.items():
29 print(f"Camera pose for client {id}")
30 print(f"\twxyz: {client.camera.wxyz}")
31 print(f"\tposition: {client.camera.position}")
32 print(f"\tfov: {client.camera.fov}")
33 print(f"\taspect: {client.camera.aspect}")
34 print(f"\tlast update: {client.camera.update_timestamp}")
35 print(
36 f"\tcanvas size: {client.camera.image_width}x{client.camera.image_height}"
37 )
38
39 time.sleep(2.0)