iPhone Xのフェイスキャプチャのデータの取得
iPhone Xを購入したので、フェイスキャプチャのデータをCinema 4Dで使う方法とオリジナル3DCGモデルを使ったアニ文字風のアプリの作成方法をリサーチしていたところ、Elisha Hung氏がiPhone Xのフェイスキャプチャデータを記録するXcodeのプロジェクトを公開していたので、とりあえずデータの取得をしてみました。彼は、iPhoneで取得したデータをHoudiniでストリーミングでアニメーション化しているようです。ただ、解説が中国語だったため、このアプリを使ってBlenderで行なっているJimmy Gunawan氏のビデオも参考にしました。
なお、こちらはiPhone XとmacOSのコンピュータが必要になります。Windows環境ではできません。ただし、Developper IDがなくても試せます。
アプリのビルドの準備
とりあえず、最新のXcodeをダウンロードして、使えるようにしておいてください。
まずは、GitHubにあるFaceCaptureX のプロジェクトをダウンロードして、解凍します。
解凍すると、下図のような状態になるので、FaceDataRecorder.xcodeprojをダブルクリックして開きます。開くときファイルはインターネットでダウンロードしたものですが、開いても良いか?という内容の英語メッセージのダイアログが開くので、OKを押して開きます。
プロジェクトが開いたら、左のプロジェクトナビゲーターのFaceDataRecorderを選択して、アプリの識別に使われるバンドルID(Bundle Indentifier)と開発者の認識に使うTeam(Apple ID)を自分のアカウントに切り替えます。これを設定していないとiPhone X実機でアプリが持っていけません。
次に、iPhone XとMacをLightingケーブルで繋ぎます。iOS Simulatorsの選択のところからDeviceのiPhone Xを選択します。次に図②のRunボタンを押すとアプリがビルドされ、iPhone Xにアプリがインストールされ、アプリが起動します。
もし、この時ビルドが成功してもアプリがインストールされない場合、こちらで紹介されている【xcode】誰でもわかるiphone実機テストの設定手順まとめの手順に合わせて設定してください。
アプリの操作方法
アプリは、ストリーミングと記録の2つのモードがあり、ストリーミングはキャプチャーデータをIPアドレスでストリーミングできるようです。これをOSCなどで他のアプリに受け渡すこともできそうですが、その方法まではわかりませんでした。
キャプチャデータをiPhoneに記録するだけならシンプルです。Recordを選択してCaptureボタンを押して、あとは顔を動かすだけです。
記録モードはデフォルトだと30FPSで記録できますが、iマークを押すとFPSを変更できます。
ストリーミングモードにすると、Steraming server のIPアドレスが表示されます。i マークでIPアドレスの変更もできます。
記録データの取得
記録モードでiPhoneに保存されたデータは、iTunesから取得できます。iPhoneをMacに接続してファイル共有からFace Capture Xを選ぶと書類の欄にキャプチャごとにフォルダができているので、このフォルダをデスクトップにドラッグすると記録されたデータがMacに保存されます。
記録されているデータは、キャプチャ時の連番画像とキャプチャしたデータをテキスト化したものになります。
テキストデータは、アプリのコードを見たところ、カメラのトランスフォーム(マトリクス)、フェイスのトランスフォーム(マトリクス)、BlendShapesの頂点マップの座標(XYZ)、BlendShapesの各ターゲットの値が記録されているようです。
各データは、「~」で分離され、値は「:」で分けられています。カメラとフェイスのトランスフォームについては、よくわからなかったので説明を省きます。
頂点座標については、以下のような形で記録されていました。コードの27行目を見る限りX:Y:Zとして記録されているようですが、これがどういう単位の値なのかわかりませんでした。
-0.000310201:-0.0310069:0.0574033
BlendShapesについては、「BlendShapesの名前:ブレンド値」のような形式で記録されています。BlendShapesの名前については、こちらのAppleのサイトで確認できます。
mouthUpperUp_R:0.01259962
mouthPress_L:0.02511425
mouthLowerDown_L:0.1209038
browDown_L:0.1521999
cheekPuff:0.05142314
こちらに収録したデータをアップしたのでご覧になりたい方はどうぞ。
頂点データをCinema 4Dに取り込む
取り込み用にデータの整形
とりあえず、データが本当に頂点データなのか確かめて見ます。このデータをCinema 4Dに読み込むに当たって、データを整理します。まず、テキストエディタで1行目だけをコピーして、新規テキストファイルにペースとします。置換機能を使って「~」を改行に変換します。
最初の2行(カメラとフェイスのトランスフォームのマトリクスデータとBlendShapesの名前が出てくる1223行目以降を削除します。さらに、XYZを区切っている「:」をタブに置換します。このテキストファイルを保存します。
保存したファイルをExcelで開きます。各値が小数点以下で値が小さすぎるので、開いたセルに10000と入力して、そのセルをコピーします。(画像は、100万なっていますが、大きすぎたので1万倍くらいで良さそうです)
次に取り込んだデータのセルを全て選択して、演算の乗算を選んでOKを押します。そうすると選択したセルの値が100万倍になるので、Cinema 4Dで扱いやすい数値になります。
1万倍された値。この後、10000を入力したセルの値は削除しておきます。
さらに、先頭に桁を挿入して、0から連番を入力します。これは、Cinema 4DでASCIIデータをインポートする場合1桁目がポイント番号になるからです。
textデータかcsvデータとして保存したら準備が完了です。
Cinema 4Dに取り込み
頂点情報のデータをCinema 4Dに取り込むには、Cinema 4Dで作成メニュー/オブジェクト/空のポリゴンを作成します。オブジェクトマネージャでできたポリゴンオブジェクトを選択して、構造マネージャを選びポイントモードにして、ファイルメニュー/Asciiデータをインポートを選び、先ほど保存したテキストファイルを読み込みます。Cinema 4Dをポイントモードにするとポイントがインポートされているのがわかります。顔は+Z方向を向いています。
問題なく読み込めました。これをアニメーションデータとして読み込むには、Pythonスクリプトで1行ごとにフレーム単位の処理をさせる必要がありそうです。