したかみ ぶろぐ

Unity成分多め

Viveフェイシャルトラッカーを触ってみる

f:id:vxd-naoshi-19961205-maro:20210530214016j:plain

始めに

4月9日にHTC ViveからViveフェイシャルトラッカーが発売されました。

これまではIPhoneとかで口のトラッキングしてみようかと考えていましたが、HTC公式から発売されたデバイスなので買ってどんなものか試してみたいと思い、勢いで買ってしまいました。

今回は触ってみてのメモとしてまとめていきます。

環境

Unity2020.3.7f1

VRバイスは使わない


セットアップ

始めにこちらのサイトの「VIVE EyeとフェイシャルトラッキングSDKをダウンロードする」にアクセスします。

VIVE Facial Tracker For Developers | VIVE Developer 日本


次にアカウントを適当に作成し、移動した後のサイトのタブから「VIVE Eye and Facial Tracking SDK」に移動します。

f:id:vxd-naoshi-19961205-maro:20210518224344p:plain


次に、一番下にある「Download the Latest Version」に移動してVIVE_SRanipalInstaller_1.3.2.0.msiSDK-v1.3.3.0.zipをダウンロードして解凍とインストールを行います。



Viveフェイシャルトラッカーを起動する

始めにViveフェイシャルトラッカーをPCに接続します。私はUSBTypeC延長ケーブルを使って接続を行いました。

ちゃんと接続ができたら横のランプが緑色、上側のカメラ赤色に光ります。

f:id:vxd-naoshi-19961205-maro:20210518230046j:plain

インストールしたら「SRanipalRuntime」がデスクトップもしくは指定したファイルに入っているので起動します。

無事起動すると、タスクバーにアイコンが追加されてロボの顔の下側が緑?になります。こうなれば起動が完了します。

f:id:vxd-naoshi-19961205-maro:20210518230259p:plain



Unityで使ってみる

SDKファイルの方に入っているSDK/02_Unity/Vive-SRanipal-Unity-PluginをUnityにインポートします。

f:id:vxd-naoshi-19961205-maro:20210518231255p:plain


インポートが完了したら、ViveSR/Scenes/Lipに入ってるLipSample_v2シーンを開きます。

あとは実行して、Viveフェイシャルトラッカーを口元に近づければシーン上の顔が動きます。

f:id:vxd-naoshi-19961205-maro:20210518231137g:plain



v1とv2の違い

フェイシャルトラッカーSDKのバージョンにはv1とv2があります。

2つの違いは舌のトラッキングが出来るか出来ないです。 v1ではできませんが、v2は舌までトラッキングすることが出来ます。

資料によるとしばらくはv1もサポートしていますが、後々サポートしなくなるそうなのでv2を使ったほうが良いかもしれません。

f:id:vxd-naoshi-19961205-maro:20210530215555g:plain



ラッキングできる動作

フェイシャルトラッカーでは36種類の顔下部分動きをトラッキングできます。

ここでは全種類は網羅しきれませんが、いくつか紹介したいと思います。

あごの動き

あごの左右と前への動きをトラッキングできます。

f:id:vxd-naoshi-19961205-maro:20210530220218g:plain


口の開閉

口を開け具合を取ることができます。また、口を閉じたままあごを開く動きも取れます。

f:id:vxd-naoshi-19961205-maro:20210530220531g:plain


頬の動き

頬を膨らませたり、凹ませたりもトラッキングできます。

f:id:vxd-naoshi-19961205-maro:20210530220952g:plain

口の形

口角の上下、口を尖らせる、唇を噛むなども取れます。

f:id:vxd-naoshi-19961205-maro:20210530221732g:plain



プログラムでフェイシャルトラッカーの値を取得する

次にプログラムで取得した顔の値を取得したいと思います。

前準備として、シーン上にSRanipal Lip Frameworkを置きバージョンを指定する必要があります。

f:id:vxd-naoshi-19961205-maro:20210530224153p:plain

f:id:vxd-naoshi-19961205-maro:20210530224312p:plain


ラッキングした値を取得する際はSRanipal_Lip_v2.GetLipWeightingsを呼び出します。

public static bool GetLipWeightings(out Dictionary<LipShape_v2, float> shapes)
{
    bool update = UpdateData();
    shapes = Weightings;
    return update;
}

LipShape_v2enum型であごの前後や口角、舌の動きなどがあります。返り値の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より大きい値が入ることがありました。

f:id:vxd-naoshi-19961205-maro:20210530230338g:plain



難点

前に購入したモデルで試しそうとしましたが、モデルのシェイプキーはa, i, u, e, oであったためフェイシャルトラッカーが用意している型と一致していませんでした。

なので、モデルで動かすには計算してその形にあった値を求めないといけないようです。

f:id:vxd-naoshi-19961205-maro:20210530231706p:plain


こちらはまだやっていないので何かしらいい形に仕上がったらまとめようと思います。



最後に

簡単にViveフェイシャルトラッカーを触ってみましたが、かなり細かい部分までトラッキングする点に驚きました。

遅延についても公式では6msと小さく、あまり違和感を感じませんでした。意識してみるとほんのちょっとだけ遅れているなと感じると感じる程度なので、見てる側からすると何も感じないと思います。

課題としては既存のモデル等で使おうとすると、少し手を加えないといけないのでそのあたりを気が向いたらやっていこうと思います。