def get_bvh_offsets_and_animation(file_name, frame_number): with open(file_name) as f: mocap = Bvh(f.read()) mocap_joint_names = mocap.get_joints_names() mocap_joint_prefix = mocap_joint_names[0].split('Hips')[0] rotation_matrices = np.empty((1, 3, 3), dtype=float) offsets = np.empty((1, 3), dtype=float) root_position = mocap.frame_joint_channels( frame_number, mocap_joint_names[0], ['Xposition', 'Yposition', 'Zposition']) for name in joint_names: # predefined joint_names mocap_joint_name = mocap_joint_prefix + name euler = mocap.frame_joint_channels( frame_number, mocap_joint_name, ['Xrotation', 'Yrotation', 'Zrotation']) # print(name, euler) # rot = R.from_euler('xyz', euler, degrees=False) # Previous models are trained for wrong rotations rot = R.from_euler('XYZ', euler, degrees=True) # should we use 'XYZ', degrees=True? rot = np.array(rot.as_matrix()) rot = rot.reshape(1, 3, 3) rotation_matrices = np.append(rotation_matrices, rot, axis=0) offset = np.array(mocap.joint_offset(mocap_joint_name)) offsets = np.append(offsets, offset.reshape(1, 3), axis=0) # print('{}:\nRotationMatrix:\n'.format(name), rot[0], '\nOffset: ', offset.reshape(3, )) offsets = np.delete(offsets, [0, 0], axis=0) rotation_matrices = np.delete(rotation_matrices, [0, 0, 0], axis=0) return offsets, rotation_matrices, root_position #[3], [J, 3], [J, 3]
def load_from_bvh(self, fname, exclude_bones=None, spec_channels=None): if exclude_bones is None: exclude_bones = {} if spec_channels is None: spec_channels = dict() with open(fname) as f: mocap = Bvh(f.read()) joint_names = list( filter(lambda x: all([t not in x for t in exclude_bones]), mocap.get_joints_names())) dof_ind = {'x': 0, 'y': 1, 'z': 2} self.len_scale = 0.0254 self.root = Bone() self.root.id = 0 self.root.name = joint_names[0] self.root.channels = mocap.joint_channels(self.root.name) self.name2bone[self.root.name] = self.root self.bones.append(self.root) for i, joint in enumerate(joint_names[1:]): bone = Bone() bone.id = i + 1 bone.name = joint bone.channels = spec_channels[joint] if joint in spec_channels.keys( ) else mocap.joint_channels(joint) bone.dof_index = [dof_ind[x[0].lower()] for x in bone.channels] bone.offset = np.array(mocap.joint_offset(joint)) * self.len_scale bone.lb = [-180.0] * 3 bone.ub = [180.0] * 3 self.bones.append(bone) self.name2bone[joint] = bone for bone in self.bones[1:]: parent_name = mocap.joint_parent(bone.name).name if parent_name in self.name2bone.keys(): bone_p = self.name2bone[parent_name] bone_p.child.append(bone) bone.parent = bone_p self.forward_bvh(self.root) for bone in self.bones: if len(bone.child) == 0: bone.end = bone.pos + np.array([ float(x) for x in mocap.get_joint(bone.name).children[-1]['OFFSET'] ]) * self.len_scale else: bone.end = sum([bone_c.pos for bone_c in bone.child]) / len(bone.child)
def test_joints_names(self): with open('tests/test_mocapbank.bvh') as f: mocap = Bvh(f.read()) self.assertEqual(mocap.get_joints_names()[17], 'RightKnee')
class MotionClip(object): def __init__(self, mocap_file: str, constraints_file: str): with open(mocap_file) as f: self.mocap = Bvh(f.read()) with open(constraints_file) as f: content = f.readlines() content = [x.strip() for x in content] content = [x.split() for x in content] channel_mapping = ['Xrotation', 'Yrotation', 'Zrotation'] self.mapping = {} for joint in content: self.mapping[joint[0]] = [] for i in range(1, 4): if (joint[i] != '0'): self.mapping[joint[0]].append( (channel_mapping[i - 1], joint[i].lower())) def get_pose(self, time: float): pose = {} frame = math.floor(time / self.mocap.frame_time) if frame >= self.mocap.nframes: print("(get_pose) frame >= " + str(frame >= self.mocap.nframes)) return None # print("(get_pose) FN : ", time , frame) for joint in self.mocap.get_joints_names(): for channel in self.mapping[joint]: curr_angle = self.mocap.frame_joint_channel( frame, joint, channel[0]) pose[str(channel[1]).lower()] = curr_angle # pose["lle1"] = 0 # pose["rle1"] = 0 # pose["lle2"] = 0 # pose["rle2"] = 0 return pose def similarity(self, time, actual_pose, keys): target_pose = self.get_pose(time) if target_pose is not None: ret = self.get_pose(time + self.mocap.frame_time) for joint in ret: # if joint in [ # "he2", # "lae1", # "lle3", # "lle4", # "lle5", # "rae1", # "rle3", # "rle4", # "rle5", # ]: # ret[joint] *= -1 ret[joint] = np.clip(ret[joint], clip_limits[joint][0], clip_limits[joint][1]) # if joint in blacklist: # ret[joint] = 0 return ret, self.euclead_distance(actual_pose, target_pose, keys) def euclead_distance(self, a, b, keys): ans = 0 for x in b.keys(): if x in keys: # if x in [ # "he2", # "lae1", # "lle3", # "lle4", # "lle5", # "rae1", # "rle3", # "rle4", # "rle5", # ]: # b[x] *= -1 b[x] = np.clip(b[x], clip_limits[x][0], clip_limits[x][1]) # print("(Diff) ", x, a[x], b[x]) ans += (a[x] - b[x]) * (a[x] - b[x]) return ans
from bvh import Bvh with open('../Data/BVH/Vasso_Miserable_0.bvh') as data: mocap = Bvh(data.read()) #Get Mocap Tree tree = [str(item) for item in mocap.root] #['HIERARCHY', 'ROOT Hips', 'MOTION', 'Frames: 1068', 'Frame Time: 0.0333333'] #Get ROOT OFFSET root = next(mocap.root.filter('ROOT'))['OFFSET'] #['3.93885', '96.9818', '-23.2913'] #Get all JOINT names joints = mocap.get_joints_names() #54 mocap.get_joints_names()[17] #All Names mocap.joint_offset('Head') #Offset mocap.joint_channels('Neck') #Channels mocap.get_joint_channels_index('Spine') # mocap.joint_parent_index('Neck') #Parent Index mocap.joint_parent('Head').name # Parent Name #mocap.joint_direct_children('Hips') #Direct Children #Get Frames mocap.nframes mocap.frame_time mocap.frame_joint_channel(22, 'Spine', 'Xrotation') #SEARCH [str(node) for node in mocap.search('JOINT', 'LeftShoulder')] #Single Item
from bvh import Bvh with open('Male2_A1_Stand.bvh') as f: mocap = Bvh(f.read()) for name in mocap.get_joints_names(): print(name + " : ", mocap.frame_joint_channels(0, name, mocap.joint_channels(name)))
prev_frame = 0 k = 0.5 with open('../processed/test.skl', 'w') as f: f.write(start_skill_str + "\n") for frame in range(0, min(mocap.nframes, 120), 3): # print(frame, mocap.frame_joint_channel(frame, "LeftThigh", "Xrotation"), mocap.frame_joint_channel(frame, "LeftThigh", "Yrotation"), mocap.frame_joint_channel(frame, "LeftThigh", "Zrotation")) if (frame == 0): frame_data_str = "settar " else: frame_data_str = "inctar " wait_frame_str = "wait " + str( round(k * mocap.frame_time * (frame - prev_frame), 1)) + " end\n" write = False for joint in mocap.get_joints_names(): for channel in mapping[joint]: this_frame_val = mocap.frame_joint_channel( frame, joint, channel[0]) if frame == 0: prev_frame_val = 0 else: prev_frame_val = mocap.frame_joint_channel( prev_frame, joint, channel[0]) print(frame, prev_frame, channel, this_frame_val, prev_frame_val) if "A" not in channel[1] and abs(this_frame_val - prev_frame_val) > theta: write = True frame_data_str += " " + str(channel[1]) + " " + str(