特集、その他

窓辺とおこをもっと可愛くしたい! VRChatで口パクとスカートのヒラヒラ感を再現してみた

リップシンクと布の物理演算を導入、自然な人らしさを再現 text by 坂本はじめ

 前回、「窓辺とおこ」の3DモデルをVRChatにアップロードし、自身のアバターとして利用できるようになるまでの手順を紹介した。

 オリジナルアバターでVRChatを楽しむための最低限の設定は前回の記事で紹介しているが、もう一手間を加えることで3Dモデルが持つ魅力をより引き出すことができる。

 手軽ではないが、アバターをよりかわいく見せたりするに非常に有効で、作り込もうと思えばまさに“命を吹き込む”といったレベルでこだわることも可能だ。

 今回はVRChat上で「窓辺とおこ」をより魅力的に見せるため、「リップシンク」と「スカートの物理演算」を導入する手順を紹介しよう。

 なお、「窓辺とおこ」の3DデータはDIGITAL DIYのサイトで公開されている記事から期間限定で入手可能だ。

アバターの魅力をより高める「リップシンク」と「スカートの物理演算」

 今回3Dモデルに追加するのは、「リップシンク」と「スカートの物理演算」の2つ。

 リップシンクとは、ユーザーの音声に応じて3Dモデルが口パクをすることだ。アバター同士が顔を突き合わせてボイスチャットを楽しむVRChatにおいて、リップシンクはアバター自身が喋っているという印象を相手に与える重要な要素だ。

前回の基本設定では、ユーザーが喋っている最中でもアバターの口は動かない。
リップシンクを実装した状態。音声に応じて口が動くだけで、アバターと会話しているという印象が強くなる。

 また、スカートの物理演算は、窓辺とおこが身に着けているスカートを物理演算によって布らしく振舞わせるために行う設定だ。

 前回記事でおこなった基本設定では、スカートは他の物体と干渉せず、変形もしない状態となっている。従って、しゃがんだり椅子に座ったりした場合、足はスカートを貫通してしまう。今回は物理演算によってこのリアリティの無い描画の解消を図りたい。

前回の基本設定では、スカートは変形も干渉もしないため、しゃがみ動作などでは足がスカートを貫通してしまう。
物理演算を適用した状態。スカートは足と干渉して布らしく変形している。

 ただたっている状態であれば違いとしてわからない部分なので、地味に思うかもしれない。しかし、こうした部分の作り込みがアバターに命を吹き込むと言いえる。実際に作り込まれたアバターが動いている様をみるとなかなか感動するものだ。

“人形”と“人”くらいの違いが生まれるリップシンク

 VRChat用アバターでリップシンクを行うには、3Dモデル側で音声に対応した表情パターンを作成しておく必要がある。

 幸いなことに、今回利用する「窓辺とおこ」の3Dモデルには、リップシンク用に母音に相当する「あいうえお」の表情パターンが用意されているので、これを活用する。なお、VRChatは英語ベースで作られているため、この素材を英語の発音にあわせてあてはめていくことになる。

 Unityを起動し、前回記事で設定を行ったプロジェクトファイルを開いたら、まずは画面左の「Hierarchy」で「Model」を選択する。

 画面右側のInspector内の「VRC_Avator_Descriptor (Script)」にある「Lip Sync」を「Viseme Blend Shape」に変更する。

Unityでプロジェクトを開いたら、Hierarchyの「Model」を選択する。
VRC_Avator_Descriptor (Script)のLip Syncを「Viseme Blend Shape」に変更。

 Lip Syncの下に追加された「Face Mesh」の項目が表示されるので、右側の丸いボタンをクリックして「Select SkinnedMeshRenderer」を開く。

 Select SkinnedMeshRendererで「face」を選択する。選択後Select SkinnedMeshRendererを閉じる。

