- UDP로 데이터를 받는 방법

PC 쪽에서 iOS 쪽 포트 49993으로 “FACEMOTION3D_OtherStreaming” 문자열을 보내면 Facemotion3d가 UDP로 60FPS 데이터를 포트 49993에 반환합니다.

- Python 예제

from socket import *
DstIP = "192.168.1.7"
DstPort = 49993
DstAddr = (DstIP,DstPort)
udpClntSock = socket(AF_INET, SOCK_DGRAM)
data = "FACEMOTION3D_OtherStreaming"
data = data.encode('utf-8')
udpClntSock.sendto(data,DstAddr)
server = socket(AF_INET, SOCK_DGRAM)
server.bind(("", 49983))
server.settimeout(0.05)

while True:
    try:
        messages, address = server.recvfrom(8192)
        print(messages.decode('utf-8'))
    except:
        pass

- 프레임마다 전송되는 문자열은 다음과 같습니다.

eyeLookOutLeft&3|mouthPressRight&14|jawForward&8|browInnerUp&19|jawLeft&4|mouthShrugUpper&28|eyeSquintLeft&4|eyeWideLeft&0|mouthPucker&5|mouthLowerDownLeft&6|eyeBlinkLeft&29|mouthShrugLower&20|mouthSmileLeft&0|cheekSquintRight&9|eyeWideRight&0|mouthFunnel&4|mouthStretchRight&13|browDownRight&2|tongueOut&0|cheekSquintLeft&8|mouthStretchLeft&17|mouthUpperUpRight&10|noseSneerLeft&28|browOuterUpLeft&0|eyeLookInRight&15|mouthDimpleRight&7|mouthRollUpper&5|mouthLowerDownRight&6|mouthClose&6|mouthFrownLeft&3|eyeBlinkRight&29|mouthFrownRight&2|mouthUpperUpLeft&11|browDownLeft&1|eyeLookOutRight&0|cheekPuff&4|eyeLookInLeft&0|mouthDimpleLeft&8|eyeLookDownLeft&36|eyeSquintRight&4|mouthRollLower&7|eyeLookUpLeft&0|eyeLookUpRight&0|mouthSmileRight&0|jawRight&0|noseSneerRight&25|mouthPressLeft&13|jawOpen&4|browOuterUpRight&0|eyeLookDownRight&36|mouthLeft&1|mouthRight&0|FM_SAD&0|FM_ANGRY&0|FM_VF&0|FM_TH&0|FM_browUpRight&0|FM_browUpLeft&0|=head#-22.167973,0.45402408,-4.8798294,-0.039975993,-0.048437987,-0.45562273|rightEye#12.759762,5.527712,1.2244859|leftEye#12.862795,1.264116,0.28145725|

- 프레임마다 전송되는 문자열은 다음과 같습니다.

BlendShape Name&Parameters (0 ~ 100) | BlendShape Names-Parameters (0 ~ 100) | .... | = head # Euler angles X (degree), Euler angles Y, Euler angles Z, Position values X, Position values Y, Position values Z | rightEye #Euler angles X, Euler angles Y, Euler angles Z | leftEye #Euler angles X, Euler angles Y, Euler angles Z |

파라미터에는 음수 값이 포함되거나 100을 초과할 수 있습니다.

각도 관련 데이터는 라디안이 아니라 degree로 전송됩니다.

- TCP/IP로 데이터를 받는 방법

UDP에서는 프레임이 누락될 수 있으므로 TCP/IP로 수신하는 방법도 있습니다.

UDP로 iOS 쪽 포트 49993에 “FACEMOTION3D_OtherStreaming|protocol=tcp” 문자열을 보내면 데이터가 PC 쪽 포트 49986으로 전송됩니다.

전송되는 문자열은 UDP 전송 시의 문자열 끝에 “___FACEMOTION3D”를 추가한 형태입니다.

-sample

BlendShape Name&Parameter (0 ~ 100) | BlendShape Name-Parameter (0 ~ 100) | .... | = head # Euler angles X, Euler angles Y, Euler angles Z, moving values X, moving values Y, moving values Z | rightEye #Euler angles X, Euler angles Y, Euler angles Z | leftEye #Euler angles X, Euler angles Y, Euler angles Z | ___ Facemotion3d

TCP/IP로 iOS에서 PC로 수신할 때 프레임 단위로 나뉜 문자열이 전송되므로 끝의 “___FACEMOTION3D”를 구분자로 사용합니다.

