vid2rig / rotutil.py
BladeSzaSza's picture
Upload folder using huggingface_hub
3d348c4 verified
Raw
History Blame Contribute Delete
741 Bytes
import numpy as np
from scipy.spatial.transform import Rotation as R, Slerp
def aa_to_quat(aa: np.ndarray) -> np.ndarray:
flat = aa.reshape(-1, 3)
q = R.from_rotvec(flat).as_quat() # xyzw
return q.reshape(*aa.shape[:-1], 4)
def fix_hemisphere(quats: np.ndarray) -> np.ndarray:
out = quats.copy()
for i in range(1, len(out)):
if np.dot(out[i], out[i - 1]) < 0:
out[i] = -out[i]
return out
def slerp_series(quats: np.ndarray, src_t: np.ndarray, dst_t: np.ndarray) -> np.ndarray:
if len(quats) == 1:
return np.repeat(quats, len(dst_t), axis=0)
slerp = Slerp(src_t, R.from_quat(quats))
clamped = np.clip(dst_t, src_t[0], src_t[-1])
return slerp(clamped).as_quat()