Kommunikationsspezifikationen von iFacialMocap
iFacialMocap ermöglicht Drittanbieter-Entwicklern, Gesichtsdaten per UDP oder TCP/IP zu empfangen, ohne die PC-Software zu verwenden.
Daten per UDP empfangen
Wenn Sie die Zeichenfolge "iFacialMocap_sahuasouryya9218sauhuiayeta91555dy3719" vom PC an Port 49983 auf der iOS-Seite senden, gibt iFacialMocap per UDP mit 60 FPS eine Antwort an Port 49983 zurück.
・ Python-Beispiel
from socket import *
DstIP = "192.168.1.7"
DstPort = 49983
DstAddr = (DstIP,DstPort)
udpClntSock = socket(AF_INET, SOCK_DGRAM)
data = "iFacialMocap_sahuasouryya9218sauhuiayeta91555dy3719"
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
・ Die pro Frame gesendete Zeichenfolge lautet wie folgt.
・ Die pro Frame gesendeten Zeichenfolgen lauten wie folgt.
BlendShape Name-Parameter (0 ~ 100) | … | BlendShape Name-Parameter (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 |
Winkelbezogene Daten werden in Grad gesendet, nicht in Radiant.
Seit iOS Version 1.1.8 wurde ein externer Befehl für die Kompatibilität mit Facemotion 3d hinzugefügt.
Wenn Sie die Zeichenfolge "|sendDataVersion=v2" wie unten gezeigt hinzufügen, werden die Werte des gesendeten BlendShape-Parameters durch "&" getrennt.
iFacialMocap_sahuasouryya9218sauhuiayeta91555dy3719|sendDataVersion=v2
[Beispiel]
Normal
mouthSmile_R-0
sendDataVersion = v2
mouthSmile_R & 0
Der Grund ist, dass Facemotion 3d einen negativen Wert für den blendShape-Wert senden kann.
Dadurch wird eine mögliche Kollision vermieden, wenn "-" als Trennzeichen verwendet wird.
Daten per TCP/IP empfangen
Bei UDP können Frames verloren gehen; daher gibt es auch eine Empfangsmethode über TCP/IP.
Wenn Sie die Zeichenfolge "iFacialMocap_UDPTCP_sahuasouryya9218sauhuiayeta91555dy3719" per UDP an Port 49983 auf der iOS-Seite senden, werden die Daten an Port 49986 auf der PC-Seite gesendet.
Die zu sendende Zeichenfolge ist lediglich die Zeichenfolge "___iFacialMocap" zusätzlich zur per UDP gesendeten Zeichenfolge.
- Beispiel
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 | ___iFacialMocap
Beim Empfang von iOS auf den PC über TCP/IP kann eine Zeichenfolge mit aufgeteilten Frames gesendet werden. Verwenden Sie daher "___iFacialMocap" am Ende als Trennzeichen.
Um das Senden über TCP/IP zu stoppen, senden Sie die Zeichenfolge "iFacialMocap_UDPTCPSTOP_sahuasouryya9218sauhuiayeta91555dy3719" an Port 49983.
・ Beispiel für Python-Empfang über TCP/IP
from socket import socket, AF_INET, SOCK_DGRAM, SOCK_STREAM
#UDP send
HOST = ''
PORT = 49983
ADDRESS = "192.168.1.7" #iOS address
s = socket(AF_INET, SOCK_DGRAM)
msg = "iFacialMocap_UDPTCP_sahuasouryya9218sauhuiayeta91555dy3719"
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'))
Seit iOS Version 1.1.8 wurde ein externer Befehl für die Kompatibilität mit Facemotion 3d hinzugefügt.
Wenn Sie die Zeichenfolge "|sendDataVersion=v2" wie unten gezeigt hinzufügen, werden die Werte des gesendeten BlendShape-Parameters durch "&" getrennt.
iFacialMocap_UDPTCP_sahuasouryya9218sauhuiayeta91555dy3719|sendDataVersion=v2
[Beispiel]
Normal
mouthSmile_R-0
sendDataVersion = v2
mouthSmile_R & 0
Der Grund ist, dass Facemotion 3d einen negativen Wert für den blend shape-Wert senden kann; "-" als Trennzeichen konnte zu Kollisionen führen.
Daten per Bluetooth empfangen
Wenn Netzwerkverbindungen über Wi‑Fi wie UDP oder TCP/IP fehlschlagen, können Sie alternativ Bluetooth verwenden. Siehe den folgenden GitHub-Code.
https://github.com/emoto-yasushi/iFacialMocap_Facemotion3d_Bluetooth
Aufgezeichnete Daten in iOS empfangen
Wenn Sie per UDP die Zeichenfolge "iFacialMocap_bakeRecordedAnimation_start" an Port 49983 auf iOS-Seite senden, werden die aufgezeichneten Daten per TCP/IP an Port 49987 auf PC-Seite gesendet.
Die gesendete Zeichenfolge hat das Format [".....", ".....", "....."] ___iFacialMocap.
Der Teil [".....", ".....", "....."] ist im JSON-Format und enthält die gleichen Zeichenfolgen wie bei UDP und TCP/IP.
Mit 60 FPS aufgezeichnete Daten werden immer gespeichert. (Auch wenn die Verarbeitung unter iOS auf 30 FPS fällt, wird mit 60 FPS aufgezeichnet.)
Dies war ursprünglich nicht der Zweck von iFacialMocap, aber Drittanbieter-Entwickler können es frei verwenden. Künftig wird sich die Entwicklung schrittweise auf eine Nachfolge-App verlagern; iFacialMocap selbst wird jedoch nicht eingestellt. Wenn Sie diese Funktion verwenden, beachten Sie bitte, dass sich ihre Behandlung in der Nachfolge-App ändern kann.
lookForward-Schaltfläche ausführen
Senden Sie die Zeichenfolge "iFacialMocap_lookForward" an iOS-Port 49983.
Direktes Streaming zu Unity
Die folgenden Skripte können verwendet werden, indem sie an GameObjects angehängt werden.
Es kann sowohl mit iFacialMocap als auch mit Facemotion3d streamen.
https://drive.google.com/file/d/10cnZRlglrHmZIv-ECT66eqNZNsiWhMtf/view?usp=sharing
Es funktioniert, indem der Objektname wie im folgenden Bild angegeben wird.

Dieses Skript ist für FBX-Dateien gedacht, nicht für VRM.
Wenn Sie dies mit VRM verwenden möchten, erstellen Sie bitte Ihre eigene Version oder senden Sie mir eine E-Mail.