- Para recibir datos por UDP
Si envía la cadena “FACEMOTION3D_OtherStreaming” desde el PC al puerto 49993 del lado iOS, Facemotion3d devolverá datos por UDP a 60FPS al puerto 49993.
- Ejemplo en 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 cadena enviada por cada frame es la siguiente.
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|
- Las cadenas enviadas por cada frame son las siguientes.
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 |
El parámetro puede contener valores negativos o superar 100.
Los datos de ángulo se envían en grados, no en radianes.
- Para recibir datos por TCP/IP
Con UDP pueden perderse frames, por lo que también existe un método para recibir por TCP/IP.
Si envía por UDP la cadena “FACEMOTION3D_OtherStreaming|protocol=tcp” al puerto 49993 del lado iOS, los datos se enviarán al puerto 49986 del PC.
La cadena enviada es simplemente la cadena usada en UDP con “___FACEMOTION3D” añadido al 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
Al recibir desde iOS al PC con TCP/IP, se envía una cadena dividida por frames; use “___FACEMOTION3D” al final como delimitador.
Para detener el envío TCP/IP, envíe la cadena “StopStreaming_FACEMOTION3D” al puerto 49993.
- Ejemplo de uso en Python para recibir 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 recibir datos grabados en iOS
Si envía por UDP la cadena “v2_OtherBakeRecordedAnimation_FACEMOTION3D” al puerto 49993 del lado iOS, los datos grabados se enviarán al PC por TCP/IP en el puerto 49987.
La cadena transmitida tiene el siguiente formato:
["......", "......", "......"]===[time01, time02, time03]___FACEMOTION3D.
The ["......", "......", "......"] La parte está en formato JSON y contiene las mismas cadenas que se usan por UDP y TCP/IP.
[time01, time02, time03] contiene los tiempos de grabación correspondientes a cada índice de datos grabados.
- Para recibir datos grabados y audio en iOS
Si envía por UDP la cadena “v2_OtherBakeRecordedAnimation_FACEMOTION3D” al puerto 49993 del lado iOS, los datos grabados se enviarán al PC por TCP/IP en el puerto 49987.
La cadena transmitida tiene el siguiente formato:
["......", "......", "......"]===[time01, time02, time03]___FACEMOTION3D.
The ["......", "......", "......"] La parte está en formato JSON y contiene las mismas cadenas que se usan por UDP y TCP/IP.
[time01, time02, time03] contiene los tiempos de grabación correspondientes a cada índice de datos grabados.
- Mostrar al usuario que se está haciendo bake
Para mostrar “Currently baking” en la app iOS, envíe “BakeOther_FACEMOTION3D” al puerto UDP 49993. Para ocultar el mensaje de baking, envíe “BakeFinishOther_FACEMOTION3D” al puerto UDP 49993.
- Para iniciar la grabación dentro de la app iOS
Para iniciar la grabación dentro de la app iOS, envíe “FACEMOTION3D_StartRecording” al puerto 49993.
- Para detener la grabación dentro de la app iOS
Para detener la grabación dentro de la app iOS, envíe “FACEMOTION3D_StopRecording” al puerto 49993.
- Para detener el streaming dentro de la app iOS
Para detener el streaming dentro de la app iOS, envíe “StopStreaming_FACEMOTION3D” al puerto 49993.
- Ejecutar el botón Reset
Envíe la cadena “FACEMOTION3D_resetButton” al puerto iOS 49993.
- Bluetooth
Para conectarse por Bluetooth con la licencia Other, use el siguiente código:
https://github.com/emoto-yasushi/iFacialMocap_Facemotion3d_Bluetooth
- Información adicional
- Una vez que Facemotion3d acepta un comando, no aceptará comandos externos durante 0,02 segundos.
- Actualmente, el único servidor que recibe comandos es el servidor UDP. Con UDP a veces pueden perderse datos, por lo que enviarlos unas tres veces aumenta la probabilidad de una comunicación correcta.
Los desarrolladores de terceros no tienen necesariamente que usar la licencia Other.
Los desarrolladores de terceros pueden usar licencias como Unity o Blender para elegir el tipo de datos que se enviará.
Tenga en cuenta que el precio de cada licencia puede cambiar en el futuro según la situación.