- Nhận dữ liệu qua UDP

Nếu gửi chuỗi "FACEMOTION3D_OtherStreaming" từ phía PC tới port 49993 trên iOS, Facemotion3d sẽ trả lời về port 49993 bằng UDP ở 60FPS.

- Ví dụ 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

- Chuỗi ký tự gửi theo từng frame như sau.

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|

- Các chuỗi ký tự gửi theo từng frame có dạng như sau.

Tên BlendShape&tham số (0 ~ 100) | Tên BlendShape-tham số (0 ~ 100) | .... | = head # góc Euler X (độ), góc Euler Y, góc Euler Z, giá trị vị trí X, giá trị vị trí Y, giá trị vị trí Z | rightEye #góc Euler X, góc Euler Y, góc Euler Z | leftEye #góc Euler X, góc Euler Y, góc Euler Z |

Tham số có thể là giá trị âm hoặc vượt quá 100.

Dữ liệu liên quan đến góc được gửi theo độ, không phải radian.

- Nhận dữ liệu qua TCP / IP

Với UDP, frame có thể bị rớt, vì vậy cũng có cách nhận bằng TCP / IP.

Nếu gửi chuỗi "FACEMOTION3D_OtherStreaming|protocol=tcp" tới port 49993 trên iOS bằng UDP, dữ liệu sẽ được gửi tới port 49986 trên PC.

Chuỗi được gửi chỉ là chuỗi dùng khi gửi UDP, có thêm "___FACEMOTION3D" ở cuối.

- mẫu

Tên BlendShape&tham số (0 ~ 100) | Tên BlendShape-tham số (0 ~ 100) | .... | = head # góc Euler X, góc Euler Y, góc Euler Z, giá trị chuyển động X, giá trị chuyển động Y, giá trị chuyển động Z | rightEye #góc Euler X, góc Euler Y, góc Euler Z | leftEye #góc Euler X, góc Euler Y, góc Euler Z | ___ Facemotion3d

Khi nhận từ iOS sang PC bằng TCP / IP, chuỗi ký tự có thể bị tách khung, vì vậy hãy dùng "___FACEMOTION3D" ở cuối làm dấu phân cách.

Để dừng gửi TCP / IP, hãy gửi chuỗi "StopStreaming_FACEMOTION3D" tới port 49993.

- Ví dụ dùng Python để nhận qua 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'))

- Nhận dữ liệu đã ghi trong iOS

Nếu gửi chuỗi “v2_OtherBakeRecordedAnimation_FACEMOTION3D” qua UDP tới port 49993 trên iOS, dữ liệu đã ghi sẽ được gửi tới PC qua TCP/IP ở port 49987.

Chuỗi được truyền có định dạng như sau:

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

Phần["......", "......", "......"]có định dạng JSON và chứa các chuỗi giống như khi dùng qua UDP và TCP/IP.

[time01, time02, time03]chứa thời gian ghi tương ứng với từng chỉ mục dữ liệu ghi.

- Nhận dữ liệu đã ghi và âm thanh trong iOS

Nếu gửi chuỗi “v2_OtherBakeRecordedAnimation_FACEMOTION3D” qua UDP tới port 49993 trên iOS, dữ liệu đã ghi sẽ được gửi tới PC qua TCP/IP ở port 49987.

Chuỗi được truyền có định dạng như sau:

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

Phần["......", "......", "......"]có định dạng JSON và chứa các chuỗi giống như khi dùng qua UDP và TCP/IP.

[time01, time02, time03]chứa thời gian ghi tương ứng với từng chỉ mục dữ liệu ghi.

- Hiển thị cho người dùng rằng hiện đang baking

Để hiển thị “Currently baking” trong ứng dụng iOS, gửi “BakeOther_FACEMOTION3D” tới UDP port 49993. Để ẩn thông báo baking, gửi “BakeFinishOther_FACEMOTION3D” tới UDP port 49993.

- Bắt đầu ghi trong ứng dụng iOS

Để bắt đầu ghi trong ứng dụng iOS, gửi "FACEMOTION3D_StartRecording" tới port 49993.

- Dừng ghi trong ứng dụng iOS

Để dừng ghi trong ứng dụng iOS, gửi "FACEMOTION3D_StopRecording" tới port 49993.

- Dừng streaming trong ứng dụng iOS

Để dừng streaming trong ứng dụng iOS, gửi "StopStreaming_FACEMOTION3D" tới port 49993.

- Chạy Reset Button

Gửi chuỗi "FACEMOTION3D_resetButton" tới port iOS 49993.

- Bluetooth

Để kết nối qua Bluetooth bằng license Other, vui lòng dùng mã sau:
https://github.com/emoto-yasushi/iFacialMocap_Facemotion3d_Bluetooth

- Thông tin bổ sung

- Sau khi nhận lệnh, Facemotion3d sẽ không nhận lệnh bên ngoài trong 0,02 giây.
- Hiện tại, server duy nhất nhận lệnh là UDP server. Với UDP, dữ liệu đôi khi có thể bị thiếu, vì vậy gửi dữ liệu khoảng ba lần sẽ tăng khả năng giao tiếp chính xác.
Nhà phát triển bên thứ ba không nhất thiết phải dùng license Other.
Nhà phát triển bên thứ ba có thể dùng license mình muốn, chẳng hạn Unity license hoặc Blender license, để chọn loại dữ liệu cần gửi.
Vui lòng lưu ý rằng giá của từng license có thể thay đổi trong tương lai tùy tình hình.