import numpy as np class Joint: def __init__(self, name, parent=None, children=None): self.name = name self.parent = parent self.children = children class MocapData: def __init__(self): self.skeleton = {} self.values = None self.channel_names = [] self.framerate = 0.0 self.root_name = "" self.take_name = "" def traverse(self, j=None): stack = [self.root_name] while stack: joint = stack.pop() yield joint for c in self.skeleton[joint]["children"]: stack.append(c) def clone(self): import copy new_data = MocapData() new_data.skeleton = copy.deepcopy(self.skeleton) new_data.values = copy.deepcopy(self.values) new_data.channel_names = copy.deepcopy(self.channel_names) new_data.root_name = copy.deepcopy(self.root_name) new_data.framerate = copy.deepcopy(self.framerate) if hasattr(self, "take_name"): new_data.take_name = copy.deepcopy(self.take_name) return new_data def get_all_channels(self): """Returns all of the channels parsed from the file as a 2D numpy array""" frames = [f[1] for f in self.values] return np.asarray([[channel[2] for channel in frame] for frame in frames]) def get_skeleton_tree(self): tree = [] root_key = [j for j in self.skeleton if self.skeleton[j]["parent"] == None][0] root_joint = Joint(root_key) def get_empty_channels(self): # TODO pass def get_constant_channels(self): # TODO pass