VRアプリ内でVRoidモデルの表情を変えたい
操作系
ほかのVRアプリではどんな操作で表情を変えているのか。
VirtualCast
右手コントローラーのトラックパッド・スティックで変更
VRchat
VRChatもタッチパッド
表情切替操作
- VRモード
- vive:タッチパッド、トリガー、サイドボタン
- Oculus:指のタッチセンサーを利用
- デスクトップモード
VRMのBlendShapeスクリプト
VRMのBlendShapeをスクリプトから制御するには?
公式ドキュメント。
var proxy=GetComponent<VRMBlendShapeProxy>();
// enumで呼び出し
proxy.ImmediatelySetValue(BlendShapePreset.A, 1.0f); // 0から1で指定
// stringで呼び出し
proxy.ImmediatelySetValue("A", 1.0f);
注意
・ImmediatelySetValueを使う。過去の記事で出てくるSetValueは旧式だって。
・enumにないもの(unknown)はstringで呼び出す。
・<VRMBlendShapeProxy>はupdateでGetしないと取れないらしい。
クラス
これらの記事を参考にクラス作ってみた。
こんな感じで呼び出す
SetBlendShape(BlendShapePreset.Sorrow);
でもこれだとBlendShapePresetに登録されていないもの(unknown)が呼び出せないことに気づいた。string呼び出しもできるようにせねば・・・
Dictionary
こんな感じにしてみた
もっといい方法がありそうだけどとりあえずこれで動く
SetBlendShape("Surprised")
SetBlendShape("Zitome")
みたいに呼び出せばよい。
表情をすべて0に戻すときはResetBlendShape()を呼ぶ。
他の表情を呼び出したときに、前の表情を0に戻すなら、SetBlendShape()の中にResetBlendShape()を置く。
表情切り替えのトリガー
他のアプリを習って、タッチパッドの向きで表情を変えたい。
RadialMenu
VRTKについているRadialMenuというのを使えば行けるか?
RadialMenuを検索で探す
プレハブを各手のScriptAreaの下に置く
PanelにVRTK_RadialMenuがついている。
そこのButtonを開くと、Buttonの数やアイコン、クリックしたときの動作を設定できる。
イベント
Clickはスティックを傾けたうえで、押し込んだ時に反応する。
Hoverで proxy.ImmediatelySetValue(preset, 1f);
Hover Exitでproxy.ImmediatelySetValue(preset, 0f);
するのが良いのか・・・?と思ったが、なんかどれもうまくいかなかった。一瞬で表情が消えたりする。
メニューの見た目
アイコンはButtons>Element>ButtonIcon
背景の色はButtonColorで変える
変更は、一番下のRegenerate Buttonsを押さないと反映されない
自分で実装
メニュー表示部分はRadialMenuをそのまま使った。ニュってメニューが出てくるの面白い。
いろいろあって、自分でタッチパッドの押下を自分のスクリプトで取得して実装することにした。それは別記事にイベントの取り方を書いたので、こちらを見てください。良いやり方かは分からない。
表情アイコン
MaterialDesign
こちらのサイトもよかった。
BlendShapeの設定
ここをみよ。
VRoidモデルの表情は独特だから、少しパラメーターをいじって、口の大きさとか゚減らしたほうがいいかも
リップシンク
声によってリップシンクしている時に表情変えたらどうなるんだろう?
VTuber 向けの 3D モデルを製作する各位、表情を Blendshape で作る際は目と口で Blendshape Target を分けると口パクと表情の両立がとてもしやすくなるので、その点重要です。
— さんたーP (@santarh) 2018年6月18日
最後に
もっとクールな方法ありそう・・・