- Odbiór danych przez UDP

Jeśli z PC wyślesz string "FACEMOTION3D_OtherStreaming" na port 49993 po stronie iOS, Facemotion3d odeśle odpowiedź na port 49993 przez UDP z 60FPS.

- Przykład 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

- String wysyłany w każdej klatce wygląda następująco.

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|

- Format stringów wysyłanych w każdej klatce wygląda następująco.

Nazwa BlendShape&parametry (0 ~ 100) | Nazwy BlendShape-parametry (0 ~ 100) | .... | = head # kąty Eulera X (stopnie), kąty Eulera Y, kąty Eulera Z, wartości pozycji X, wartości pozycji Y, wartości pozycji Z | rightEye #kąty Eulera X, kąty Eulera Y, kąty Eulera Z | leftEye #kąty Eulera X, kąty Eulera Y, kąty Eulera Z |

Parametr może zawierać wartości ujemne albo przekraczać 100.

Dane kątowe są wysyłane w stopniach, nie w radianach.

- Odbiór danych przez TCP / IP

Przy UDP mogą wypadać klatki, dlatego dostępna jest także metoda odbioru przez TCP / IP.

Jeśli przez UDP wyślesz string "FACEMOTION3D_OtherStreaming|protocol=tcp" na port 49993 po stronie iOS, dane zostaną wysłane na port 49986 po stronie PC.

Wysyłany string to po prostu string używany przy UDP z dodanym na końcu "___FACEMOTION3D".

- przykład

Nazwa BlendShape&parametr (0 ~ 100) | Nazwa BlendShape-parametr (0 ~ 100) | .... | = head # kąty Eulera X, kąty Eulera Y, kąty Eulera Z, wartości ruchu X, wartości ruchu Y, wartości ruchu Z | rightEye #kąty Eulera X, kąty Eulera Y, kąty Eulera Z | leftEye #kąty Eulera X, kąty Eulera Y, kąty Eulera Z | ___ Facemotion3d

Podczas odbioru z iOS na PC przez TCP / IP może zostać wysłany string z podzielonymi klatkami, dlatego użyj "___FACEMOTION3D" na końcu jako separatora.

Aby zatrzymać wysyłanie TCP / IP, wyślij string "StopStreaming_FACEMOTION3D" na port 49993.

- Przykład użycia Python do odbioru przez TCP / IP

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

- Odbiór danych nagranych w iOS

Jeśli przez UDP wyślesz string “v2_OtherBakeRecordedAnimation_FACEMOTION3D” na port 49993 po stronie iOS, nagrane dane zostaną wysłane do PC przez TCP/IP na porcie 49987.

Przesyłany string ma następujący format:

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

Część["......", "......", "......"]jest w formacie JSON i zawiera te same stringi, które są używane przez UDP i TCP/IP.

[time01, time02, time03]zawiera czasy nagrania odpowiadające poszczególnym indeksom danych nagrania.

- Odbiór danych nagranych i audio w iOS

Jeśli przez UDP wyślesz string “v2_OtherBakeRecordedAnimation_FACEMOTION3D” na port 49993 po stronie iOS, nagrane dane zostaną wysłane do PC przez TCP/IP na porcie 49987.

Przesyłany string ma następujący format:

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

Część["......", "......", "......"]jest w formacie JSON i zawiera te same stringi, które są używane przez UDP i TCP/IP.

[time01, time02, time03]zawiera czasy nagrania odpowiadające poszczególnym indeksom danych nagrania.

- Pokazanie użytkownikowi, że trwa baking

Aby wyświetlić “Currently baking” w aplikacji iOS, wyślij “BakeOther_FACEMOTION3D” na port UDP 49993. Aby ukryć komunikat baking, wyślij “BakeFinishOther_FACEMOTION3D” na port UDP 49993.

- Rozpoczęcie nagrywania w aplikacji iOS

Aby rozpocząć nagrywanie w aplikacji iOS, wyślij "FACEMOTION3D_StartRecording" na port 49993.

- Zatrzymanie nagrywania w aplikacji iOS

Aby zatrzymać nagrywanie w aplikacji iOS, wyślij "FACEMOTION3D_StopRecording" na port 49993.

- Zatrzymanie streamingu w aplikacji iOS

Aby zatrzymać streaming w aplikacji iOS, wyślij "StopStreaming_FACEMOTION3D" na port 49993.

- Uruchomienie Reset Button

Wyślij string "FACEMOTION3D_resetButton" na port iOS 49993.

- Bluetooth

Aby połączyć się przez Bluetooth przy użyciu licencji Other, użyj poniższego kodu:
https://github.com/emoto-yasushi/iFacialMocap_Facemotion3d_Bluetooth

- Informacje dodatkowe

- Po przyjęciu komendy Facemotion3d nie będzie akceptować zewnętrznych komend przez 0,02 sekundy.
- Obecnie jedynym serwerem odbierającym komendy jest serwer UDP. Przy UDP dane mogą czasem zostać pominięte, więc wysłanie danych około trzy razy zwiększa szansę poprawnej komunikacji.
Developerzy zewnętrzni nie muszą koniecznie używać licencji Other.
Developerzy zewnętrzni mogą używać preferowanych licencji, takich jak licencja Unity lub Blender, aby wybrać typ wysyłanych danych.
Pamiętaj, że cena każdej licencji może w przyszłości ulec zmianie zależnie od sytuacji.