File size: 2,293 Bytes
e340a84
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import os

import numpy as np

from .geometry import camera_geometry, collect_points

_CAMERA_COLORS = np.array(
    [
        [239, 68, 68, 255],
        [14, 165, 233, 255],
        [34, 197, 94, 255],
        [245, 158, 11, 255],
    ],
    dtype=np.uint8,
)


def _camera_mesh(center, corners, color):
    import trimesh

    vertices = np.vstack([center[None], corners]).astype(np.float32)
    faces = np.array(
        [
            [0, 1, 2],
            [0, 2, 3],
            [0, 3, 4],
            [0, 4, 1],
            [1, 2, 3],
            [1, 3, 4],
        ],
        dtype=np.int64,
    )
    mesh = trimesh.Trimesh(vertices=vertices, faces=faces, process=False)
    mesh.visual.face_colors = np.tile(color[None], (faces.shape[0], 1))
    return mesh


def export_glb(
    session_dir: str,
    branch: str,
    display_mode: str,
    frame_index: int,
    mask_sky: bool,
    show_cameras: bool,
    camera_scale: float,
    max_points: int,
) -> str:
    import trimesh

    points, colors, _ = collect_points(
        session_dir=session_dir,
        branch=branch,
        display_mode=display_mode,
        frame_index=frame_index,
        mask_sky=mask_sky,
        max_points=max_points,
        seed=13,
    )
    if len(points) == 0:
        raise ValueError("No valid points to export")

    scene = trimesh.Scene()
    scene.add_geometry(trimesh.PointCloud(vertices=points, colors=colors))

    if show_cameras:
        _, frustums, _ = camera_geometry(
            session_dir=session_dir,
            display_mode=display_mode,
            frame_index=frame_index,
            camera_scale_ratio=camera_scale,
            points_hint=points,
        )
        for idx, (center, corners) in enumerate(frustums):
            scene.add_geometry(
                _camera_mesh(center, corners, _CAMERA_COLORS[idx % len(_CAMERA_COLORS)])
            )

    export_dir = os.path.join(session_dir, "exports")
    os.makedirs(export_dir, exist_ok=True)
    branch_slug = branch.lower().replace(" + ", "_").replace(" ", "_")
    mode_slug = display_mode.replace(" ", "_").lower()
    filename = f"{branch_slug}_{mode_slug}_{frame_index:04d}_sky{int(mask_sky)}_cam{int(show_cameras)}.glb"
    path = os.path.join(export_dir, filename)
    scene.export(path)
    return path