Unityでプロジェクトを開いたら、Hierarchyの「Model」を選択。
Select SkinnedMeshRendererで「face」を選択。

 Face Mesh以下に「Visame:○○○」という15個の項目が表示される。これが発音と表情パターンを紐づけるための設定項目だ。

 各項目はドロップダウンリストとなっており、クリックすると3Dモデルに用意された表情パターンを選択していく。なお、該当する表情が無くても「-none-」を選択せず、いずれかの表情パターンを適用しなければならない。

Face Meshの下に「Visame:○○○」という項目が15個表示される。発音と表情パターンを対応させるための項目だ。
各項目はドロップダウンリストとなっており、3Dモデルの表情パターンから適当なものを割り当てることになる。

 今回利用した窓辺とおこの3Dモデルには、15パターンの表情は用意されていないので、各項目に近いと思われる表情パターンを設定していくことになる。VRChatが用意している「設定ガイド(Part 3: Visemes And Other Blend Shapesに記載)」を参照しつつ、各項目に適した表情パターンを設定しよう。

 なお、この項目をガイドに従って設定した場合であっても完璧なリップシンクにはならないので、表情の選択はざっくりとしたものでOKだ。以下のような設定でも、アバターがしゃべっているという演出には十分、かなり良い雰囲気にはなる。

今回適用した設定。発音を完璧に再現する口パクは難しいが、アバターがしゃべっている感じを演出するには十分な効果がある。

アバターの作り物感が大幅に減少、スカートの物理演算の実装手順

 スカートの物理演算は、Unityが備える「Cloth コンポーネント」を利用することで行える。これは布を物理演算によってシミュレーションする機能で、設定することでスカートに布らしい振舞いをさせることができる。

 スカートの物理演算を実装する手順は、「スカート部分への物理演算の実装」と「スカートと干渉する部分への当たり判定の実装」の2つに分けることができる。ここでは、前者から順を追って紹介していく。

【手順1】Unityの「Cloth コンポーネント」による物理演算の実装

 まず、HierarchyのModelを展開し、Model内の「clothes」を選択する。

 Inspectorの「Add Component」をクリックし、「Physics」→「Cloth」の順で選択する。

3Dモデル内のスカートを含むパーツであるclothesを選択する。(Hierarchy → Model → clothes)
clothesに物理演算用のCloth コンポーネントを追加。(Add Component → Physics → Cloth)

 ここまでの手順により、Inspectorに「Cloth」という項目が追加されるので、同項目内のEdit Constraintsボタンを押す。

 プレビュー画面上にclothesの各頂点が表示されるので、「Ctrl+A」キーを押して全ての頂点を選択する。

 プレビュー画面右下に表示されたCloth Constraints内にある「Max Distance」にチェックを入れる。

 ここまでの操作により、物理演算の対象となる頂点の全てに対して「Max Distance=0」が適用され赤色で表示される。Max Distanceは頂点の移動距離を制限するもので、0が適用された頂点は固定された状態となる。これは、スカート以外の部分が変形しないようにするための措置だ。

Inspectorに「Cloth」が追加されるので、Edit Constraintsボタンを押す。物理演算の対象となる3Dモデルの頂点が表示される。
CtrlキーとAキーを同時押しして、全ての頂点を一括選択する。
プレビュー画面内のCloth ConstraintsでMax Distanceにチェックを入れる。
画面内の適当な場所をクリックして一括選択を解除。Max Distanceにデフォルト値の「0」が適用された頂点は全て赤色で表示される。

 つづいて、3Dモデルの中で物理演算を適用したい箇所、今回の場合はスカート部分のMax Distanceを調整する。

 行う作業は、スカート部分の頂点を選択し、Max Distanceの値を大きなものに設定するというものだ。各頂点はマウスのドラッグ操作による範囲選択が可能だが、範囲選択はプレビュー画面の視点に正対しているものしか反映されないので、カメラの視点をかえつつ設定を行っていこう。

 今回は、スカート部分のMax Distanceはすべて「10」を適用した。これでも問題なく物理演算は適用されるが、スカートの裾から遠ざかるほどMax Distanceの値を小さくすることで、よりリアリティのある動作にすることもできる。

