ObjCtrl-2.5D / objctrl_2_5d /utils /customized_cam.py
wzhouxiff
init
38e3f9b
raw
history blame
2.61 kB
import numpy as np
def rotation(num_poses, rotation_angle=360, radius=1.0, height=0.81):
'''
Input:
num_poses: number of poses
rotation_angle: angle of rotation in degrees
radius: radius of rotation
height: height of the camera above the ground
Output:
poses: list of rotation matrices and translation vectors
'''
poses = []
rotation_angle_rad = np.deg2rad(rotation_angle)
angle_step = rotation_angle_rad / num_poses
for i in range(num_poses):
theta = i * angle_step
# Rotation matrix
R = np.array([
[np.cos(theta), 0, np.sin(theta)],
[0, 1, 0],
[-np.sin(theta), 0, np.cos(theta)]
])
# Translation vector
t = np.array([0.01 * np.sin(theta), 0, height - 0.01 * np.cos(theta)])
# Combine rotation matrix and translation vector into RT matrix
RT = np.hstack((R, t.reshape(-1, 1)))
poses.append(RT)
poses = np.stack(poses, axis=0)
return poses
def clockwise(angle, n_frames):
# Convert angle to radians
angle_rad = np.deg2rad(angle)
# Determine the direction of rotation based on the sign of the angle
if angle_rad < 0:
clockwise = True
angle_rad = -angle_rad # Make the angle positive for calculation
else:
clockwise = False
# Generate rotation matrices for each frame
rotation_matrices = []
for i in range(n_frames):
theta = i * angle_rad / (n_frames - 1)
if clockwise:
theta = -theta
R = np.array([
[np.cos(theta), -np.sin(theta), 0],
[np.sin(theta), np.cos(theta), 0],
[0, 0, 1]
])
rotation_matrices.append(R)
# Generate translation vectors (assuming no translation)
translation_vectors = [np.zeros((3, 1)) for _ in range(n_frames)]
# Combine rotation matrices and translation vectors into RT matrices
RT_matrices = []
for R, T in zip(rotation_matrices, translation_vectors):
RT = np.hstack((R, T))
RT_matrices.append(RT)
RT_matrices = np.stack(RT_matrices, axis=0)
return RT_matrices
def pan_and_zoom(T, speed, base_T=1.5, n=16):
RT = []
for i in range(n):
R = np.array([[1.0, 0.0, 0.0],
[0, 1.0, 0.0],
[0.0, 0.0, 1.0]])
_T=(i/n)*speed*base_T*(T[i])
_RT = np.concatenate([R,_T], axis=1)
RT.append(_RT)
RT = np.stack(RT)
return RT