VRMのBlendShapeをスクリプトから変更する
VRMでBlendShapeを操作して、キャラクターの表情を変更できるようにしました。Lerpを使ってなめらかに変更できます。
今回つくったもの
やりたいこと
BlendShapeの値を操作して、キャラクターの表情を変更させたくて、かつLerpでなめらかに変更することで生きた表情を作りたいと思いました。
使用したツール / 環境
- Unity 2018.13f1
- UniRx
- UniVRM
全体像
Buttonを押すと ReactiveProperty の値が変更され、それを契機に表情を変更するメソッドを実行しています。
実装
表情の変更
こちらは、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));
感想
本当はまばたき→悲しみという表情の連鎖をさせたかったのが、それはまた別で。