- استقبال البيانات عبر UDP
عند إرسال النص “FACEMOTION3D_OtherStreaming” من جهة الكمبيوتر إلى المنفذ 49993 على جهة iOS، يرسل Facemotion3d ردًا عبر UDP بسرعة 60FPS إلى المنفذ 49993.
- مثال 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
- النص المرسل لكل frame هو كما يلي.
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|
- النصوص المرسلة لكل frame هي كما يلي.
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 |
قد يحتوي parameter على قيم سالبة أو قيم تتجاوز 100.
يتم إرسال بيانات الزوايا بالدرجات، وليس بالراديان.
- استقبال البيانات عبر TCP/IP
مع UDP قد تسقط بعض الإطارات، لذلك توجد أيضًا طريقة للاستقبال عبر TCP/IP.
إذا أرسلت النص “FACEMOTION3D_OtherStreaming|protocol=tcp” عبر UDP إلى المنفذ 49993 على جهة iOS، فسيتم إرسال البيانات إلى المنفذ 49986 على جهة الكمبيوتر.
النص المرسل هو فقط النص المرسل عند استخدام UDP مع إضافة “___FACEMOTION3D” في نهايته.
-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
عند الاستقبال من iOS إلى الكمبيوتر عبر TCP/IP، يتم إرسال نص مقسّم حسب الإطارات، لذلك استخدم “___FACEMOTION3D” في النهاية كفاصل.
لإيقاف إرسال TCP/IP، أرسل النص “StopStreaming_FACEMOTION3D” إلى المنفذ 49993.
- مثال Python للاستقبال عبر 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'))
- لاستقبال البيانات المسجلة في iOS
إذا أرسلت النص “v2_OtherBakeRecordedAnimation_FACEMOTION3D” عبر UDP إلى المنفذ 49993 على جهة iOS، فسيتم إرسال البيانات المسجلة إلى الكمبيوتر عبر TCP/IP على المنفذ 49987.
تنسيق النص المرسل هو كالتالي:
["......", "......", "......"]===[time01, time02, time03]___FACEMOTION3D.
The ["......", "......", "......"] هذا الجزء بتنسيق JSON ويحتوي على نفس النصوص المستخدمة عبر UDP و TCP/IP.
[time01, time02, time03] يحتوي على أوقات التسجيل المقابلة لكل فهرس من بيانات التسجيل.
- لاستقبال البيانات المسجلة والصوت في iOS
إذا أرسلت النص “v2_OtherBakeRecordedAnimation_FACEMOTION3D” عبر UDP إلى المنفذ 49993 على جهة iOS، فسيتم إرسال البيانات المسجلة إلى الكمبيوتر عبر TCP/IP على المنفذ 49987.
تنسيق النص المرسل هو كالتالي:
["......", "......", "......"]===[time01, time02, time03]___FACEMOTION3D.
The ["......", "......", "......"] هذا الجزء بتنسيق JSON ويحتوي على نفس النصوص المستخدمة عبر UDP و TCP/IP.
[time01, time02, time03] يحتوي على أوقات التسجيل المقابلة لكل فهرس من بيانات التسجيل.
- عرض أن عملية baking جارية حاليًا للمستخدم
لعرض “Currently baking” في تطبيق iOS، أرسل “BakeOther_FACEMOTION3D” إلى منفذ UDP 49993. لإخفاء رسالة baking، أرسل “BakeFinishOther_FACEMOTION3D” إلى منفذ UDP 49993.
- لبدء التسجيل داخل تطبيق iOS
لبدء التسجيل داخل تطبيق iOS، أرسل “FACEMOTION3D_StartRecording” إلى المنفذ 49993.
- لإيقاف التسجيل داخل تطبيق iOS
لإيقاف التسجيل داخل تطبيق iOS، أرسل “FACEMOTION3D_StopRecording” إلى المنفذ 49993.
- لإيقاف streaming داخل تطبيق iOS
لإيقاف streaming داخل تطبيق iOS، أرسل “StopStreaming_FACEMOTION3D” إلى المنفذ 49993.
- تشغيل زر Reset
أرسل النص “FACEMOTION3D_resetButton” إلى منفذ iOS رقم 49993.
- Bluetooth
للاتصال عبر Bluetooth باستخدام ترخيص Other، استخدم الكود التالي:
https://github.com/emoto-yasushi/iFacialMocap_Facemotion3d_Bluetooth
- معلومات إضافية
- بعد أن يقبل Facemotion3d أمرًا، لن يقبل أوامر خارجية لمدة 0.02 ثانية.
- حاليًا، الخادم الوحيد الذي يستقبل الأوامر هو خادم UDP. مع UDP قد تفقد البيانات أحيانًا، لذلك فإن إرسال البيانات حوالي ثلاث مرات يزيد احتمال الاتصال الصحيح.
لا يلزم بالضرورة على مطوري الطرف الثالث استخدام ترخيص Other.
يمكن لمطوري الطرف الثالث استخدام تراخيصهم المفضلة مثل Unity license و Blender license لاختيار نوع البيانات المراد إرسالها.
يرجى العلم أن سعر كل ترخيص قد يتغير مستقبلًا حسب الظروف.