TCP/IP 전송을 중지하려면 포트 49993으로 “StopStreaming_FACEMOTION3D” 문자열을 보냅니다.

- TCP/IP로 수신하는 Python 사용 예

from socket import socket, AF_INET, SOCK_DGRAM, SOCK_STREAM
#UDP send

HOST = ''
PORT = 49993
ADDRESS = "192.168.1.7" #iOS address

s = socket(AF_INET, SOCK_DGRAM)
msg = "FACEMOTION3D_OtherStreaming|protocol=tcp"
s.sendto(msg.encode(), (ADDRESS, PORT))
s.close()

#create tcp server
with socket(AF_INET, SOCK_STREAM) as tcp_server:
    tcp_server.bind(('192.168.1.5', 49986)) #192.168.1.5 is pc address
    tcp_server.listen(1)
    while True:
        conn, addr = tcp_server.accept()
        with conn:
            while True:
                data = conn.recv(10000)
                print(data.decode('utf-8'))

- iOS의 녹화 데이터를 수신하는 방법

UDP로 iOS 쪽 포트 49993에 “v2_OtherBakeRecordedAnimation_FACEMOTION3D” 문자열을 보내면 녹화 데이터가 TCP/IP로 PC 쪽 포트 49987에 전송됩니다.

전송되는 문자열의 형식은 다음과 같습니다.

["......", "......", "......"]===[time01, time02, time03]___FACEMOTION3D.

The ["......", "......", "......"] 이 부분은 JSON 형식이며 UDP 및 TCP/IP에서 사용하는 것과 같은 문자열을 포함합니다.

[time01, time02, time03] 각 녹화 데이터 인덱스에 대응하는 녹화 시간을 포함합니다.

- iOS의 녹화 데이터와 오디오를 수신하는 방법

UDP로 iOS 쪽 포트 49993에 “v2_OtherBakeRecordedAnimation_FACEMOTION3D” 문자열을 보내면 녹화 데이터가 TCP/IP로 PC 쪽 포트 49987에 전송됩니다.

전송되는 문자열의 형식은 다음과 같습니다.

["......", "......", "......"]===[time01, time02, time03]___FACEMOTION3D.

The ["......", "......", "......"] 이 부분은 JSON 형식이며 UDP 및 TCP/IP에서 사용하는 것과 같은 문자열을 포함합니다.

[time01, time02, time03] 각 녹화 데이터 인덱스에 대응하는 녹화 시간을 포함합니다.

- 현재 baking 중임을 사용자에게 표시

iOS 앱에 “Currently baking”을 표시하려면 UDP 포트 49993으로 “BakeOther_FACEMOTION3D”를 보냅니다. baking 메시지를 숨기려면 UDP 포트 49993으로 “BakeFinishOther_FACEMOTION3D”를 보냅니다.

- iOS 앱 안에서 녹화를 시작하는 방법

iOS 앱 안에서 녹화를 시작하려면 포트 49993으로 “FACEMOTION3D_StartRecording”을 보냅니다.

- iOS 앱 안에서 녹화를 중지하는 방법

iOS 앱 안에서 녹화를 중지하려면 포트 49993으로 “FACEMOTION3D_StopRecording”을 보냅니다.

- iOS 앱 안에서 streaming을 중지하는 방법

iOS 앱 안에서 streaming을 중지하려면 포트 49993으로 “StopStreaming_FACEMOTION3D”를 보냅니다.

- Reset 버튼 실행

iOS 포트 49993으로 “FACEMOTION3D_resetButton” 문자열을 보냅니다.

- Bluetooth

Other 라이선스로 Bluetooth 연결을 사용하려면 다음 코드를 사용하세요:
https://github.com/emoto-yasushi/iFacialMocap_Facemotion3d_Bluetooth

- 추가 정보

- Facemotion3d가 command를 수락하면 이후 0.02초 동안 외부 commands를 받지 않습니다.
- 현재 command를 수신하는 server는 UDP server뿐입니다. UDP에서는 data가 누락될 수 있으므로 약 세 번 전송하면 정확한 communication 가능성이 높아집니다.
서드파티 개발자가 반드시 Other 라이선스를 사용할 필요는 없습니다.
서드파티 개발자는 Unity license나 Blender license 등 원하는 license를 사용해 전송할 데이터 종류를 선택할 수 있습니다.
각 라이선스의 가격은 향후 상황에 따라 변경될 수 있습니다.