- Para receber dados via UDP

Se você enviar a string “FACEMOTION3D_OtherStreaming” do PC para a porta 49993 no lado iOS, o Facemotion3d retornará dados por UDP a 60FPS para a porta 49993.

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

- A string enviada por frame é a seguinte.

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|

- As strings enviadas por frame são as seguintes.

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 |

O parâmetro pode conter valores negativos ou ultrapassar 100.

Os dados de ângulo são enviados em graus, não em radianos.

- Para receber dados via TCP/IP

Com UDP, alguns frames podem ser perdidos; por isso também há um método de recebimento por TCP/IP.

Se você enviar por UDP a string “FACEMOTION3D_OtherStreaming|protocol=tcp” para a porta 49993 no lado iOS, os dados serão enviados para a porta 49986 no lado PC.

A string enviada é apenas a string usada no UDP com “___FACEMOTION3D” adicionado ao final.

-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

Ao receber do iOS para o PC por TCP/IP, uma string dividida por frames será enviada; use “___FACEMOTION3D” no final como delimitador.

Para parar o envio TCP/IP, envie a string “StopStreaming_FACEMOTION3D” para a porta 49993.

- Exemplo de uso em Python recebido por 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'))

- Para receber dados gravados no iOS

Se você enviar por UDP a string “v2_OtherBakeRecordedAnimation_FACEMOTION3D” para a porta 49993 no lado iOS, os dados gravados serão enviados ao PC por TCP/IP na porta 49987.

A string transmitida tem o seguinte formato:

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

The ["......", "......", "......"] A parte está em formato JSON e contém as mesmas strings usadas por UDP e TCP/IP.

[time01, time02, time03] contém os tempos de gravação correspondentes a cada índice de dados gravados.

- Para receber dados gravados e áudio no iOS

Se você enviar por UDP a string “v2_OtherBakeRecordedAnimation_FACEMOTION3D” para a porta 49993 no lado iOS, os dados gravados serão enviados ao PC por TCP/IP na porta 49987.

A string transmitida tem o seguinte formato:

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

The ["......", "......", "......"] A parte está em formato JSON e contém as mesmas strings usadas por UDP e TCP/IP.

[time01, time02, time03] contém os tempos de gravação correspondentes a cada índice de dados gravados.

- Mostrar ao usuário que o bake está em andamento

Para exibir “Currently baking” no app iOS, envie “BakeOther_FACEMOTION3D” para a porta UDP 49993. Para ocultar a mensagem de baking, envie “BakeFinishOther_FACEMOTION3D” para a porta UDP 49993.

- Para iniciar a gravação dentro do app iOS

Para iniciar a gravação dentro do app iOS, envie “FACEMOTION3D_StartRecording” para a porta 49993.

- Para parar a gravação dentro do app iOS

Para parar a gravação dentro do app iOS, envie “FACEMOTION3D_StopRecording” para a porta 49993.

- Para parar o streaming dentro do app iOS

Para parar o streaming dentro do app iOS, envie “StopStreaming_FACEMOTION3D” para a porta 49993.

- Executar o botão Reset

Envie a string “FACEMOTION3D_resetButton” para a porta iOS 49993.

- Bluetooth

Para conectar via Bluetooth usando a licença Other, use o seguinte código:
https://github.com/emoto-yasushi/iFacialMocap_Facemotion3d_Bluetooth

- Informações adicionais

- Depois que o Facemotion3d aceita um comando, ele não aceita comandos externos por 0,02 segundo.
- Atualmente, o único servidor que recebe comandos é o servidor UDP. Com UDP, os dados podem às vezes se perder; enviar os dados cerca de três vezes aumenta a chance de comunicação correta.
Desenvolvedores de terceiros não precisam necessariamente usar a licença Other.
Desenvolvedores de terceiros podem usar licenças como Unity ou Blender para escolher o tipo de dados a enviar.
Observe que o preço de cada licença pode mudar no futuro dependendo da situação.