スカート部分の頂点を選択してMax Distanceの値を調整する。
マウスのドラッグ操作で複数の頂点をまとめて選択できる。
今回はスカート部分の頂点はMax Distanceを10に設定した。
ドラッグ操作による範囲選択は正対している頂点しか選択できない。カメラの向きをかえ、4方向から同じ操作を行おう。

 物理演算で動かす範囲の設定が終わったら、InspectorのClothから物理演算のパラメーターを調整する。Clothコンポーネントの各項目の意味と機能はUnityのマニュアルを参照して貰いたい。

 各パラメーターの設定値によって、スカートの動きは様々に変化する。今回はとりあえずスカートのような動作が得られる値として以下の数値を適用してみた。この数値は後から変更することも可能なので、アップロード後に想像していた動作でなかった場合は再調整すると良いだろう。

スカートに適用した物理演算パラメーター。数値は後から変更することができるので、好みの動作になるまで調整しよう。

【手順2】足が貫通しないスカートを実現する「当たり判定の実装」

 ここではCloth コンポーネントの「Sphere Colliders」で当たり判定を設定する手順を紹介する。

 Cloth コンポーネントのSphere Collidersは、2つの球形オブジェクトの間を補完する形で当たり判定を実装するものだ。今回はこの機能を使って、スカートに対する足の当たり判定を設定する。

 まず、Hierarchyからclothesを選択し、Inspector最上段のオブジェクト名の隣にあるチェックボックスを外す。これにより、当たり判定の実装作業の邪魔となる服を非表示にできる。

 なお、以降のスクリーンショットではボディ部分の表示をワイヤーフレームにしているが、これは特に必要の無い設定なので手順は省略する。

Hierarchyからclothesを選択する。
Inspectorの最上段、オブジェクト名の左側にあるチェックボックスを外すことで、オブジェクトは非表示になる。

 Hierarchyから「body」を選択。右クリックして「3D Object」→「Sphere」の順に選択してSphereを追加する。

Hierarchyからbodyを選択。右クリックメニューから「3D Object」→「Sphere」の順でオブジェクトを追加する。
追加されたSphereオブジェクト。

 bodyに追加された「Sphere」を選択し、Inspectorの「Transform」でPositionとScaleを調整することで、右足の付け根部分にSphereオブジェクトを埋め込む。

 埋め込むSphereオブジェクトのサイズは、足の大きさよりも多少大きい程度にしておくと、スカートに足がめりこみにくくなる。あまり大きく設定し過ぎると、足からスカートが浮き上がる形になるので、多少大きい程度にとどめておくことがポイントだ。配置は正面と側面から調整しておこう。

InspectorのTransformから、PositionとScaleを調整してSphereオブジェクトを右足の付け根部分に埋め込んだ。Sphereオブジェクトのサイズは足より多少大きめにしておくのがポイントだ。

 Hierarchyから右足付け根に埋め込んだSphereオブジェクトを選択し、オブジェクトの名前を「Right_up」に変更する。オブジェクト名は自分が判別できるのであれば何でも構わない。

 先ほどリネームした「Right_up」をコピー&ペーストして、Sphereオブジェクトを追加する。

Sphereオブジェクトの名称を「Right_up」にリネームする。
「Right_up」をコピー&ペーストして、同じオブジェクトを一つ追加する。

 コピー&ペーストで複製したオブジェクトは、Inspectorの「Transform」でPositionとScaleを調整して右足の膝付近に埋め込む。

 今回の3Dモデルでは、膝部分は足の付け根より細くなっているが、膝の太さに合わせてオブジェクトのサイズを調整してしまうと、2つのオブジェクト間を繋いだ際に当たり判定が太ももに埋没してしまうため、あえて大きめに設定した。

