Spaces:
Runtime error
Runtime error
import numpy as np | |
import pandas as pd | |
class BVHWriter(): | |
def __init__(self): | |
pass | |
def write(self, X, ofile, framerate=-1, start=0, stop=-1): | |
# Writing the skeleton info | |
ofile.write('HIERARCHY\n') | |
self.motions_ = [] | |
self._printJoint(X, X.root_name, 0, ofile) | |
if stop > 0: | |
nframes = stop-start | |
else: | |
nframes = X.values.shape[0] | |
stop = X.values.shape[0] | |
# Writing the motion header | |
ofile.write('MOTION\n') | |
ofile.write('Frames: %d\n'%nframes) | |
if framerate > 0: | |
ofile.write('Frame Time: %f\n'%float(1.0/framerate)) | |
else: | |
ofile.write('Frame Time: %f\n'%X.framerate) | |
# Writing the data | |
self.motions_ = np.asarray(self.motions_).T | |
lines = [" ".join(item) for item in self.motions_[start:stop].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])) | |
rot_order = X.skeleton[joint]['order'] | |
#print("rot_order = " + rot_order) | |
channels = X.skeleton[joint]['channels'] | |
rot = [c for c in channels if ('rotation' in c)] | |
pos = [c for c in channels if ('position' in c)] | |
n_channels = len(rot) +len(pos) | |
ch_str = '' | |
if n_channels > 0: | |
for ci in range(len(pos)): | |
cn = pos[ci] | |
self.motions_.append(np.asarray(X.values['%s_%s'%(joint,cn)].values)) | |
ch_str = ch_str + ' ' + cn | |
for ci in range(len(rot)): | |
cn = '%srotation'%(rot_order[ci]) | |
self.motions_.append(np.asarray(X.values['%s_%s'%(joint,cn)].values)) | |
ch_str = ch_str + ' ' + cn | |
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))) | |