- การรับข้อมูลผ่าน UDP

หากส่งสตริง "FACEMOTION3D_OtherStreaming" จากฝั่ง PC ไปยังพอร์ต 49993 ฝั่ง iOS, Facemotion3d จะตอบกลับมายังพอร์ต 49993 ด้วย UDP ที่ 60FPS

- ตัวอย่าง 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

- สตริงที่ส่งในแต่ละเฟรมมีดังนี้

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|

- รูปแบบสตริงที่ส่งในแต่ละเฟรมมีดังนี้

ชื่อ BlendShape&พารามิเตอร์ (0 ~ 100) | ชื่อ BlendShape-พารามิเตอร์ (0 ~ 100) | .... | = head # มุม Euler X (องศา), มุม Euler Y, มุม Euler Z, ค่าตำแหน่ง X, ค่าตำแหน่ง Y, ค่าตำแหน่ง Z | rightEye #มุม Euler X, มุม Euler Y, มุม Euler Z | leftEye #มุม Euler X, มุม Euler Y, มุม Euler Z |

พารามิเตอร์อาจมีค่าติดลบหรือมากกว่า 100 ได้

ข้อมูลที่เกี่ยวข้องกับมุมจะส่งเป็นองศา ไม่ใช่เรเดียน

- การรับข้อมูลผ่าน TCP / IP

หากใช้ UDP อาจมีเฟรมตก จึงมีวิธีรับข้อมูลด้วย TCP / IP ด้วย

หากส่งสตริง "FACEMOTION3D_OtherStreaming|protocol=tcp" ไปยังพอร์ต 49993 ฝั่ง iOS ด้วย UDP ข้อมูลจะถูกส่งไปยังพอร์ต 49986 ฝั่ง PC

สตริงที่ส่งคือสตริงที่ส่งตอนใช้ UDP โดยเพิ่ม "___FACEMOTION3D" ต่อท้าย

- ตัวอย่าง

ชื่อ BlendShape&พารามิเตอร์ (0 ~ 100) | ชื่อ BlendShape-พารามิเตอร์ (0 ~ 100) | .... | = head # มุม Euler X, มุม Euler Y, มุม Euler Z, ค่าการเคลื่อนที่ X, ค่าการเคลื่อนที่ Y, ค่าการเคลื่อนที่ Z | rightEye #มุม Euler X, มุม Euler Y, มุม Euler Z | leftEye #มุม Euler X, มุม Euler Y, มุม Euler Z | ___ Facemotion3d

เมื่อรับจาก iOS ไปยัง PC ด้วย 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 ข้อมูลที่บันทึกไว้จะถูกส่งไปยัง PC ผ่าน TCP/IP ที่พอร์ต 49987

สตริงที่ส่งมีรูปแบบดังนี้:

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

ส่วน["......", "......", "......"]เป็นรูปแบบ JSON และมีสตริงเดียวกับที่ใช้ผ่าน UDP และ TCP/IP

[time01, time02, time03]มีเวลาบันทึกที่สอดคล้องกับแต่ละดัชนีของข้อมูลบันทึก

- การรับข้อมูลที่บันทึกไว้และเสียงใน iOS

หากส่งสตริง “v2_OtherBakeRecordedAnimation_FACEMOTION3D” ผ่าน UDP ไปยังพอร์ต 49993 ฝั่ง iOS ข้อมูลที่บันทึกไว้จะถูกส่งไปยัง PC ผ่าน TCP/IP ที่พอร์ต 49987

สตริงที่ส่งมีรูปแบบดังนี้:

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

ส่วน["......", "......", "......"]เป็นรูปแบบ JSON และมีสตริงเดียวกับที่ใช้ผ่าน UDP และ TCP/IP

[time01, time02, time03]มีเวลาบันทึกที่สอดคล้องกับแต่ละดัชนีของข้อมูลบันทึก

- แสดงให้ผู้ใช้เห็นว่ากำลัง baking อยู่

หากต้องการแสดง “Currently baking” ในแอป iOS ให้ส่ง “BakeOther_FACEMOTION3D” ไปยัง UDP port 49993 หากต้องการซ่อนข้อความ baking ให้ส่ง “BakeFinishOther_FACEMOTION3D” ไปยัง UDP port 49993

- การเริ่มบันทึกภายในแอป iOS

หากต้องการเริ่มบันทึกภายในแอป iOS ให้ส่ง "FACEMOTION3D_StartRecording" ไปยังพอร์ต 49993

- การหยุดบันทึกภายในแอป iOS

หากต้องการหยุดบันทึกภายในแอป iOS ให้ส่ง "FACEMOTION3D_StopRecording" ไปยังพอร์ต 49993

- การหยุดสตรีมภายในแอป iOS

หากต้องการหยุดสตรีมภายในแอป iOS ให้ส่ง "StopStreaming_FACEMOTION3D" ไปยังพอร์ต 49993

- การเรียกใช้ Reset Button

ส่งสตริง "FACEMOTION3D_resetButton" ไปยังพอร์ต iOS 49993

- Bluetooth

หากต้องการเชื่อมต่อผ่าน Bluetooth โดยใช้ license Other โปรดใช้โค้ดต่อไปนี้:
https://github.com/emoto-yasushi/iFacialMocap_Facemotion3d_Bluetooth

- ข้อมูลเพิ่มเติม

- เมื่อ Facemotion3d รับคำสั่งแล้ว จะไม่รับคำสั่งภายนอกเป็นเวลา 0.02 วินาที
- ปัจจุบัน server ที่รับคำสั่งมีเพียง UDP server เท่านั้น เมื่อใช้ UDP ข้อมูลอาจตกหล่นได้ในบางครั้ง ดังนั้นการส่งข้อมูลประมาณสามครั้งจะเพิ่มโอกาสในการสื่อสารได้ถูกต้อง
นักพัฒนาบุคคลที่สามไม่จำเป็นต้องใช้ license Other เสมอไป
นักพัฒนาบุคคลที่สามสามารถใช้ license ที่ต้องการ เช่น Unity license หรือ Blender license เพื่อเลือกชนิดข้อมูลที่จะส่งได้
โปรดทราบว่าราคาของแต่ละ license อาจเปลี่ยนแปลงได้ในอนาคตตามสถานการณ์