Talking_Head_Anime_3 / tha3 /mocap /ifacialmocap_v2.py
Harry_FBK
Clone original THA3
60094bd
raw
history blame
4.05 kB
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