def createAnimationTrack(self, jointsOrder=None, name="BVHMotion"): """ Create an animation track from the motion stored in this BHV file. """ if jointsOrder == None: jointsData = [ joint.matrixPoses for joint in self.getJoints() if not joint.isEndConnector() ] # We leave out end effectors as they should not have animation data else: nFrames = self.frameCount import re # Remove the tail from duplicate bone names for idx, jName in enumerate(jointsOrder): # Joint mappings can contain a rotation compensation if isinstance(jName, tuple): jName, _ = jName if not jName: continue r = re.search("(.*)_\d+$", jName) if r: jointsOrder[idx] = r.group(1) jointsData = [] for jointName in jointsOrder: if isinstance(jointName, tuple): jointName, angle = jointName else: angle = 0.0 if jointName: poseMats = self.getJointByCanonicalName( jointName).matrixPoses.copy() if isinstance(angle, float): if angle != 0.0: # Rotate around global Z axis rot = tm.rotation_matrix(-angle * D, [0, 0, 1]) # Roll around global Y axis (this is a limitation) roll = tm.rotation_matrix(angle * D, [0, 1, 0]) for i in xrange(nFrames): # TODO make into numpy loop poseMats[i] = np.dot(poseMats[i], rot) poseMats[i] = np.dot(poseMats[i], roll) else: # Compensation (angle) is a transformation matrix # Compensate animation frames for i in xrange(nFrames): # TODO make into numpy loop poseMats[i] = np.mat(poseMats[i]) * np.mat(angle) #poseMats[i] = np.mat(angle) # Test compensated rest pose jointsData.append(poseMats) else: jointsData.append(animation.emptyTrack(nFrames)) nJoints = len(jointsData) nFrames = len(jointsData[0]) # Interweave joints animation data, per frame with joints in breadth-first order animData = np.hstack(jointsData).reshape(nJoints * nFrames, 4, 4) framerate = 1.0 / self.frameTime return animation.AnimationTrack(name, animData, nFrames, framerate)
def _createAnimation(jointsData, name, frameTime, nFrames): nJoints = len(jointsData) #nFrames = len(jointsData[0]) # Interweave joints animation data, per frame with joints in breadth-first order animData = np.hstack(jointsData).reshape(nJoints * nFrames, 3, 4) framerate = 1.0 / frameTime return animation.AnimationTrack(name, animData, nFrames, framerate)