- Ricevere dati tramite UDP

Se invii la stringa "FACEMOTION3D_OtherStreaming" dal PC alla porta 49993 sul lato iOS, Facemotion3d risponderà alla porta 49993 via UDP a 60FPS.

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

- La stringa inviata per ogni frame è la seguente.

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|

- Il formato delle stringhe inviate per ogni frame è il seguente.

Nome BlendShape&parametri (0 ~ 100) | Nomi BlendShape-parametri (0 ~ 100) | .... | = head # angoli Euler X (gradi), angoli Euler Y, angoli Euler Z, valori posizione X, valori posizione Y, valori posizione Z | rightEye #angoli Euler X, angoli Euler Y, angoli Euler Z | leftEye #angoli Euler X, angoli Euler Y, angoli Euler Z |

Il parametro può contenere valori negativi o superare 100.

I dati relativi agli angoli vengono inviati in gradi, non in radianti.

- Ricevere dati tramite TCP / IP

Con UDP alcuni frame possono andare persi, quindi esiste anche un metodo di ricezione tramite TCP / IP.

Se invii via UDP la stringa "FACEMOTION3D_OtherStreaming|protocol=tcp" alla porta 49993 sul lato iOS, i dati verranno inviati alla porta 49986 sul lato PC.

La stringa da inviare è semplicemente la stringa inviata con UDP con l'aggiunta di "___FACEMOTION3D".

- esempio

Nome BlendShape&parametro (0 ~ 100) | Nome BlendShape-parametro (0 ~ 100) | .... | = head # angoli Euler X, angoli Euler Y, angoli Euler Z, valori di movimento X, valori di movimento Y, valori di movimento Z | rightEye #angoli Euler X, angoli Euler Y, angoli Euler Z | leftEye #angoli Euler X, angoli Euler Y, angoli Euler Z | ___ Facemotion3d

Quando ricevi da iOS a PC con TCP / IP, può arrivare una stringa con frame spezzati; usa quindi "___FACEMOTION3D" alla fine come delimitatore.

Per interrompere l'invio TCP / IP, invia la stringa "StopStreaming_FACEMOTION3D" alla porta 49993.

- Esempio Python per la ricezione tramite 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'))

- Ricevere i dati registrati in iOS

Se invii via UDP la stringa “v2_OtherBakeRecordedAnimation_FACEMOTION3D” alla porta 49993 sul lato iOS, i dati registrati verranno inviati al PC tramite TCP/IP sulla porta 49987.

La stringa trasmessa ha il seguente formato:

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

La parte["......", "......", "......"]è in formato JSON e contiene le stesse stringhe usate tramite UDP e TCP/IP.

[time01, time02, time03]contiene i tempi di registrazione corrispondenti a ciascun indice dei dati registrati.

- Ricevere dati registrati e audio in iOS

Se invii via UDP la stringa “v2_OtherBakeRecordedAnimation_FACEMOTION3D” alla porta 49993 sul lato iOS, i dati registrati verranno inviati al PC tramite TCP/IP sulla porta 49987.

La stringa trasmessa ha il seguente formato:

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

La parte["......", "......", "......"]è in formato JSON e contiene le stesse stringhe usate tramite UDP e TCP/IP.

[time01, time02, time03]contiene i tempi di registrazione corrispondenti a ciascun indice dei dati registrati.

- Mostrare all'utente che il baking è in corso

Per visualizzare “Currently baking” nell'app iOS, invia “BakeOther_FACEMOTION3D” alla porta UDP 49993. Per nascondere il messaggio di baking, invia “BakeFinishOther_FACEMOTION3D” alla porta UDP 49993.

- Avviare la registrazione nell'app iOS

Per avviare la registrazione nell'app iOS, invia "FACEMOTION3D_StartRecording" alla porta 49993.

- Fermare la registrazione nell'app iOS

Per fermare la registrazione nell'app iOS, invia "FACEMOTION3D_StopRecording" alla porta 49993.

- Fermare lo streaming nell'app iOS

Per fermare lo streaming nell'app iOS, invia "StopStreaming_FACEMOTION3D" alla porta 49993.

- Eseguire il Reset Button

Invia la stringa "FACEMOTION3D_resetButton" alla porta iOS 49993.

- Bluetooth

Per connetterti via Bluetooth usando la licenza Other, usa il seguente codice:
https://github.com/emoto-yasushi/iFacialMocap_Facemotion3d_Bluetooth

- Informazioni aggiuntive

- Dopo aver accettato un comando, Facemotion3d non accetterà comandi esterni per 0,02 secondi.
- Attualmente l'unico server che riceve comandi è il server UDP. Con UDP i dati possono talvolta andare persi, quindi inviarli circa tre volte aumenta la probabilità di una comunicazione corretta.
Gli sviluppatori di terze parti non devono necessariamente usare la licenza Other.
Gli sviluppatori di terze parti possono usare le licenze preferite, come la licenza Unity o Blender, per scegliere il tipo di dati da inviare.
Tieni presente che il prezzo di ogni licenza potrebbe cambiare in futuro a seconda della situazione.