たくあんポリポリ

勉強したことを載せていきます。最近、技術系の記事はZennに書いています。(https://zenn.dev/chittai)

VRMのBlendShapeをスクリプトから変更する

VRMでBlendShapeを操作して、キャラクターの表情を変更できるようにしました。Lerpを使ってなめらかに変更できます。

今回つくったもの

f:id:c_taquna:20180819092758g:plain

やりたいこと

BlendShapeの値を操作して、キャラクターの表情を変更させたくて、かつLerpでなめらかに変更することで生きた表情を作りたいと思いました。

使用したツール / 環境

  • Unity 2018.13f1
  • UniRx
  • UniVRM

全体像

Buttonを押すと ReactiveProperty の値が変更され、それを契機に表情を変更するメソッドを実行しています。

実装

github.com

表情の変更

こちらは、VRMのBlendShapeについて説明されているサイト。
ブレンドシェイプの設定 - dwango on GitHub

こちらは、VRMのBlendShapeをスクリプトから変更する方法が記載されているサイト。
BlendShapeを操作する - dwango on GitHub


今回、表情を変えるためにの実装は以下のコルーチン内で行っています。ReactivePropertyの値が変わる→表情を変更するためのメソッドを実行する→以下のコルーチンで表情を変更する。といった流れになっています。色々考えたのですが、Lerpで処理する場合これかなと。他にいい感じの実装方法ないかな。

        IEnumerator BlinkCoroutine(VRMBlendShapeProxy proxy)
        {
            float blinkParameter = 0;
            blinkParameter = Mathf.Clamp01(blinkParameter);

            while (blinkParameter <= 1)
            {
                proxy.SetValue(BlendShapePreset.Sorrow, Mathf.Lerp(0,1.0f,blinkParameter * 15));
                yield return null;

                blinkParameter += Time.deltaTime;
            }

以下の処理で、BlendShapeに値をセットしています。BlendShapePreset.Sorrow。表情の選択は、この"Sorrow"を変更して上げれば別の表情になります(Blinkとか)

proxy.SetValue(BlendShapePreset.Sorrow, Mathf.Lerp(0,1.0f,blinkParameter * 15));

感想

本当はまばたき→悲しみという表情の連鎖をさせたかったのが、それはまた別で。