Pointcloud Animation¶

Warning: This example is still under construction.

This example demonstrates how to animate point clouds using Vuer’s TimelineControls and the global app.update method. It loads a 3D mesh and pre-computed trajectory data, then updates point cloud positions frame-by-frame based on timeline events.

Key concepts:

  • Using app.update to broadcast updates to all connected clients

  • Pre-populating the scene with initial components via Set

  • Handling TIMELINE_STEP events to synchronize animations

  • Displaying multiple point clouds with different colors

Code Example¶

import asyncio

import numpy as np
import open3d as o3d

from vuer import Vuer
from vuer.events import ClientEvent, Set
from vuer.schemas import DefaultScene, PointCloud, TimelineControls, TriMesh

mesh = o3d.io.read_triangle_mesh("assets/suzanne.ply")
vertices = np.asarray(mesh.vertices)
faces = np.asarray(mesh.triangles)

app = Vuer()

infill = np.load("assets/suzanne_infill_good_traj.npy")
surface_infill = np.load("assets/suzanne_surface_fill_only.npy")

@app.spawn
async def main(proxy):
    proxy @ Set(
        DefaultScene(
            TriMesh(vertices=vertices, faces=faces, position=[0, 0, 0], wireframe=True),
            PointCloud(key="surface", vertices=vertices, size=0.001),
            PointCloud(key="infill", vertices=vertices, size=0.001),
        ),
    )

    while True:
        await asyncio.sleep(1.0)

async def frame_handle(e: ClientEvent, _):
    print("frame handle")

    step = e.value["step"]
    step = step % len(infill)

    app.update @ [
        TimelineControls(end=len(infill), step=step, speed=1.0, paused=False, key="timeline"),
        PointCloud(key="infill", vertices=infill[step], position=[0, 0, 0], color="red"),
        PointCloud(
            key="surface",
            vertices=surface_infill[step],
            position=[0.8, 0, 0],
            color="green",
        ),
    ]
    print("updated the scene")


app.add_handler("TIMELINE_STEP", frame_handle)
app.start()