複製したオブジェクトを右膝部分に埋め込んだ。当たり判定は足の付け根と膝部分の間を補完する形で配置されることになる。

 Hierarchyで、右膝に埋め込んだオブジェクトの名前を「Right_down」にリネームする。

 「Right_up」と「Right_down」の2つをコピー&ペーストして、両オブジェクトの複製を作成する。複製したオブジェクトは左足用なので、それぞれ名前を「Left_up」と「Left_down」にリネームする。

 3Dモデルの足の位置は左右対称なので、「Left_up」と「Left_down」の位置調整は、PositionのX値をマイナスにするだけで完了だ。

右足に埋め込んだオブジェクトの名前をRight downにリネームする。
「Right_up」と「Right_down」を複製する。
複製したオブジェクトを「Left_up」と「Left_down」にリネームし、InspectorのTransformからPositionのX値をマイナスに変更する。これで左足用オブジェクトも用意完了だ。

 Hierarchyで、「Right_up」、「Right_down」、「Left_up」、「Left_down」の4つを選択する。

 Inspector最上段左側のチェックボックスを外し、先ほど選択した4つのオブジェクトをすべて非表示にする。

Hierarchyで、足に埋め込んだ4つのオブジェクトを選択する。
Inspector最上段左側のチェックボックスを外し、足に埋め込んだオブジェクトを全て非表示にする。

 Hierarchyから、Model → Root → Hipsの順で展開し、足の可動部である「L_UpperLeg」と「R_UpperLeg」を表示する。

 L_UpperLegに「Left_up」と「Left_down」、R_UpperLegに「Right_up」と「Right_down」をそれぞれ移動する。左右を間違えないように注意しよう。

Hierarchyで、Model → Root → Hipsの順で展開し、「L_UpperLeg」と「R_UpperLeg」を表示する。
L_UpperLegとR_UpperLegの直下に、足に埋め込んだオブジェクトを移動する。

 Hierarchyでclothesを選択。Inspector最上段左側のチェックボックスにチェックを入れて服を再表示する。

 InspectorのClothの最下段にあるSphere Collidersをクリックして、sizeに「2」を入力する。これにより、Sphere Collidersに「Element 0」と「Element 1」が追加され、それぞれにFirstとSecondの設定項目が表示される。

 FirstとSecondの項目右側の丸いボタンを押すと「Select SphereCollider」が開くので、Element毎に左または右のupとdownの組み合わせを設定する。これで、当たり判定の設定は完了だ。

Hierarchyでclothesを選択し、Inspector最上段左側のチェックボックスをチェックして服を再表示する。
ClothのSphere Collidersをクリックし、Sizeに2を入力する。
画面右下のSphere Collidersに「Element 0」と「Element 1」が追加され、それぞれにFirstとSecondの設定項目が表示される。
FirstとSecondの項目右端のボタンを押すとSelect SphereColliderが開く。
今回は「Element 0」に左足、「Element 1」に右足の当たり判定を設定した。
ここまでの設定が正常に完了していれば、HierarchyでModelを選択した際に、足の部分に当たり判定が表示される。

手間はかかるが、それに見合う価値のあるアバターの調整

 以上で、アバターに「リップシンク」と「スカートの物理演算」を追加する手順は完了だ。後はVRChatにアップロードして動きを確認し、不具合があるようなら各パラメーターの微調整を行うことになる。

 同じプロジェクトで同じアバターをVRChatにアップロードすれば、基本的に古いアバターを上書き更新する形となるが、もしアップロード済みのアバターを削除したい場合、Unityのメニューバーから「VRChat SDK」→「Manage Upload Content」と選択すれば管理画面が表示される。

アップロードしたアバターなどの削除は、メニューバーのVRChat SDKからManage Upload Contentを開くことで行える。

 それなりに手間のかかる作業ではあるが、リップシンクもスカートの物理演算も、ちゃんとVRChat上で機能しているのを見ると、まるでアバターに命が吹き込まれたかのような躍動感に感動すること間違いなしだ。

 今回は触れられなかったが、まばたきなど目の表現や、髪の毛などの設定も可能で、作り込めば作り込むほどキャラクターの存在感が増す。

 VRChatにオリジナルアバターをアップロードするのであれば、手間を惜しまずアバターの調整を行うことをおすすめしたい。