Diff-TTSG / pymo /writers.py
Shivam Mehta
Adding code
3c10b34
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)))