DIRECTOR-demo / utils /rerun.py
robin-courant's picture
Add app
f7a5cb1 verified
raw
history blame
2.07 kB
import numpy as np
from matplotlib import colormaps
import rerun as rr
from rerun.components import Material
from scipy.spatial import transform
def color_fn(x, cmap="tab10"):
return colormaps[cmap](x % colormaps[cmap].N)
def log_sample(
root_name: str,
traj: np.ndarray,
K: np.ndarray,
vertices: np.ndarray,
faces: np.ndarray,
normals: np.ndarray,
caption: str,
mesh_masks: np.ndarray,
):
num_cameras = traj.shape[0]
rr.log(root_name, rr.ViewCoordinates.RIGHT_HAND_Y_DOWN, timeless=True)
rr.log(
f"{root_name}/trajectory/points",
rr.Points3D(traj[:, :3, 3]),
timeless=True,
)
rr.log(
f"{root_name}/trajectory/line",
rr.LineStrips3D(
np.stack((traj[:, :3, 3][:-1], traj[:, :3, 3][1:]), axis=1),
colors=[(1.0, 0.0, 1.0, 1.0)],
),
timeless=True,
)
for k in range(num_cameras):
rr.set_time_sequence("frame_idx", k)
translation = traj[k][:3, 3]
rotation_q = transform.Rotation.from_matrix(traj[k][:3, :3]).as_quat()
rr.log(
f"{root_name}/camera/image",
rr.Pinhole(
image_from_camera=K,
width=K[0, -1] * 2,
height=K[1, -1] * 2,
),
)
rr.log(
f"{root_name}/camera",
rr.Transform3D(
translation=translation,
rotation=rr.Quaternion(xyzw=rotation_q),
),
)
rr.set_time_sequence("image", k)
# Null vertices
if vertices[k].sum() == 0:
rr.log(f"{root_name}/char/char", rr.Clear(recursive=False))
rr.log(f"{root_name}/camera/image/bbox", rr.Clear(recursive=False))
continue
rr.log(
f"{root_name}/char/char",
rr.Mesh3D(
vertex_positions=vertices[k],
indices=faces,
vertex_normals=normals[k],
mesh_material=Material(albedo_factor=color_fn(0)),
),
)