Spaces:
Sleeping
Sleeping
import math | |
from tha3.mocap.ifacialmocap_constants import BLENDSHAPE_NAMES, HEAD_BONE_X, HEAD_BONE_Y, HEAD_BONE_Z, \ | |
RIGHT_EYE_BONE_X, RIGHT_EYE_BONE_Y, RIGHT_EYE_BONE_Z, LEFT_EYE_BONE_X, LEFT_EYE_BONE_Y, LEFT_EYE_BONE_Z, \ | |
HEAD_BONE_QUAT, LEFT_EYE_BONE_QUAT, RIGHT_EYE_BONE_QUAT | |
IFACIALMOCAP_PORT = 49983 | |
IFACIALMOCAP_START_STRING = "iFacialMocap_sahuasouryya9218sauhuiayeta91555dy3719|sendDataVersion=v2".encode('utf-8') | |
def parse_ifacialmocap_v2_pose(ifacialmocap_output): | |
output = {} | |
parts = ifacialmocap_output.split("|") | |
for part in parts: | |
part = part.strip() | |
if len(part) == 0: | |
continue | |
if "&" in part: | |
components = part.split("&") | |
assert len(components) == 2 | |
key = components[0] | |
value = float(components[1]) / 100.0 | |
if key.endswith("_L"): | |
key = key[:-2] + "Left" | |
elif key.endswith("_R"): | |
key = key[:-2] + "Right" | |
if key in BLENDSHAPE_NAMES: | |
output[key] = value | |
elif part.startswith("=head#"): | |
components = part[len("=head#"):].split(",") | |
assert len(components) == 6 | |
output[HEAD_BONE_X] = float(components[0]) * math.pi / 180 | |
output[HEAD_BONE_Y] = float(components[1]) * math.pi / 180 | |
output[HEAD_BONE_Z] = float(components[2]) * math.pi / 180 | |
elif part.startswith("rightEye#"): | |
components = part[len("rightEye#"):].split(",") | |
output[RIGHT_EYE_BONE_X] = float(components[0]) * math.pi / 180 | |
output[RIGHT_EYE_BONE_Y] = float(components[1]) * math.pi / 180 | |
output[RIGHT_EYE_BONE_Z] = float(components[2]) * math.pi / 180 | |
elif part.startswith("leftEye#"): | |
components = part[len("leftEye#"):].split(",") | |
output[LEFT_EYE_BONE_X] = float(components[0]) * math.pi / 180 | |
output[LEFT_EYE_BONE_Y] = float(components[1]) * math.pi / 180 | |
output[LEFT_EYE_BONE_Z] = float(components[2]) * math.pi / 180 | |
output[HEAD_BONE_QUAT] = [0.0, 0.0, 0.0, 1.0] | |
output[LEFT_EYE_BONE_QUAT] = [0.0, 0.0, 0.0, 1.0] | |
output[RIGHT_EYE_BONE_QUAT] = [0.0, 0.0, 0.0, 1.0] | |
return output | |
def parse_ifacialmocap_v1_pose(ifacialmocap_output): | |
output = {} | |
parts = ifacialmocap_output.split("|") | |
for part in parts: | |
part = part.strip() | |
if len(part) == 0: | |
continue | |
if part.startswith("=head#"): | |
components = part[len("=head#"):].split(",") | |
assert len(components) == 6 | |
output[HEAD_BONE_X] = float(components[0]) * math.pi / 180 | |
output[HEAD_BONE_Y] = float(components[1]) * math.pi / 180 | |
output[HEAD_BONE_Z] = float(components[2]) * math.pi / 180 | |
elif part.startswith("rightEye#"): | |
components = part[len("rightEye#"):].split(",") | |
output[RIGHT_EYE_BONE_X] = float(components[0]) * math.pi / 180 | |
output[RIGHT_EYE_BONE_Y] = float(components[1]) * math.pi / 180 | |
output[RIGHT_EYE_BONE_Z] = float(components[2]) * math.pi / 180 | |
elif part.startswith("leftEye#"): | |
components = part[len("leftEye#"):].split(",") | |
output[LEFT_EYE_BONE_X] = float(components[0]) * math.pi / 180 | |
output[LEFT_EYE_BONE_Y] = float(components[1]) * math.pi / 180 | |
output[LEFT_EYE_BONE_Z] = float(components[2]) * math.pi / 180 | |
else: | |
components = part.split("-") | |
assert len(components) == 2 | |
key = components[0] | |
value = float(components[1]) / 100.0 | |
if key.endswith("_L"): | |
key = key[:-2] + "Left" | |
elif key.endswith("_R"): | |
key = key[:-2] + "Right" | |
if key in BLENDSHAPE_NAMES: | |
output[key] = value | |
output[HEAD_BONE_QUAT] = [0.0, 0.0, 0.0, 1.0] | |
output[LEFT_EYE_BONE_QUAT] = [0.0, 0.0, 0.0, 1.0] | |
output[RIGHT_EYE_BONE_QUAT] = [0.0, 0.0, 0.0, 1.0] | |
return output | |