- UDPでデータを受信するには

PC側からiOS側のポート49993へ文字列「FACEMOTION3D_OtherStreaming」を送信すると、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

- 1フレームごとに送信される文字列は以下のとおりです。

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|

- 1フレームごとに送信される文字列は以下のとおりです。

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 |

パラメータには負の値が含まれる場合や、100を超える値が含まれる場合があります。

角度関連のデータはラジアンではなくdegreeで送信されます。

- TCP/IPでデータを受信するには

UDPではフレーム落ちが発生する場合があるため、TCP/IPで受信する方法もあります。

UDPでiOS側のポート49993へ文字列「FACEMOTION3D_OtherStreaming|protocol=tcp」を送信すると、データはPC側のポート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

TCP/IPでiOSからPCへ受信する場合、フレームごとに分割された文字列が送られるため、末尾の「___FACEMOTION3D」を区切り文字として使用します。

TCP/IP送信を停止するには、ポート49993へ文字列「StopStreaming_FACEMOTION3D」を送信します。

- TCP/IPで受信するPython使用例

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内の録画データを受信するには

UDPでiOS側のポート49993へ文字列「v2_OtherBakeRecordedAnimation_FACEMOTION3D」を送信すると、録画データはTCP/IPでPC側のポート49987へ送信されます。

送信される文字列は次の形式です。

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

The ["......", "......", "......"] 部分はJSON形式で、UDPおよびTCP/IPで使用されるものと同じ文字列を含みます。

[time01, time02, time03] 各録画データのインデックスに対応する録画時刻を含みます。

- iOS内の録画データと音声を受信するには

UDPでiOS側のポート49993へ文字列「v2_OtherBakeRecordedAnimation_FACEMOTION3D」を送信すると、録画データはTCP/IPでPC側のポート49987へ送信されます。

送信される文字列は次の形式です。

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

The ["......", "......", "......"] 部分はJSON形式で、UDPおよびTCP/IPで使用されるものと同じ文字列を含みます。

[time01, time02, time03] 各録画データのインデックスに対応する録画時刻を含みます。

- 現在ベイク中であることをユーザーに表示する

iOSアプリに「Currently baking」を表示するには、UDPポート49993へ「BakeOther_FACEMOTION3D」を送信します。bakingメッセージを非表示にするには、UDPポート49993へ「BakeFinishOther_FACEMOTION3D」を送信します。

- iOSアプリ内で録画を開始するには

iOSアプリ内で録画を開始するには、ポート49993へ「FACEMOTION3D_StartRecording」を送信します。

- iOSアプリ内で録画を停止するには

iOSアプリ内で録画を停止するには、ポート49993へ「FACEMOTION3D_StopRecording」を送信します。

- iOSアプリ内でストリーミングを停止するには

iOSアプリ内でストリーミングを停止するには、ポート49993へ「StopStreaming_FACEMOTION3D」を送信します。

- Resetボタンを実行する

iOSのポート49993へ文字列「FACEMOTION3D_resetButton」を送信します。

- Bluetooth

OtherライセンスでBluetooth接続する場合は、次のコードを使用してください。
https://github.com/emoto-yasushi/iFacialMocap_Facemotion3d_Bluetooth

- 追加情報

- Facemotion3dはコマンドを受け付けると、その後0.02秒間は外部コマンドを受け付けません。
- 現在、コマンドを受信するサーバーはUDPサーバーのみです。UDPではデータが欠落する場合があるため、3回程度送信すると正確に通信できる可能性が高くなります。
サードパーティ開発者が必ずしもOtherライセンスを使用する必要はありません。
サードパーティ開発者は、UnityライセンスやBlenderライセンスなど任意のライセンスを使用し、送信するデータの種類を選択できます。
各ライセンスの価格は今後の状況により変更される場合がありますので、ご了承ください。