始めに
4月9日にHTC ViveからViveフェイシャルトラッカーが発売されました。
これまではIPhoneとかで口のトラッキングしてみようかと考えていましたが、HTC公式から発売されたデバイスなので買ってどんなものか試してみたいと思い、勢いで買ってしまいました。
今回は触ってみてのメモとしてまとめていきます。
環境
Unity2020.3.7f1
セットアップ
始めにこちらのサイトの「VIVE EyeとフェイシャルトラッキングSDKをダウンロードする」にアクセスします。
VIVE Facial Tracker For Developers | VIVE Developer 日本
次にアカウントを適当に作成し、移動した後のサイトのタブから「VIVE Eye and Facial Tracking SDK」に移動します。
次に、一番下にある「Download the Latest Version」に移動してVIVE_SRanipalInstaller_1.3.2.0.msiとSDK-v1.3.3.0.zipをダウンロードして解凍とインストールを行います。
Viveフェイシャルトラッカーを起動する
始めにViveフェイシャルトラッカーをPCに接続します。私はUSBTypeC延長ケーブルを使って接続を行いました。
ちゃんと接続ができたら横のランプが緑色、上側のカメラ赤色に光ります。
インストールしたら「SRanipalRuntime」がデスクトップもしくは指定したファイルに入っているので起動します。
無事起動すると、タスクバーにアイコンが追加されてロボの顔の下側が緑?になります。こうなれば起動が完了します。
Unityで使ってみる
SDKファイルの方に入っているSDK/02_Unity/Vive-SRanipal-Unity-PluginをUnityにインポートします。
インポートが完了したら、ViveSR/Scenes/Lipに入ってるLipSample_v2シーンを開きます。
あとは実行して、Viveフェイシャルトラッカーを口元に近づければシーン上の顔が動きます。
v1とv2の違い
フェイシャルトラッカーSDKのバージョンにはv1とv2があります。
2つの違いは舌のトラッキングが出来るか出来ないです。 v1ではできませんが、v2は舌までトラッキングすることが出来ます。
資料によるとしばらくはv1もサポートしていますが、後々サポートしなくなるそうなのでv2を使ったほうが良いかもしれません。
トラッキングできる動作
フェイシャルトラッカーでは36種類の顔下部分動きをトラッキングできます。
ここでは全種類は網羅しきれませんが、いくつか紹介したいと思います。
あごの動き
あごの左右と前への動きをトラッキングできます。
口の開閉
口を開け具合を取ることができます。また、口を閉じたままあごを開く動きも取れます。
頬の動き
頬を膨らませたり、凹ませたりもトラッキングできます。
口の形
口角の上下、口を尖らせる、唇を噛むなども取れます。
プログラムでフェイシャルトラッカーの値を取得する
次にプログラムで取得した顔の値を取得したいと思います。
前準備として、シーン上にSRanipal Lip Framework
を置きバージョンを指定する必要があります。
トラッキングした値を取得する際はSRanipal_Lip_v2.GetLipWeightings
を呼び出します。
public static bool GetLipWeightings(out Dictionary<LipShape_v2, float> shapes) { bool update = UpdateData(); shapes = Weightings; return update; }
LipShape_v2
はenum型であごの前後や口角、舌の動きなどがあります。返り値のboolでトラッキングが成功したかを返します。
UpdateData()
でenum型に対応する口の形の値を取得してます。
また、呼び出した際のフレームを保持し、同フレーム内で再度呼び出された場合は既に取得した値を返しています。なので、何度も呼び出してもパフォーマンスに影響はないでしょう。
実験的に値を取得してTextに表示してみたプログラムが次のようになります。
void Update() { SRanipal_Lip_v2.GetLipWeightings(out _shapes); int i = 0; foreach (var shape in _shapes) { var sb = new StringBuilder(); sb.Append(shape.Key); sb.Append(":"); sb.Append(shape.Value.ToString("0.000")); _texts[i++].text = sb.ToString(); } }
結果としてこのように値を取得できました。
基本的に値は0~1でしたが、舌関係の値が1より大きい値が入ることがありました。
難点
前に購入したモデルで試しそうとしましたが、モデルのシェイプキーはa, i, u, e, oであったためフェイシャルトラッカーが用意している型と一致していませんでした。
なので、モデルで動かすには計算してその形にあった値を求めないといけないようです。
こちらはまだやっていないので何かしらいい形に仕上がったらまとめようと思います。
最後に
簡単にViveフェイシャルトラッカーを触ってみましたが、かなり細かい部分までトラッキングする点に驚きました。
遅延についても公式では6msと小さく、あまり違和感を感じませんでした。意識してみるとほんのちょっとだけ遅れているなと感じると感じる程度なので、見てる側からすると何も感じないと思います。
課題としては既存のモデル等で使おうとすると、少し手を加えないといけないのでそのあたりを気が向いたらやっていこうと思います。