はいぬっかメモ

キャラクターモデルをVR空間で眺めたい

VRoidでかんたん!パーフェクトシンク(2/3)BlendShape追加、顔の入れ替え

f:id:hinzka:20200821073514p:plain

 

iPhoneフェイストラッキング向けBlendShape追加 VRoid編 

<概要>
iPhoneのフェイストラッキングに必要なBlendShapeを追加します。
雛形のモデルからシェイプキー転送します。
元のVRMに新しい顔を入れ替えます。

f:id:hinzka:20200821225941p:plain本解説で使用しているUnity・Blenderのバージョンは以下の通りです。

Unity:2019.4.0f1

Blender:v2.83.2

 

 

1. 配布ファイル

性別によってメッシュの構成が異なります。同一の性別の雛形を使用してください。
 
女性モデル向け

 

男性モデルのメッシュについて、VRoidStudioで作成したときのモデルにより2種類存在するようです。 ※調査中

コピーに失敗する場合はもう片方の雛形をお試しください。

 雛形モデル(男性モデルA 桜田史利矢)
 雛形モデル(男性モデルB MaleHairSample)

drive.google.com

 
 
 

2.【Blender】雛形モデルからBlendShape複製

2-1. BlendShape複製

(前回から引き続き)Blender上にモデルが表示されている状態です。

ここに雛形モデルをアペンドします。

f:id:hinzka:20200819122136p:plain

f:id:hinzka:20200819124014p:plain

Filter Blender IDs を有効にするとアペンドするファイルの種類を指定できます。

Objectsを選択状態にして、雛形の.blendファイルを選択します。objectフォルダの下にFaceオブジェクトがあります。

f:id:hinzka:20200819123917p:plain

Appendを選択すると、雛形の顔オブジェクトが追加で読み込まれます。

f:id:hinzka:20200819125521p:plain

(同名オブジェクトが存在するときは、後から読み込んだ方に自動で連番が付加されます)

 

【シェイプキーの転送】
シェイプキーを転送します。
 
 シェイプキーの転送を行うアドオン
転送元のシェイプキーをすべて転送します。
(雛形モデルからはデフォルトの表情を削除しているため重複はしません)

f:id:hinzka:20200819125939g:plain

スポイトツールでTargetオブジェクトとSourceオブジェクトをそれぞれ選択し、「シェイプキーを転送」を実行します。
頂点の状態が異なると転送に失敗します。転送先のモデルが前章の手順で作成されていることを確認してください。
 

2-2. 失敗するときの原因と対策

クリックで展開
・VRoid Studioのバージョンが異なる
   → 最新版のVRoid Studio( v0.11.1 )でVRM出力してお試しください。
・アクセサリ追加などのために他のツールを経由している
   → VRoid Studioから直接出力されたVRMをお使いください。
     本章の4で顔を差し替えるとき、アクセサリ追加されたVRMの体に差し替えてください。
・FBX Expoterのバージョンが異なる
   → UnityのPackageManagerから最新版を入れるようにしてください( v3.2.0以降 )。
     Asset Storeからインポートすると古いバージョンになってしまいます。
・雛形の種類が異なる
   → コピー元の.blendファイルはターゲットと同じ性別のものをお使いください。
     男性はさらに2種類あるので、一方で失敗したらもう片方も試してみてください。
 
※転送直後、BlendShapeリストの最後(tongueOut)が選択状態になります。エクスポート時にはBasisを選択状態にしてください。
 

2-3. iFacialMocapでの動作確認

クリックで展開
Blender上で顔の動作確認することができます。 
 
流用の予定がなければ、この動作確認は本章5の段階(マテリアル設定済)で行うのがおすすめです。ただし、5の段階ではメッシュの状態が共通ではなくなっています。
 
他のモデルへモーフを転送可能なVRoid用雛形として流用するなら、この段階でマテリアルを設定してモーフの形状を編集・.blendファイル保存するのがおすすめです。マテリアルの設定方法は前章のおまけに記載しています。
 
詳しくはiFacialMocapの解説を参照 

f:id:hinzka:20200830110513p:plain



 

2-4. シェイプキーのソートと追加

クリックで展開
手動で一部のシェイプキーを追加・作成した場合など、必要に応じてシェイプキーの並びをソートできます。
 
シェイプキーのソートを行うアドオン
iFacialMocap、FaceCapのそれぞれの命名規則にシェイプキー名が適合しているかをチェックします。
不足したキーをダミーで埋める機能もあります。全部手動でつくる場合など、入力ミスをなくすことができて大変便利です。
 
さらに、これらのBlendShapeがリストの先頭にくるように並べ替えます。
 ソート後はBasisが選択状態になります。
 
 
 
 転送に成功したことを確認したら、雛形のオブジェクトは忘れずに削除しておきます。
 

3.【Blender】BlendShape複製済のFBXモデル出力

 
 
BlenderでFBXを直接VRM出力するのに成功していないため(回転やスケールがおかしくなる…)VRM化の処理はUnity上で行います。
 
