|
import numpy as np |
|
import pandas as pd |
|
|
|
class BVHWriter(): |
|
def __init__(self): |
|
pass |
|
|
|
def write(self, X, ofile): |
|
|
|
|
|
ofile.write('HIERARCHY\n') |
|
|
|
self.motions_ = [] |
|
self._printJoint(X, X.root_name, 0, ofile) |
|
|
|
|
|
ofile.write('MOTION\n') |
|
ofile.write('Frames: %d\n'%X.values.shape[0]) |
|
ofile.write('Frame Time: %f\n'%X.framerate) |
|
|
|
|
|
self.motions_ = np.asarray(self.motions_).T |
|
lines = [" ".join(item) for item in self.motions_.astype(str)] |
|
ofile.write("".join("%s\n"%l for l in lines)) |
|
|
|
def _printJoint(self, X, joint, tab, ofile): |
|
|
|
if X.skeleton[joint]['parent'] == None: |
|
ofile.write('ROOT %s\n'%joint) |
|
elif len(X.skeleton[joint]['children']) > 0: |
|
ofile.write('%sJOINT %s\n'%('\t'*(tab), joint)) |
|
else: |
|
ofile.write('%sEnd site\n'%('\t'*(tab))) |
|
|
|
ofile.write('%s{\n'%('\t'*(tab))) |
|
|
|
ofile.write('%sOFFSET %3.5f %3.5f %3.5f\n'%('\t'*(tab+1), |
|
X.skeleton[joint]['offsets'][0], |
|
X.skeleton[joint]['offsets'][1], |
|
X.skeleton[joint]['offsets'][2])) |
|
channels = X.skeleton[joint]['channels'] |
|
n_channels = len(channels) |
|
|
|
if n_channels > 0: |
|
for ch in channels: |
|
self.motions_.append(np.asarray(X.values['%s_%s'%(joint, ch)].values)) |
|
|
|
if len(X.skeleton[joint]['children']) > 0: |
|
ch_str = ''.join(' %s'*n_channels%tuple(channels)) |
|
ofile.write('%sCHANNELS %d%s\n' %('\t'*(tab+1), n_channels, ch_str)) |
|
|
|
for c in X.skeleton[joint]['children']: |
|
self._printJoint(X, c, tab+1, ofile) |
|
|
|
ofile.write('%s}\n'%('\t'*(tab))) |
|
|