Spaces:
Running
on
Zero
Running
on
Zero
| import os, sys | |
| import numpy as np | |
| import math | |
| def spherical_to_cartesian(sph): | |
| theta, azimuth, radius = sph | |
| return np.array([ | |
| radius * np.sin(theta) * np.cos(azimuth), | |
| radius * np.sin(theta) * np.sin(azimuth), | |
| radius * np.cos(theta), | |
| ]) | |
| def cartesian_to_spherical(xyz): | |
| xy = xyz[0]**2 + xyz[1]**2 | |
| radius = np.sqrt(xy + xyz[2]**2) | |
| theta = np.arctan2(np.sqrt(xy), xyz[2]) | |
| azimuth = np.arctan2(xyz[1], xyz[0]) | |
| return np.array([theta, azimuth, radius]) | |
| def relative_spherical(xyz_target, xyz_cond): | |
| sp_target = cartesian_to_spherical(xyz_target) | |
| sp_cond = cartesian_to_spherical(xyz_cond) | |
| theta_cond, azimuth_cond, z_cond = sp_cond | |
| theta_target, azimuth_target, z_target = sp_target | |
| d_theta = theta_target - theta_cond | |
| d_azimuth = (azimuth_target - azimuth_cond) % (2 * math.pi) | |
| d_z = z_target - z_cond | |
| return np.array([d_theta, d_azimuth, d_z]) | |
| def elu_to_c2w(eye, lookat, up): | |
| if isinstance(eye, list): | |
| eye = np.array(eye) | |
| if isinstance(lookat, list): | |
| lookat = np.array(lookat) | |
| if isinstance(up, list): | |
| up = np.array(up) | |
| l = eye - lookat | |
| l = l / np.linalg.norm(l) | |
| s = np.cross(l, up) | |
| s = s / np.linalg.norm(s) | |
| uu = np.cross(s, l) | |
| rot = np.eye(3) | |
| rot[0, :] = -s | |
| rot[1, :] = uu | |
| rot[2, :] = l | |
| c2w = np.eye(4) | |
| c2w[:3, :3] = rot.T | |
| c2w[:3, 3] = eye | |
| return c2w | |
| def c2w_to_elu(c2w): | |
| w2c = np.linalg.inv(c2w) | |
| eye = c2w[:3, 3] | |
| lookat_dir = -w2c[2, :3] | |
| lookat = eye + lookat_dir | |
| up = w2c[1, :3] | |
| return eye, lookat, up | |
| '''save pose output''' | |
| jdata = { | |
| 'anchor_vid': anchor_vid, | |
| 'obs': {} | |
| } | |
| jdata['obs'][anchor_vid] = { | |
| 'img_path': f'{anchor_vid:03d}.png' | |
| } | |
| for key in aux_data: | |
| jdata['obs'][anchor_vid][key] = aux_data[key][0] | |
| anchor_sph = None | |
| anchor_rt = None | |
| if os.path.exists(os.path.join(obj_root, 'poses', f'{anchor_vid:03d}.npy')): | |
| anchor_rt = np.load(os.path.join(obj_root, 'poses', f'{anchor_vid:03d}.npy')) | |
| elif os.path.exists(os.path.join(obj_root, 'poses', f'{anchor_vid:03d}.txt')): | |
| anchor_rt = np.loadtxt(os.path.join(obj_root, 'poses', f'{anchor_vid:03d}.txt')) | |
| if anchor_rt is not None: | |
| anchor_xyz = anchor_rt[:3, -1] | |
| anchor_sph = cartesian_to_spherical(anchor_xyz) | |
| jdata['obs'][anchor_vid]['sph'] = anchor_sph.tolist() | |
| if export_xyz: | |
| jdata['obs'][anchor_vid]['xyz'] = { | |
| 'x': anchor_xyz[0], | |
| 'y': anchor_xyz[1], | |
| 'z': anchor_xyz[2] | |
| } | |
| for i in range(0, len(target_vids)): | |
| target_vid = target_vids[i] | |
| rel_sph = np.array(pred_sphs[i]) | |
| opack = { | |
| 'img_path': f'{target_vid:03d}.png', | |
| 'rel_sph': rel_sph.tolist() | |
| } | |
| for key in aux_data: | |
| opack[key] = aux_data[key][i+1] | |
| if anchor_sph is not None: | |
| target_sph = anchor_sph + rel_sph | |
| if export_xyz: | |
| target_xyz = spherical_to_cartesian(target_sph) | |
| opack['xyz'] = { | |
| 'x': target_xyz[0], | |
| 'y': target_xyz[1], | |
| 'z': target_xyz[2] | |
| } | |
| target_rt = None | |
| if os.path.exists(os.path.join(obj_root, 'poses', f'{target_vid:03d}.npy')): | |
| target_rt = np.load(os.path.join(obj_root, 'poses', f'{target_vid:03d}.npy')) | |
| elif os.path.exists(os.path.join(obj_root, 'poses', f'{target_vid:03d}.txt')): | |
| target_rt = np.loadtxt(os.path.join(obj_root, 'poses', f'{target_vid:03d}.txt')) | |
| if target_rt is not None: | |
| if export_xyz: | |
| opack['gt_xyz'] = { | |
| 'x': target_rt[0, -1], | |
| 'y': target_rt[1, -1], | |
| 'z': target_rt[2, -1] | |
| } | |
| gt_rel_sph = relative_spherical(target_rt[:3, -1], anchor_rt[:3, -1]) | |
| opack['gt_rel_sph'] = gt_rel_sph.tolist() | |
| jdata['obs'][target_vid] = opack | |
| return jdata |