いったんFBXに出力します 
※エクスポートの際、BlendShapeの選択状態に注意
 (Basis以外のShapeKeysが選択されていると、その表情がデフォルトになってしまいます)
 
アドオン【Unity_tools 2.80 and newer.zip】
Unityにインポートしたときのアニメーション挙動が正しくなるよう回転を加えるアドオン
詳しくはこちら
ルートのTramsformでXが -90°になります。FBXエクスポートf:id:hinzka:20200819051125p:plainf:id:hinzka:20200819051459p:plain
以下の設定で出力
・エクスポート対象:Armature, Mesh
・Apply Scalings:FBX All
・!EXPERIMENTAL! Apply Transform:チェックあり
 f:id:hinzka:20200819053101p:plain
カスタマイズしたエクスポート設定は「Operator Presets」に保存しておくと便利です

4.【Unity】顔転送用のVRMモデル出力

4-1. FBX読み込み、マテリアル調整、VRM出力

 上記のFBXモデルをUnityにインポートします。(Assetフォルダの任意の場所にFBXをドラッグ&ドロップ)
 BlendShapeNormalをImportに、リグをHumanoidにそれぞれ設定します。
顔のマテリアルを、一番最初にインポートした元VRMのものに差し替えます。

f:id:hinzka:20200819060121p:plain

・Calculateのままだと表情が動いたとき影が不自然になることがあります

f:id:hinzka:20200819060158p:plain

VRM出力するためにはRigがHumanoidである必要があります

マテリアルスロットに、元VRMのマテリアルをドラッグ&ドロップします。
(同一プロジェクトにあるファイルでないとドラッグ&ドロップできないので注意 前章でFBX化したときと同じプロジェクトで作業すると効率よいです)

f:id:hinzka:20200819062413p:plain

f:id:hinzka:20200819062603p:plain

Unityのシーンに配置します(例ではマテリアルをすべて設定しています)。

顔以外の体や髪については不正な表示になることがありますが、ここでは気にしなくて大丈夫です。
この状態でVRM出力します。これがモデルのあたらしい顔になります。

f:id:hinzka:20200819062223p:plain

※いったんFBXを経由してVRM化したモデルには、元のマテリアルや揺れ物の設定がなくなっています。このため、元のVRMモデルに「顔だけ」コピーします。衣装替えモデルに顔を差し替える場合も同様の手順となります。

 

4-2. iFacialMocapでの動作確認

クリックで展開
 Unity上で顔の動作確認することができます。

 

5.【Blender】顔オブジェクトを、元VRMモデルの顔と差し替え

5-1. 顔の差し替え

 Blender上で元のVRMと3で作成したVRMの二つを読み込み、前者の顔だけを後者に差し替えます。
以下のアドオンをインストールします。

github.com

インポートの項目にVRMが追加されます。

先に、元々のVRM(BlendShapeをコピーしていない方)を読み込みます。

f:id:hinzka:20200819131556p:plain

VRMの設定どおりマテリアル設定も含めて正しく読み込まれます。
見やすくするため、collidersとsleletonをいったん非表示にします。

f:id:hinzka:20200819132609p:plain

さらに、Unityから出力したVRM(BlendShape52種を追加したモデル)を読み込みます。こちらもcollidersとsleletonをいったん非表示にします。

同じ位置に表示されるため一体に見えますが、2体読み込まれた状態です。

f:id:hinzka:20200819132910p:plain

Sceneのディレクトリ表示上で、

BlendShape入りのFaceオブジェクト(Face.baked.001)を、元モデルのものと同一の階層にドラッグして移動します。顔以外の残りの項目は不要なので削除します。

元モデルのFaceオブジェクト(Face.baked)も削除します。

BlendShape入りのFaceオブジェクトを、元の文字列(Face.baked)にリネームします。

f:id:hinzka:20200819133819g:plain

f:id:hinzka:20200819135653p:plain

FaceオブジェクトのShapeKeysを選択し、正しく動くことを確認します。

 

5-2. iFacialMocapでの動作確認

クリックで展開
Blender上で顔の動作確認することができます。 
 
詳しくはiFacialMocapの解説を参照 

f:id:hinzka:20200830110513p:plain

 
 
頭の位置について :
 同じモデル同士であれば顔も全く同じ位置にくるため位置調整は不要です。衣装替えモデルで靴の種類が異なる場合は高さのみ合わせる必要があります。
顔オブジェクトの位置を編集モードの”Basis”キー上で調整します(オブジェクトモードではないことに注意)。Basisでの位置・形状は他のすべてのシェイプキーに反映されます。
 

5-3. VRM出力

顔差し替え済みのモデルを改めてVRMに出力します。
・非表示にしてあった項目を再度表示します。
・3Dビュー上で「A」キーを押下し、すべてのオブジェクトを選択します。
この状態でVRMのエクスポートを実行します。

f:id:hinzka:20200819140140p:plain

※エクスポートの際、BlendShapeの選択状態に注意
 (Basis以外のShapeKeysが選択されていると、その表情がデフォルトになってしまいます)
 
最終調整は次エントリにてUnity上で行います。