- UDP ile veri almak

PC tarafından iOS tarafındaki 49993 portuna "FACEMOTION3D_OtherStreaming" dizesini gönderirseniz, Facemotion3d 49993 portuna UDP ile 60FPS yanıt döndürür.

- Python örneği

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

- Her karede gönderilen karakter dizisi aşağıdaki gibidir.

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|

- Her karede gönderilen karakter dizilerinin formatı aşağıdaki gibidir.

BlendShape Adı&Parametreler (0 ~ 100) | BlendShape Adları-Parametreler (0 ~ 100) | .... | = head # Euler açıları X (derece), Euler açıları Y, Euler açıları Z, konum değerleri X, konum değerleri Y, konum değerleri Z | rightEye #Euler açıları X, Euler açıları Y, Euler açıları Z | leftEye #Euler açıları X, Euler açıları Y, Euler açıları Z |

Parametre negatif değer içerebilir veya 100'ü aşabilir.

Açıyla ilgili veriler radyan değil derece olarak gönderilir.

- TCP / IP ile veri almak

UDP kullanıldığında kareler düşebilir; bu yüzden TCP / IP ile alma yöntemi de vardır.

UDP ile iOS tarafındaki 49993 portuna "FACEMOTION3D_OtherStreaming|protocol=tcp" dizesini gönderirseniz veri PC tarafındaki 49986 portuna gönderilir.

Gönderilecek karakter dizisi, UDP sırasında gönderilen dizeye yalnızca "___FACEMOTION3D" eklenmiş halidir.

- örnek

BlendShape Adı&Parametre (0 ~ 100) | BlendShape Adı-Parametre (0 ~ 100) | .... | = head # Euler açıları X, Euler açıları Y, Euler açıları Z, hareket değerleri X, hareket değerleri Y, hareket değerleri Z | rightEye #Euler açıları X, Euler açıları Y, Euler açıları Z | leftEye #Euler açıları X, Euler açıları Y, Euler açıları Z | ___ Facemotion3d

TCP / IP ile iOS'tan PC'ye alırken kareleri bölünmüş bir karakter dizisi gönderilebilir; bu yüzden sondaki "___FACEMOTION3D" değerini ayırıcı olarak kullanın.

TCP / IP gönderimini durdurmak için 49993 portuna "StopStreaming_FACEMOTION3D" dizesini gönderin.

- TCP / IP üzerinden alma için Python kullanım örneği

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'taki kayıt verilerini almak

UDP ile iOS tarafındaki 49993 portuna “v2_OtherBakeRecordedAnimation_FACEMOTION3D” dizesini gönderirseniz, kayıt verileri TCP/IP üzerinden PC'ye 49987 portundan gönderilir.

Aktarılan karakter dizisi şu formattadır:

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

Bölüm["......", "......", "......"]JSON formatındadır ve UDP ile TCP/IP üzerinde kullanılan aynı dizeleri içerir.

[time01, time02, time03]her kayıt verisi indeksine karşılık gelen kayıt sürelerini içerir.

- iOS'taki kayıt verilerini ve sesi almak

UDP ile iOS tarafındaki 49993 portuna “v2_OtherBakeRecordedAnimation_FACEMOTION3D” dizesini gönderirseniz, kayıt verileri TCP/IP üzerinden PC'ye 49987 portundan gönderilir.

Aktarılan karakter dizisi şu formattadır:

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

Bölüm["......", "......", "......"]JSON formatındadır ve UDP ile TCP/IP üzerinde kullanılan aynı dizeleri içerir.

[time01, time02, time03]her kayıt verisi indeksine karşılık gelen kayıt sürelerini içerir.

- Kullanıcıya şu anda baking yapıldığını göstermek

iOS uygulamasında “Currently baking” göstermek için UDP 49993 portuna “BakeOther_FACEMOTION3D” gönderin. Baking mesajını gizlemek için UDP 49993 portuna “BakeFinishOther_FACEMOTION3D” gönderin.

- iOS uygulaması içinde kaydı başlatmak

iOS uygulaması içinde kaydı başlatmak için 49993 portuna "FACEMOTION3D_StartRecording" gönderin.

- iOS uygulaması içinde kaydı durdurmak

iOS uygulaması içinde kaydı durdurmak için 49993 portuna "FACEMOTION3D_StopRecording" gönderin.

- iOS uygulaması içinde streaming'i durdurmak

iOS uygulaması içinde streaming'i durdurmak için 49993 portuna "StopStreaming_FACEMOTION3D" gönderin.

- Reset Button'ı çalıştırmak

iOS 49993 portuna "FACEMOTION3D_resetButton" dizesini gönderin.

- Bluetooth

Other lisansı kullanarak Bluetooth üzerinden bağlanmak için aşağıdaki kodu kullanın:
https://github.com/emoto-yasushi/iFacialMocap_Facemotion3d_Bluetooth

- Ek bilgiler

- Facemotion3d bir komutu kabul ettikten sonra 0,02 saniye boyunca harici komut kabul etmez.
- Şu anda komut alan tek sunucu UDP sunucusudur. UDP ile veriler bazen kaçabilir; bu yüzden veriyi yaklaşık üç kez göndermek doğru iletişim olasılığını artırır.
3. taraf geliştiricilerin mutlaka Other lisansını kullanması gerekmez.
3. taraf geliştiriciler, gönderilecek veri türünü seçmek için Unity lisansı veya Blender lisansı gibi tercih ettikleri lisansları kullanabilir.
Lütfen her lisansın fiyatının duruma bağlı olarak gelecekte değişebileceğini unutmayın.