def get_positions_and_transformations(self, raw_data, mirrored=False): data = np.swapaxes(np.squeeze(raw_data), -1, 0) if data.shape[-1] == 73: positions, root_x, root_z, root_r = data[:, 3:-7], data[:, -7], data[:, -6], data[:, -5] elif data.shape[-1] == 66: positions, root_x, root_z, root_r = data[:, :-3], data[:, -3], data[:, -2], data[:, -1] else: raise AssertionError('Input data format not understood') num_frames = len(positions) positions_local = positions.reshape((num_frames, -1, 3)) if mirrored: positions_local[:, self.joints_left], positions_local[:, self.joints_right] = \ positions_local[:, self.joints_right], positions_local[:, self.joints_left] positions_local[:, :, [0, 2]] = -positions_local[:, :, [0, 2]] positions_world = np.zeros_like(positions_local) num_joints = positions_world.shape[1] trajectory = np.empty((num_frames, 3)) orientations = np.empty(num_frames) rotations = np.zeros((num_frames, num_joints - 1, 4)) cum_rotations = np.zeros((num_frames, 4)) rotations_euler = np.zeros((num_frames, num_joints - 1, 3)) cum_rotations_euler = np.zeros((num_frames, 3)) translations = np.zeros((num_frames, num_joints, 3)) cum_translations = np.zeros((num_frames, 3)) offsets = [] for t in range(num_frames): positions_world[t, :, :] = (Quaternions(cum_rotations[t - 1]) if t > 0 else Quaternions.id(1)) * \ positions_local[t] positions_world[t, :, 0] = positions_world[t, :, 0] + (cum_translations[t - 1, 0] if t > 0 else 0) positions_world[t, :, 2] = positions_world[t, :, 2] + (cum_translations[t - 1, 2] if t > 0 else 0) trajectory[t] = positions_world[t, 0] # if t > 0: # rotations[t, 1:] = Quaternions.between(positions_world[t - 1, 1:], positions_world[t, 1:]).qs # else: # rotations[t, 1:] = Quaternions.id(positions_world.shape[1] - 1).qs limbs = positions_world[t, 1:] - positions_world[t, self.joint_parents[1:]] rotations[t] = Quaternions.between(self.joint_offsets[1:], limbs) # limb_recons = Quaternions(rotations[t, 1:]) * self._offsets[1:] # test_limbs = np.setdiff1d(np.arange(20), [12, 16]) # if np.max(np.abs(limb_recons[test_limbs] - limbs[test_limbs])) > 1e-6: # temp = 1 rotations_euler[t] = Quaternions(rotations[t]).euler('yzx') orientations[t] = -root_r[t] # rotations[t, 0] = Quaternions.from_angle_axis(-root_r[t], np.array([0, 1, 0])).qs # rotations_euler[t, 0] = Quaternions(rotations[t, 0]).euler('yzx') cum_rotations[t] = (Quaternions.from_angle_axis(orientations[t], np.array([0, 1, 0])) * (Quaternions(cum_rotations[t - 1]) if t > 0 else Quaternions.id(1))).qs # cum_rotations[t] = (Quaternions(rotations[t, 0]) * # (Quaternions(cum_rotations[t - 1]) if t > 0 else Quaternions.id(1))).qs cum_rotations_euler[t] = Quaternions(cum_rotations[t]).euler('yzx') offsets.append(Quaternions(cum_rotations[t]) * np.array([0, 0, 1])) translations[t, 0] = Quaternions(cum_rotations[t]) * np.array([root_x[t], 0, root_z[t]]) cum_translations[t] = (cum_translations[t - 1] if t > 0 else np.zeros((1, 3))) + translations[t, 0] # limb_lengths = np.zeros((num_frames, 20)) return positions_local, positions_world, trajectory, orientations, rotations, rotations_euler, \ translations, cum_rotations, cum_rotations_euler, cum_translations, offsets
def get_positions_and_transformations(self, raw_data, mirrored=False): data = np.swapaxes(np.squeeze(raw_data), -1, 0) if data.shape[-1] == 73: positions, root_x, root_z, root_r = data[:, 3: -7], data[:, -7], data[:, -6], data[:, -5] elif data.shape[-1] == 66: positions, root_x, root_z, root_r = data[:, : -3], data[:, -3], data[:, -2], data[:, -1] else: raise AssertionError('Input data format not understood') num_frames = len(positions) positions_local = positions.reshape((num_frames, -1, 3)) # positions_local[:, 11:13, [0, 2]] += 2. * (positions_local[:, 10:11, [0, 2]] - positions_local[:, 11:12, [0, 2]]) # positions_local[:, 12, [0, 2]] = 2. * positions_local[:, 11, [0, 2]] - positions_local[:, 12, [0, 2]] # positions_local[:, 13:17, 0] += \ # np.sqrt( # np.sum(np.square(positions_local[:, 13:14, [0, 2]] - # positions_local[:, 10:11, [0, 2]]), axis=-1) -\ # np.square(0.8) # ) + positions_local[:, 10:11, 0] - positions_local[:, 13:14, 0] # positions_local[:, 13:17, 2] += positions_local[:, 10:11, 2] + 0.8 - positions_local[:, 13:14, 2] # positions_local[:, 17:, 0] += \ # positions_local[:, 10:11, 0] - \ # np.sqrt( # np.sum(np.square(positions_local[:, 17:18, [0, 2]] - # positions_local[:, 10:11, [0, 2]]), axis=-1) -\ # np.square(0.5) # ) - positions_local[:, 17:18, 0] # positions_local[:, 17:, 2] += positions_local[:, 10:11, 2] + 0.5 - positions_local[:, 17:18, 2] if mirrored: positions_local[:, self.joints_left], positions_local[:, self.joints_right] = \ positions_local[:, self.joints_right], positions_local[:, self.joints_left] positions_local[:, :, [0, 2]] = -positions_local[:, :, [0, 2]] positions_world = np.zeros_like(positions_local) num_joints = positions_world.shape[1] trajectory = np.empty((num_frames, 3)) orientations = np.empty(num_frames) rotations = np.zeros((num_frames, num_joints - 1, 4)) cum_rotations = np.zeros((num_frames, 4)) rotations_euler = np.zeros((num_frames, num_joints - 1, 3)) cum_rotations_euler = np.zeros((num_frames, 3)) translations = np.zeros((num_frames, num_joints, 3)) cum_translations = np.zeros((num_frames, 3)) offsets = [] limbs_all = [] for t in range(num_frames): positions_world[t, :, :] = (Quaternions(cum_rotations[t - 1]) if t > 0 else Quaternions.id(1)) * \ positions_local[t] positions_world[t, :, 0] = positions_world[t, :, 0] + ( cum_translations[t - 1, 0] if t > 0 else 0) positions_world[t, :, 2] = positions_world[t, :, 2] + ( cum_translations[t - 1, 2] if t > 0 else 0) trajectory[t] = positions_world[t, 0] # if t > 0: # rotations[t, 1:] = Quaternions.between(positions_world[t - 1, 1:], positions_world[t, 1:]).qs # else: # rotations[t, 1:] = Quaternions.id(positions_world.shape[1] - 1).qs limbs = positions_world[t, 1:] - positions_world[ t, self.joint_parents[1:]] rotations[t] = Quaternions.between(self.joint_offsets[1:], limbs) limbs_all.append(limbs) # limb_recons = Quaternions(rotations[t, 1:]) * self._offsets[1:] # test_limbs = np.setdiff1d(np.arange(20), [12, 16]) # if np.max(np.abs(limb_recons[test_limbs] - limbs[test_limbs])) > 1e-6: # temp = 1 rotations_euler[t] = Quaternions(rotations[t]).euler('yzx') orientations[t] = -root_r[t] # rotations[t, 0] = Quaternions.from_angle_axis(-root_r[t], np.array([0, 1, 0])).qs # rotations_euler[t, 0] = Quaternions(rotations[t, 0]).euler('yzx') cum_rotations[t] = (Quaternions.from_angle_axis( orientations[t], np.array([0, 1, 0])) * (Quaternions( cum_rotations[t - 1]) if t > 0 else Quaternions.id(1))).qs # cum_rotations[t] = (Quaternions(rotations[t, 0]) * # (Quaternions(cum_rotations[t - 1]) if t > 0 else Quaternions.id(1))).qs cum_rotations_euler[t] = Quaternions(cum_rotations[t]).euler('yzx') offsets.append(Quaternions(cum_rotations[t]) * np.array([0, 0, 1])) translations[t, 0] = Quaternions(cum_rotations[t]) * np.array( [root_x[t], 0, root_z[t]]) cum_translations[t] = (cum_translations[t - 1] if t > 0 else np.zeros((1, 3))) + translations[t, 0] # limb_lengths = limbs_all = np.stack(limbs_all) self.save_as_bvh(np.expand_dims(positions_world[:, 0], 0), np.expand_dims(orientations.reshape(-1, 1), 0), np.expand_dims(rotations, 0), dataset_name='edin', subset_name='test') return positions_local, positions_world, trajectory, orientations, rotations, rotations_euler, \ translations, cum_rotations, cum_rotations_euler, cum_translations, offsets