import numpy as np def get_loop_cameras(num_imgs_in_loop, radius=2.0, max_elevation=np.pi/6, elevation_freq=0.5, azimuth_freq=2.0): all_cameras_c2w_cmo = [] for i in range(num_imgs_in_loop): azimuth_angle = np.pi * 2 * azimuth_freq * i / num_imgs_in_loop elevation_angle = max_elevation * np.sin( np.pi * i * 2 * elevation_freq / num_imgs_in_loop) x = np.cos(azimuth_angle) * radius * np.cos(elevation_angle) y = np.sin(azimuth_angle) * radius * np.cos(elevation_angle) z = np.sin(elevation_angle) * radius camera_T_c2w = np.array([x, y, z], dtype=np.float32) # in COLMAP / OpenCV convention: z away from camera, y down, x right camera_z = - camera_T_c2w / radius up = np.array([0, 0, -1], dtype=np.float32) camera_x = np.cross(up, camera_z) camera_x = camera_x / np.linalg.norm(camera_x) camera_y = np.cross(camera_z, camera_x) camera_c2w_cmo = np.hstack([camera_x[:, None], camera_y[:, None], camera_z[:, None], camera_T_c2w[:, None]]) camera_c2w_cmo = np.vstack([camera_c2w_cmo, np.array([0, 0, 0, 1], dtype=np.float32)[None, :]]) all_cameras_c2w_cmo.append(camera_c2w_cmo) return all_cameras_c2w_cmo