|
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 |
|
|
|
|