مواصفات اتصال iFacialMocap


يتيح iFacialMocap لمطوري أدوات الجهات الخارجية استقبال بيانات الوجه باستخدام بروتوكولات UDP أو TCP/IP دون المرور عبر برنامج الكمبيوتر.

استقبال البيانات عبر UDP

إذا أرسلت السلسلة "iFacialMocap_sahuasouryya9218sauhuiayeta91555dy3719" من جهة الكمبيوتر إلى المنفذ 49983 في جهة iOS، فسيعيد iFacialMocap ردًا عبر UDP إلى المنفذ 49983 بمعدل 60 FPS.

・ مثال Python

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

・ السلسلة المرسلة لكل إطار هي كما يلي.

mouthSmile_R-0(eyeLookOut_L-0)mouthUpperUp_L-11(eyeWide_R-0)mouthClose-8|mouthPucker-4|mouthRollLower-9|eyeBlink_R-7|eyeLookDown_L-1|?cheekSquint_R-11|eyeBlink_L-7|tongueOut-0|jawRight-0|eyeLookIn_R-9|cheekSquint_L-11|mouthDimple_L-10|mouthPress_L-4|eyeSquint_L-11|mouthRight-0|mouthShrugLower-0|eyeLookUp_R-0|eyeLookOut_R-0|mouthPress_R-5|cheekPuff-2|jawForward-1|1|mouthLowerDown_L-9|mouthFrown_L-6|mouthShrugUpper-26|browOuterUp_L-4|browInnerUp-20|mouthDimple_R-10|browDown_R-0|mouthUpperUp_R-10|mouthRollUpper-8|mouthFunnel-12|mouthStretch_R-21|mouthFrown_R-13|eyeLookDown_R-17|jawOpen-12|jawLeft-0|browDown_L-0|mouthSmile_L-0|noseSneer_R-18|mouthLowerDown_R-8|noseSneer_L-21|eyeWide_L-0|mouthStretch_L-21|browOuterUp_R-4|eyeLookIn_L-4|eyeSquint_R-11|eyeLookUp_L-0|mouthLeft-0|=head#-21.488958,-6.038993,-6.6019735,-0.030653415,-0.10287084,-0.6584072|rightEye#6.0297494,2.4403017,0.25649446|leftEye#6.034903,-1.6660284,-0.17520553|34903,-1.6660284,-0.17520553|

・ السلاسل المرسلة لكل إطار هي كما يلي.

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 |

يتم إرسال بيانات الزوايا بالدرجات وليس بالراديان.

منذ iOS ver.1.1.8 تمت إضافة أمر خارجي للتوافق مع Facemotion 3d.
إذا أضفت السلسلة "|sendDataVersion=v2" كما هو موضح أدناه، فسيتم فصل قيم معلمة BlendShape المرسلة بواسطة "&".
iFacialMocap_sahuasouryya9218sauhuiayeta91555dy3719|sendDataVersion=v2

[مثال]
عادي
mouthSmile_R-0
sendDataVersion = v2
mouthSmile_R & 0

السبب هو أن Facemotion 3d يمكنه إرسال قيمة سالبة لقيمة blendShape.
وذلك لأن استخدام "-" كفاصل كان قد يسبب تعارضًا.

استقبال البيانات عبر TCP/IP

في UDP قد تسقط بعض الإطارات، لذلك توجد أيضًا طريقة للاستقبال عبر TCP/IP.
إذا أرسلت عبر UDP السلسلة "iFacialMocap_UDPTCP_sahuasouryya9218sauhuiayeta91555dy3719" إلى المنفذ 49983 في جهة iOS، فسيتم إرسال البيانات إلى المنفذ 49986 في جهة الكمبيوتر.

السلسلة المراد إرسالها هي ببساطة السلسلة "___iFacialMocap" مضافة إلى السلسلة المرسلة عند استخدام UDP.

- مثال
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

عند الاستقبال من iOS إلى الكمبيوتر عبر TCP/IP، قد تُرسل سلسلة مقسّمة إلى إطارات، لذلك استخدم "___iFacialMocap" في النهاية كفاصل.

لإيقاف الإرسال عبر TCP/IP، أرسل السلسلة "iFacialMocap_UDPTCPSTOP_sahuasouryya9218sauhuiayeta91555dy3719" إلى المنفذ 49983.

・ مثال استخدام Python للاستقبال عبر 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'))

منذ iOS ver.1.1.8 تمت إضافة أمر خارجي للتوافق مع Facemotion 3d.
إذا أضفت السلسلة "|sendDataVersion=v2" كما هو موضح أدناه، فسيتم فصل قيم معلمة BlendShape المرسلة بواسطة "&".
iFacialMocap_UDPTCP_sahuasouryya9218sauhuiayeta91555dy3719|sendDataVersion=v2

[مثال]
عادي
mouthSmile_R-0
sendDataVersion = v2
mouthSmile_R & 0

السبب هو أن Facemotion 3d يمكنه إرسال قيمة سالبة لقيمة blend shape، واستخدام "-" كفاصل كان قد يسبب تعارضًا.

استقبال البيانات عبر Bluetooth

إذا فشلت اتصالات الشبكة عبر Wi‑Fi مثل UDP أو TCP/IP، يمكنك استخدام Bluetooth كبديل. راجع كود GitHub التالي.

https://github.com/emoto-yasushi/iFacialMocap_Facemotion3d_Bluetooth

استقبال البيانات المسجلة في iOS

إذا أرسلت السلسلة "iFacialMocap_bakeRecordedAnimation_start" إلى منفذ 49983 في جهة iOS عبر UDP، فسيتم إرسال البيانات المسجلة إلى منفذ 49987 في جهة الكمبيوتر عبر TCP/IP.

تكون السلسلة المرسلة بالتنسيق [".....", ".....", "....."] ___iFacialMocap.
الجزء [".....", ".....", "....."] بصيغة JSON ويخزن السلاسل نفسها المستخدمة في UDP وTCP/IP.

يتم دائمًا تخزين البيانات المسجلة بمعدل 60 FPS. (حتى إذا انخفضت المعالجة في iOS إلى 30 FPS، فسيتم التسجيل بمعدل 60 FPS.)

لم يكن هذا هو الغرض الأصلي من iFacialMocap، لكن يمكن لمطوري الجهات الخارجية استخدامه بحرية. في المستقبل سينتقل التطوير تدريجيًا إلى تطبيق لاحق، لكن iFacialMocap نفسه لن يتم إيقافه. إذا كنت تستخدم هذه الميزة، فضع في اعتبارك أن طريقة التعامل معها قد تتغير في التطبيق اللاحق.

تشغيل زر lookForward

أرسل السلسلة "iFacialMocap_lookForward" إلى منفذ iOS رقم 49983.

البث المباشر إلى Unity

يمكن استخدام السكربتات التالية بإرفاقها بكائنات اللعبة.
يمكنه البث مع كل من iFacialMocap وFacemotion3d.
https://drive.google.com/file/d/10cnZRlglrHmZIv-ECT66eqNZNsiWhMtf/view?usp=sharing

يعمل ذلك بتحديد اسم الكائن كما هو موضح في الصورة التالية.

Unity Inspector for the iFacialMocap streaming script

هذا السكربت مخصص لملفات FBX وليس VRM.
إذا كنت ترغب في استخدامه مع VRM، يرجى إنشاء نسختك الخاصة أو مراسلتي عبر البريد الإلكتروني.