はいぬっかメモ

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

パーフェクトシンクであそぼう!

f:id:hinzka:20200826210703p:plain

<概要>

iPhoneのデプスカメラを使ったフェイスキャプチャーで、モデルの顔がリアルタイムにいっぱい動く
このしくみに対応したアプリでVRMモデルを動かしてあそんでみよう
 

1.パーフェクトシンクとは

iOSのARKitで取得できるBlendShapeLocation全52点を、VRMの同名BlendShapeClipに適用させる実装です。(noppeさん命名
アニ文字のように、豊かで自然な表情アニメーションを実現します。

f:id:hinzka:20200815094421g:plain

アニ文字(iPhoneアバター機能)

 

FaceID対応端末でのみ動作します。※iOS14以降で対応端末が追加されました。

対応機種

iPhone
iPhone 11 Pro Max
iPhone 11 Pro
iPhone 11
iPhone XS Max
iPhone XS
iPhone XR
iPhone X

iPhonrSE(2020)※iOS14 以降

iPad
iPad Pro 12.9 インチ (第 4 世代)
iPad Pro 12.9 インチ (第 3 世代)
iPad Pro 11 インチ (第 2 世代)
iPad Pro 11 インチ

A12 Bionicチップ搭載のiPad ※iOS14以降

 

2.パーフェクトシンク対応モデル

2-1.要件

1)ARKitで定義された52個のBlendShapeを全部または一部備えていること
 全部そろっていなくてもOK

f:id:hinzka:20200816105223p:plain

各シェイプキーはBlender等の3Dモデリングツールで作成する必要があります。

形状について別エントリにてまとめています。

hinzka.hatenablog.com

 
2)上記に対応するVRMBlendShapeClipを備えていること
 VRMのしくみで動作させるため、シェイプキーを同名のClipに登録します。
Clipの命名ルールはUnityのEnum ARKitBlendShapeLocationに準じています(Clip名が異なると動作しません)。
 Clipに登録されたBlendShape名称の文字列が共通であれば、コピーツールを利用してClipを既存のモデルからコピーすることができます。手順はこちら 
 

2-2.サンプルモデル

VRoidのデフォルトキャラクターを改変し、パーフェクトシンクに対応させたVRMモデルです。自由に利用できるサンプルとしてVRoid hubにて配布しています。

ハート♡をつけておくと、VRoid hub連携によりvear上ですぐに動かすことができます。

2-3.VRoid雛形からのBlendShapeコピー 

VRoidは、BlendShapeを持つFaceオブジェクトの頂点構成が共通のため、一定の条件下でBlendShapeを丸ごとコピーすることができます。

f:id:hinzka:20200821070645p:plain

f:id:hinzka:20200815144711p:plain

 
Unityアセット『HANA Tool』を使うと簡単に導入ができます。
 
以下はツールがない頃の、UnityとBlenderを使った手順です(いまとなっては全くおすすめしません)

VRoidでかんたん!パーフェクトシンク(2/3) 

VRoidでかんたん!パーフェクトシンク(3/3)

 

作成した顔を差し替えることで、衣装違いモデルにも簡単に対応できます。

 

 

3.パーフェクトシンク対応アプリ

VRMのしくみで動くアプリのリストです(現状4つ)

対応アプリ増えてくれると嬉しいです どうぞよろしくよろしくおねがいします!

3-1.iOS単体アプリ

VRoid hubで配布中のサンプルモデル(前述)に♡をつけておくと、VRoid hub連携ですぐに利用できます。

 vear

vear - バーチャルライブ配信アプリ

vear - バーチャルライブ配信アプリ

  • Tomoya Hirano
  • ユーティリティ
  • 無料

apps.apple.com

 ※プレミアムモード機能

 

 Emosign

Emosign

Emosign

  • akihiro ueyama
  • エンターテインメント
  • 無料

apps.apple.com

 

 

 waidayo

github.com

 

3-2.PC併用アプリ

 VMagicMirror

malaybaku.github.io

iFacialMocapiOSアプリ)と連携した外部トラッキング機能(Ex.Tracker機能)

iFacialMocap on the App Store

 

 waidayo

github.com

waidayoのPC用ビューワ Oredayo

Home · gpsnmeajp/Oredayo4V Wiki · GitHub

waidayoと連携で全身モーキャプ バーチャルモーションキャプチャー(ばもきゃ)

VirtualMotionCapture | バーチャルモーションキャプチャー

 

クリックで実装!パーフェクトシンク BY HANA Tool

f:id:hinzka:20201012214535p:plain



概要

 
niku:kuniyanさん  によるUnityアセット『HANA Tool』は、共通のメッシュを持つ任意のオブジェクト間でBlendShapeを転送するツールです。
VRoid向けのパーフェクトシンク用データセットが同梱されています。
 
Unity上でVRoidモデルのFaceオブジェクトを指定し、コピーボタンをクリックするだけで、パーフェクトシンクに対応したBlendShape52個+αがコピーされます。
 
(流れを示す図をいれます)
 
 
パーフェクトシンクについての説明はこちら
 

1. VRMモデル出力(VRoidStudio V0.11.2)

パーフェクトシンク対応させたいモデルファイルを用意します。
VRoidStudio V0.11.2(2020年10月現在の最新版)から直接出力したVRMである必要があります
 
一つ前のバージョン(V0.11.1)でもNGですのでご注意ください
コピー後にBlendShapeを動かしたときメッシュが崩れます
 
また、VRMエクスポートの際、「透明メッシュを削除する」を選択しないようにしてください。

f:id:hinzka:20201011235323p:plain

髪の毛メッシュのポリゴン削減、マテリアルの削減については選択しても問題ありません。

 

 

 

2. BlendShapeのコピー(Unity)

2-1. 準備

端末にUnityをインストールしておきます。
推奨バージョン Unity-2019.4 LTS(UniVRM v0.61.1リリースノートより)
 
UniVRM(最新版はv0.61.1)をインポートします。
 
VRMをインポートします。
プロジェクト上にVRMファイルをドラッグ&ドロップするだけで自動的にファイルやフォルダが展開されます。
(Assetsフォルダの下に別途フォルダを作成しておき、その中にドラッグ&ドロップすると散らからないのでおすすめです)
 
HANA Toolをインポートします。
VRM向けとそれ以外とで2種類のアセットが同梱されています。
VRM向けのアセットには、Clipのコピーツール(AddBlendShapeClip)が含まれています。
 f:id:hinzka:20201012225202p:plain
VRoidモデルではHANA_Tool_v2_9_1_VRM.unitypackageを使います。
 
 

2-2. HANA Tool Reader

Scene上にVRMモデルを置きます。

f:id:hinzka:20201012002835p:plain


 
HANA ToolのメニューからReaderウインドウを開きます。

f:id:hinzka:20201012002151p:plain

 

f:id:hinzka:20201012003148p:plain
顔オブジェクトをReaderウインドウにセットします。

(このときウインドウ最下部の「ReadBlendShapes」ボタンがアクティブになります)

ラジオボタンでモデルの性別を選択します。

f:id:hinzka:20201012021406p:plain

画面下部にモードの選択項目があります。ExchangeではなくAddを選択しておきます。

※同梱のデータセットには追加用のBlendShapeしか入っていないため、Exchangeを選択すると標準のBlendShapeが消えてしまいます。

 

①コピー元データの性別がVRMと同じであること、
②Addが選択されている(グレー表示になっている)こと
を確認し、
Read BlendShapesボタンをクリックします。
 
コピーは一瞬で完了します。

f:id:hinzka:20201012003804p:plain

Faceオブジェクトを選択し、Inspectorを見ると、標準のBlendShapeの下にBlendShapeが追加されていることが確認できます。

f:id:hinzka:20201012004330p:plain
 
この段階ではBlendShapeClipが未登録のため、パーフェクトシンク対応アプリでは認識できません。Clipの登録作業が必要です。
 
BlendShapeClipとは
 

3. BlendShapeClipのコピー(Unity)

3-1. HANA Tool AddBlendShapeClip

HANA ToolのAddBlendShapeClip機能で対応のClipを登録します。

手元のVRoidモデルに、初めてパーフェクトシンク対応させた場合におすすめです。

f:id:hinzka:20201012011119p:plain

f:id:hinzka:20201012012500p:plain

Add BlendShapeClipボタンをクリックするとClipの設定が完了します。

f:id:hinzka:20201012012519p:plain

各Clipの設定値は、データセットを作成した元モデル(千駄ヶ谷渋、HairSampleMale)に対応した値となっています。

コピー先の個々のモデルで最適な数値に調整する必要があります。

 

3-2. CopyVRMSettings

 
既存のパーフェクトシンク対応VRMから、BlendShapeClipとその設定値をコピーします。
すでに手元のモデルでパーフェクトシンクのClip調整が済んでいて、「同じ設定の表情を、衣装違いモデルにコピーしたい」などの場合におすすめです。
 
※コピーには、コピー元とコピー先のVRM同士でBlendShapeの文字列が共通である必要があります。
 
※このケースでは、HANA ToolでモデルにBlendShapeを追加したあと、InspectorからOverridesを実行する必要があります。

f:id:hinzka:20201012072839p:plain

Clipのコピーには100の人さん のCopyVRMSettingsアセットが便利です。
 
使い方は下記の記述を参照してください。

hinzka.hatenablog.com

 

4. BlendShapeClipの調整(Unity)

(調整のコツなど後日追記します)

 

*口をぎゅっと閉じたときの形について

MouthRollUpper、MouthRollLowerはかなり極端な形をしています。
これはJawOpenと組み合わせてうごく表情です。一度そのままで試してみてください。
これが弱いと まみむめも の口がはっきり動作しません。
(閉じた口をもぐもぐしたとき口があいてしまいます)

口をぎゅっと閉じたときに唇が顔を貫通してしまう場合は適宜弱めてください。

 

*瞳の貫通のなおしかた

FaceオブジェクトのInspectorにBlendShapeの項目があり、
irisMoveBackで瞳を奥に移動できます

この状態で『Pose Freeze』を有効にしてエクスポートすると、その表情がVRMの初期状態になります

 以下参照

vrm.dev

 

調整が終わったらUniVRMメニューからモデルを出力して完成です。

 

 

 

HANA Toolv2_9_1に同梱されているデータセット(BlendShapeおよびClip設定)と同一のVRMを以下で配布しています。
 

パーフェクトシンクの顔をお着換えモデルに移植しよう

f:id:hinzka:20200816212032p:plain

<概要>

パーフェクトシンク対応(BlendShape追加済)のVRMモデルの顔を、同一キャラクターの衣装違いモデルに移植します。

VRoidを例にしていますが、他のモデルでも同様の手順でできる可能性があります。

 

 

1.VRoidのオブジェクト構成

f:id:hinzka:20200817000618p:plain

髪や体の揺れもの設定を維持したまま、Faceのみを差し替えます。

 

 2.Blender

2-1.VRMインポート

VRM Importerアドオンを使用します。

github.com

2体のVRMを同一シーン上にインポートします。

モデルが完全に重なって表示されます。そのままで作業をすすめます。

f:id:hinzka:20200817000738p:plain

 

2-2.Faceオブジェクト差し替え

FaceオブジェクトはHeadボーンに100%追従するため、差し替えは簡単です。

オブジェクト名と格納ディレクトリに気をつけてください。

Faceオブジェクトの文字列が本来のものと異なるとエクスポートに失敗します。

f:id:hinzka:20200817000752p:plain

 

2-3. Faceオブジェクト位置調整、VRMエクスポート

靴の厚みが異なると身長が変わってしまうので頭の位置がずれます。必要に応じて位置調整します。

その場合も、BlenderのZ方向(高さ)以外は調整不要のはずです。

f:id:hinzka:20200817000804p:plain

 

3.Unity

BlenderからVRMエクスポートすると、なぜかアウトラインが非表示になってしまいます。

Unityでマテリアル編集を行い最終調整します。

UniVRMをUnityにインポートしておきます。

github.com

f:id:hinzka:20200819120640p:plain

最終VRMをエクスポートして完了です。

 


4.Face.bakedのリネーム

Faceオブジェクトがリネームされた影響として、VRoid Mobileで表情が動作しなくなります。

"Face.baked" を "Face"に戻すことで動作するようになります。

 

Blenderを使ってリネームができます。

オブジェクト名から”.baked”を除去 + スクリプトから”.baked”を除去

なお、オブジェクト名とスクリプトの記述が一致していないとエクスポートに失敗します。

(むずかしいとおもったらやめておきましょう)

HANA Tool V2アセットのReaderでは、指定したオブジェクトを"Face”にリネームする機能があります。

kuniyan.booth.pm

パーフェクトシンクであそぼう!

f:id:hinzka:20200826210703p:plain

<概要>

iPhoneのデプスカメラを使ったフェイスキャプチャーで、モデルの顔がリアルタイムにいっぱい動く
このしくみに対応したアプリでVRMモデルを動かしてあそんでみよう
 

1.パーフェクトシンクとは

iOSのARKitで取得できるBlendShapeLocation全52点を、VRMの同名BlendShapeClipに適用させる実装です。(noppeさん命名
アニ文字のように、豊かで自然な表情アニメーションを実現します。

f:id:hinzka:20200815094421g:plain

アニ文字(iPhoneアバター機能)

 

FaceID対応端末でのみ動作します。※iOS14以降で対応端末が追加されました。

対応機種

iPhone
iPhone 11 Pro Max
iPhone 11 Pro
iPhone 11
iPhone XS Max
iPhone XS
iPhone XR
iPhone X

iPhonrSE(2020)※iOS14 以降

iPad
iPad Pro 12.9 インチ (第 4 世代)
iPad Pro 12.9 インチ (第 3 世代)
iPad Pro 11 インチ (第 2 世代)
iPad Pro 11 インチ

A12 Bionicチップ搭載のiPad ※iOS14以降

 

2.パーフェクトシンク対応モデル

2-1.要件

1)ARKitで定義された52個のBlendShapeを全部または一部備えていること
 全部そろっていなくてもOK

f:id:hinzka:20200816105223p:plain

各シェイプキーはBlender等の3Dモデリングツールで作成する必要があります。

形状について別エントリにてまとめています。

hinzka.hatenablog.com

 
2)上記に対応するVRMBlendShapeClipを備えていること
 VRMのしくみで動作させるため、シェイプキーを同名のClipに登録します。
Clipの命名ルールはUnityのEnum ARKitBlendShapeLocationに準じています(Clip名が異なると動作しません)。
 Clipに登録されたBlendShape名称の文字列が共通であれば、コピーツールを利用してClipを既存のモデルからコピーすることができます。手順はこちら 
 

2-2.サンプルモデル

VRoidのデフォルトキャラクターを改変し、パーフェクトシンクに対応させたVRMモデルです。自由に利用できるサンプルとしてVRoid hubにて配布しています。

ハート♡をつけておくと、VRoid hub連携によりvear上ですぐに動かすことができます。

2-3.VRoid雛形からのBlendShapeコピー 

VRoidは、BlendShapeを持つFaceオブジェクトの頂点構成が共通のため、一定の条件下でBlendShapeを丸ごとコピーすることができます。

f:id:hinzka:20200821070645p:plain

f:id:hinzka:20200815144711p:plain

 
Unityアセット『HANA Tool』を使うと簡単に導入ができます。
 
以下はツールがない頃の、UnityとBlenderを使った手順です(いまとなっては全くおすすめしません)

VRoidでかんたん!パーフェクトシンク(2/3) 

VRoidでかんたん!パーフェクトシンク(3/3)

 

作成した顔を差し替えることで、衣装違いモデルにも簡単に対応できます。

 

 

3.パーフェクトシンク対応アプリ

VRMのしくみで動くアプリのリストです(現状4つ)

対応アプリ増えてくれると嬉しいです どうぞよろしくよろしくおねがいします!

3-1.iOS単体アプリ

VRoid hubで配布中のサンプルモデル(前述)に♡をつけておくと、VRoid hub連携ですぐに利用できます。

 vear

vear - バーチャルライブ配信アプリ

vear - バーチャルライブ配信アプリ

  • Tomoya Hirano
  • ユーティリティ
  • 無料

apps.apple.com

 ※プレミアムモード機能

 

 Emosign

Emosign

Emosign

  • akihiro ueyama
  • エンターテインメント
  • 無料

apps.apple.com

 

 

 waidayo

github.com

 

3-2.PC併用アプリ

 VMagicMirror

malaybaku.github.io

iFacialMocapiOSアプリ)と連携した外部トラッキング機能(Ex.Tracker機能)

iFacialMocap on the App Store

 

 waidayo

github.com

waidayoのPC用ビューワ Oredayo

Home · gpsnmeajp/Oredayo4V Wiki · GitHub

waidayoと連携で全身モーキャプ バーチャルモーションキャプチャー(ばもきゃ)

VirtualMotionCapture | バーチャルモーションキャプチャー

 

VRoidでかんたん!パーフェクトシンク(3/3)BlendShape Clip追加

f:id:hinzka:20200821073625p:plain

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

<概要>Unity上でBlendShapeClipを一括コピーします。
Clipの表情を作りこみ、最終的なVRMに仕上げます。
 
 

f:id:hinzka:20200821230024p:plain


 

本解説で使用しているUnity・Blenderのバージョンは以下の通りです。

Unity:2019.4.0f1

Blender:v2.83.2

 

1.【Unity】BlendShapeClip追加

 
BlendShapeClipとは、VRMで定義されているBlendShapeのプリセットです。
モデル自身の持つBlendShapeを組み合わせて新たな表情を作ることができます。
詳しくはUniVRMのドキュメントを参照してください。

vrm.dev

 
 

BlendShapeClipの設定は、こちらで「iPhone用BlendShapeあり」となっているモデルすべて共通です。男女の区別はありません。

BlendShape文字列が共通であればVRoid以外のモデルに対してもClipのコピーが可能です。

hub.vroid.com

上記からダウンロードできるVRMファイル(前章で使用したBlenderファイルとは別のもの)から、BlendShapeClipとその設定値をコピーします。

BlendShape52点に対応したClip、およびwaidayo(https://github.com/nmchan/waidayo/wiki)に対応したClipが入っています。

f:id:hinzka:20200820211953p:plain

※BlendShape52点のClip名は下記に準じたものです

UnityEngine.XR.ARKit.ARKitBlendShapeLocation

 
前回作成したVRMと、上記の雛形VRMの両方をUnityにインポートします。

f:id:hinzka:20200820055351p:plain

モデルのInspectorの VRM Blend Shape Proxy にある Blend Shape Avatar をダブルクリックします。
または、モデル名+.BlendShapesフォルダにあるBlendShapeファイルを選択します。

f:id:hinzka:20200820060241p:plain

BlendShapeClipの一覧が表示されます。

VRoidには、デフォルトで18個のBlendShapeClipが存在します。

雛形モデルではさらに56個のBlendShapeClipを追加して全74個としています。

 また、Clipの形状を構成するBlendShapeを下部で確認できます。 

 

VRM設定複製ツールをインストールします。
インストールするとVRMのメニューに追加されます。
多機能なツールですが今回は「BlendShapeClipのみ」をコピーします。

f:id:hinzka:20200820060452p:plain

f:id:hinzka:20200820060509p:plain

Source Avatar に雛形のモデル(ここでは千駄ヶ谷渋モデル)、
Destination Avatar にコピー先のモデルをドラッグ&ドロップで登録します。
Vrm Blend Shape以外のチェックをはずしてコピー&ペースト実行します。

f:id:hinzka:20200820061347p:plain

コピー完了するとこのようになります。
 (コピー後のBlendShapeClip名には BlendShape. が自動で付加されるようです)
 

2.【Unity】BlendShapeClip調整

口の開きなどを調整して顔を仕上げます。
 
目の形状には個体差が大きく、雛形のシェイプキーをコピーしたBlendShapeでは正しく目を閉じないことがあります。
雛形のBlendShapeClipでは、まばたき・笑い目は(BlendShapeのコピー元ではなく)モデル本来のシェイプを参照するようにしています。
 
【eyeSquintLeft / eyeSquintRight】
笑いながらまばたきすると目が埋まるなどの場合は、eyeSquintのパラメータを弱めてみてください。
BlendShape名 " Fcl_EYE_Joy_L "
BlendShape名 " Fcl_EYE_Joy_R "

f:id:hinzka:20200820195841g:plain

 

【 jawOpen】

BlendShape名 " jawOpen " には、「あ」のモーフ100%が格納されています。

BlendShape名 " Fcl_MTH_A " のパラメータを追加すると、口をさらに大きく開くことができます。

f:id:hinzka:20200820200347g:plain

 

【mouthRollLower】
唇を噛む(口を引き結ぶ)と口が埋まって消えてしまう場合があります。
BlendShape名 " mouthRollLower " を弱めると口が埋まりにくくなります。
 f:id:hinzka:20200820201234g:plain
 

3.【Unity】マテリアル修正

Blenderを経由するとアウトラインが消えていたりするので修正します。
シーン上にモデルを配置し、Body, Hair, Faceの各オブジェクトのマテリアル設定を確認します。

f:id:hinzka:20200820205240p:plain

元々アウトラインが設定されていたマテリアルでは、アウトライン設定がWorldCoordinates の状態ですが、なぜかそのままでは線が表示されません。
いったん None を選択し、再度 WorldCoordinates に戻すとアウトラインが表示されます。

f:id:hinzka:20200820210209g:plain

アウトラインを表示させたいマテリアルについて、この再選択をしておきます。
 

4.【Unity】VRM出力

Hierarchy上でモデルを選択した状態でVRMエクスポートします。
こちらが最終ファイルになります。おつかれさまでした!
 
 
なお、VRMのBlendShapeClipを使ってiPhoneのフェイストラッキング(52点)をカバーするアプリは現状3つしかありません。
対応モデルが増えるとアプリも増えるかもしれないと期待しています。たのむー
 
 
 

5.VSCode

VRM IMPORTERアドオンにより、Faceオブジェクトがリネームされた影響として、VRoid Mobileで表情が動作しなくなります。


VSCodeを使うとオブジェクト名の編集ができます。

nodes以下のオブジェクト定義で ”Face.baked” を ”Face” に修正すると、VRoid Mobile上で表情が動くようになります(2箇所)。

 

qiita.com

 

 お着換えモデルへの顔移植を別エントリで解説しています。

hinzka.hatenablog.com

 
 
 
 

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上で行います。

VRoidでかんたん!パーフェクトシンク(1/3)VRoidモデルのFBXエクスポート

f:id:hinzka:20200821073149p:plain


 iPhoneフェイストラッキング向けBlendShape追加 VRoid編
<概要>
雛形モデルからターゲットモデルへ、Blender上でBlendShapeを複製するための条件を整える
 
 
ゴゴちゃんによるBlendShape転送の検証結果

 

BlenderVRM IMPORTERアドオンで直接VRMを読み込む
        → メッシュの状態が変わってしまう。シェイプキーのコピー失敗
・中間ファイルとしてGLTF(.glb)を経由
        → メッシュの状態が変わってしまう。シェイプキーのコピー失敗
・中間ファイルとしてFBXを経由
        → メッシュの状態は変更されない。シェイプキーのコピー成功
 
上記のリサーチ結果に基づき、メッシュ頂点の状態を維持したままBlenderにインポートするため、中間ファイルとしてFBXを採用しました。エクスポートにはUnityのFBX Exporterを使用します。
 

f:id:hinzka:20200821225841p:plain

 

1.【Unity】VRMモデルをFBXにエクスポート

1-1.準備

VRMファイル
VRoid Studioの対応バージョンから直接出力されたVRMである必要があります。
 マテリアルやメッシュの削減は行わず、デフォルトの状態で出力してください。
 
<注>

2020年9月10日に、最新版のVRoid Studio v0.11.2がリリースされています。
男性VRoidのトポロジーが統一されました。また、女性VRoidのトポロジーにも変更が入っているようです。

このため、最新版のVRopidStudioで出力したVRMに対して、いまの雛形からBlendShapeコピーするとモーフが壊れてしまいます

対応の雛形を準備中です。現状では、最新版ではなく、一つ前のVRoidStudio v0.11.1等で出力してください。
 
 
■UniVRM
以下から最新版をDLしインストールしておきます。
 
 
VRMモデルをプロジェクトにドラッグ&ドロップすると読み込まれます。
今回は、BlendShapeのコピー先モデルとしてViviを使用します。
 
 
■FBX Exporter
Unity公式で提供されているFBX Exporterを使います。
最新版はPackage Managerからインストールします。
(アセットストアにあるFBX Exporterはバージョンが古く、正しくエクスポートできません)

f:id:hinzka:20200727055019p:plain f:id:hinzka:20200716092645p:plain

f:id:hinzka:20200716092727p:plain

1-2.FBXエクスポート

VRMモデルをプロジェクトに読み込み、Scene上に配置します。

Hierarchy ウィンドウでモデルを右クリックし、FBXエクスポートを行います。

f:id:hinzka:20200727055339p:plain f:id:hinzka:20200716101303p:plain

BlenderはASCII形式のFBXファイルをサポートしてないため、Binaryを選ぶ必要があります。

Exportを実行すると、Destinationで指定したディレクトリにFBXファイルが作成されます。デフォルトではプロジェクトのAssetフォルダ直下です。

 

2.【Blender】FBXモデルのインポートとマテリアル調整

2-1.FBXインポート

[ファイル]→[インポート]→[FBX(.fbx)] でFBXモデルをインポートします。

f:id:hinzka:20200727053740p:plain

3Dビューの表示設定をマテリアルプレビューモードに切り替えます。ボーンを非表示にします。

f:id:hinzka:20200727053720p:plain

読み込んだ直後はマテリアル設定が正しく行われていません。 

【比較用】アドオン( VRM_IMPORTER )でVRMをインポートした場合

f:id:hinzka:20200727054112p:plainf:id:hinzka:20200727054134p:plain


 

今回の作業ではBlendShapeをツールで自動コピーします。
また、顔以外は、最終的に元のVRMから持ってくるので修正の必要はありません。
このため(見た目はよくないですが)このままで作業を進めることにします。
マテリアルの割り当てはUnityでVRM化する際に行います。
 
ただし、一部マテリアルとメッシュとの対応関係がおかしくなっている部分があります。このメッシュ割り当てだけはここで修正しておきます。
 
Blenderのデフォルトだと、カメラが近づいたとき3D Viewの表示が欠けるのでビューの設定をしておきます。
クリックで展開

f:id:hinzka:20200727053052p:plainf:id:hinzka:20200727053118p:plain

 

2-2.メッシュへのマテリアル再割り当て

編集モードで作業します。

f:id:hinzka:20200727060017p:plain

 Faceオブジェクトで、以下のメッシュに対してマテリアルを再度割り当てます。

1) 耳

 耳のメッシュに「EyeExtra」のマテリアルが当たってしまっています。

メッシュをリンク選択して「Face_00_Skin」のマテリアルを割り当てます。

リンク選択では白目や口内もまとめて選択されてしまうため後で個別に直します(耳だけスマートに選択する方法があったら教えてください)

 リンク選択

f:id:hinzka:20200727061528p:plainf:id:hinzka:20200727061608p:plainf:id:hinzka:20200727062221p:plain

マテリアルの割り当て

f:id:hinzka:20200727062518p:plain

耳のメッシュに顔のマテリアルが適用されます。

 

 

2) EyeExtra

後ろから見ると、><の目のメッシュに「FaceMouth」のマテリアルが当たってしまっています。

メッシュを選択して「EyeExtra」のマテリアルを割り当てます。

f:id:hinzka:20200727063058p:plainf:id:hinzka:20200727063120p:plain

 

3) 白目

※EyeExtraのメッシュが邪魔なのでいったん非表示にしています。

メッシュを非表示にする(クリックで展開)

メッシュを選択した状態で、

[メッシュ] > [表示/隠す] > [選択物を隠す] でメッシュを非表示にできます。

[メッシュ] > [表示/隠す] > [隠したものを表示]で再表示されます。

f:id:hinzka:20200727063651p:plainf:id:hinzka:20200727063711p:plain

 耳のマテリアルを再設定したとき、白目のメッシュに「Face_00_Skin」のマテリアルが当たってしまうのでここで直します。

後ろから見ると、白目のメッシュに「FaceMouth」のマテリアルが当たってしまっています。

メッシュを選択して「EyeWhite」のマテリアルを割り当てます。

 

白目の裏にある交点を選択し、選択の拡大を2回繰り返すと白目を選択できます。

f:id:hinzka:20200727065007p:plain f:id:hinzka:20200727064805p:plain

f:id:hinzka:20200727065225p:plain

「EyeWhite」のマテリアルを割り当てます。

 

4) 口内

耳のマテリアルを再設定したとき、口内のメッシュに「Face_00_Skin」のマテリアルが当たってしまうのでここで直します。

白目と同様、中央の交点を選択し、選択の拡大を4回繰り返して唇の際まで選択します。「FaceMouth」マテリアルを適用します。

f:id:hinzka:20200727070638p:plainf:id:hinzka:20200727070738p:plain

 

 完了した状態 

f:id:hinzka:20200727070131p:plainf:id:hinzka:20200727070151p:plain

 

この状態で一旦Blenderファイルを保存します。

次の手順で、雛形モデルからBlendShapeをコピーします。

 

3.【おまけ】Blenderでマテリアル手動調整

当初は下記の通り丁寧にマテリアルを直していたのですが、よく考えたらここで見た目を綺麗にする必要はとくになかった

何かの役に立つかもしれないのでおまけとして残します。

3-1.マテリアルの透過設定

クリックで展開
オブジェクトモードで作業します。ここでは眉のマテリアルを編集しています。
 
・編集対象のマテリアルを選択し、Shadingタブに切り替えます。

f:id:hinzka:20200717074342p:plain

 マテリアルのノードが表示されます。

f:id:hinzka:20200716220037p:plain

ノードをいったん全部削除し、新規で作成します。
ここを参考に
 

f:id:hinzka:20200717074536p:plain

「追加」から以下の要素をノードエディタに追加して接続します。
  • 画像テクスチャ(Image Texture)
  • テクスチャ座標(Texture Coordinate)
  • 透過BSDF(Transparent BSDF)
  • ディフューズBSDF(Diffuse BSDF)
  • シェーダーミックス(Mix Shader)
  • マテリアル出力(Material Output)

f:id:hinzka:20200830080628p:plain

 画像テクスチャの項目で、対応するテクスチャ画像を割り当てます(ここでは眉)。

 
Layout表示に戻ります。
マテリアルの設定で、ブレンドモードにアルファクリップを設定します。

f:id:hinzka:20200717001505p:plain

3Dビューでテクスチャが透過表示されることを確認します。
 
ノードはコピペができます。複数のマテリアルに同一の設定を行うときはノード画面をコピペするのがよいと思います。画像テクスチャのみ差し替えます。
コピペした場合も、アルファクリップの設定は個別に行う必要があります。
 

3-2.メッシュへのマテリアル割り当て

クリックで展開
編集モードで作業します。ここではシャツに対してマテリアルを割り当てます。
 
シャツのメッシュを選択します。
頂点グループを追加していく方法もありますが、リンク選択が便利です。

f:id:hinzka:20200717080353p:plain

f:id:hinzka:20200717080430p:plain

f:id:hinzka:20200717080450p:plain

メッシュを選択した状態で対象のマテリアルを選択し、「割り当て」をクリックします。
 マテリアルが割り当てられ、メッシュにテクスチャが表示されます。

f:id:hinzka:20200717081224p:plain

 透過が必要な場合は、このマテリアルにも 2-2. のノード設定を行います。
 
マテリアル調整が完了した状態

f:id:hinzka:20200716064641p:plain

※髪や眉・睫毛等は頂点カラー未設定のため白くなっています
 
VRoid編(2/3)
BlendShape複製作業、VRMモデルの顔オブジェクト置き換え
 
VRoid編(3/3)
Unity上でのマテリアル調整、BlendShape Clipの追加、VRM出力
 
 
 

iPhoneトラッキング向けBlendShapeリスト

f:id:hinzka:20200821075712p:plain

 
FaceID対応のBlendShapeリスト(Apple Developer Center)
 
 

Blenderで作成します

基本的にプロポーショナル編集を使用します

一部のBlendShapeは、VRoid標準のBlendShape(赤字)から形状をコピーして作ることができます(頂点メニュー「任意のシェイプキーを選択部に合成」)

 

 対応する文字列の空シェイプキー(52種)を一括で作成できるアドオン

(選択したオブジェクトに必要なシェイプキーがすべて存在するかをチェックし、
存在しなかったシェイプキーを空シェイプキーとして作成)github.com

 

完成した顔オブジェクトからBlendShapeを流用するアドオン

(共通のメッシュを持つ他のモデルに対してBlendShapeを転送)

github.com

 

 

f:id:hinzka:20200615072758p:plain

 

 

 

 

 

 眉関連

brow inner up

 
眉の内側を持ち上げる 眉尻の位置は動かさない
左右の眉頭をすこし離すとリラックス感が出る
 
 

brow down left

brow down right

眉全体を下げる
左右の眉頭を真ん中に寄せる
 

brow outer up left

brow outer up right

眉尻を持ち上げる 眉頭の位置は動かさない
 
 
 

視線関連

なくてもよい
なお、VRoidの眼球は動きが大きいためトラッキング時は弱めて使う(2割くらい)
これらのBlendShapeも同様に弱められることを考慮し、大きめに作っておく必要がある
 
 

eye look up left

eye look up right

例:上まぶたの真ん中をわずかに上に
 

eye look down left

eye look down right

例:下まぶたの真ん中をわずかに下に
 

eye look in left

eye look in right

例:目頭をわずかに内側に
 

eye look out left

eye look out right

例:目じりをわずかに外側に
 
 

まばたき
eye_close_L
eye_close_R
 

eye squint left

eye squint right

笑い目
EYE_Joy_L
EYE_Joy_R
 

eye wide left

eye wide right

びっくり目
EYE_Surprised(左右分割)
 

cheek puff

ほっぺプクー
 

f:id:hinzka:20200615071636p:plain

cheek squint left

cheek squint right

頬を吊り上げる
下まぶたも持ち上がって笑った顔になる チークのテクスチャが上に動く

f:id:hinzka:20200615071651p:plain

nose sneer left

nose sneer right

鼻すんすん VRoidだと動かす鼻がないのでなくてもよい
かわりに舌をコントロールできないか試してみたがほとんど動かせなかった。日本人にはむり
 

jaw open

口を開ける 歯と舌の位置を決める
mouth puckerとともにメインの口のフォルムを形成する
口の開いた状態の歯の形はここで設定する(他のBlendShapeでは動かさないこと)
MTH_Aの舌は丸めて収納されており、TongeOutで舌を出したときに口を開くと舌が曲がってくれる
MTH_A

f:id:hinzka:20200615071002p:plain

jaw forward

jaw left

jaw right

顎を前・左右に動かす
 

mouth funnel

歯を見せて威嚇する形 「い」の口
歯を閉じた形を強調するならここで設定する
MTH_UMTH_Eなど(好みで混ぜる)

f:id:hinzka:20200615071036p:plain


 

mouth pucker

口の横幅を小さくすぼめた形 「う」の口
jaw openとともにメインの口のフォルムを形成する
jaw openから作ると破綻しにくい
 

f:id:hinzka:20200615071058p:plain

mouth left

mouth right

口を左右に動かす 片方の口を持ち上げることができる
 

mouth roll upper

上唇をかぶせる
MTH_A 「任意のシェイプキーを選択部に合成」で、唇の上半分にマイナス値で適用
 

f:id:hinzka:20200615071154p:plain

mouth roll lower

下唇をかぶせる
MTH_A 「任意のシェイプキーを選択部に合成」で、唇の下半分にマイナス値で適用
 

f:id:hinzka:20200615071227p:plain

mouth shrug upper

上唇をめくりあげる
mouth pucker、 mouth shrug lowerと同時に動いてキスの口になる
 

f:id:hinzka:20200615071253p:plain

mouth shrug lower

下唇をめくる
 mouth pucker、 mouth shrug upperと同時に動いてキスの口になる
 
 

mouth close

口を閉じる
下唇を押し上げて閉じる 標準の表情では口が軽く開いているためこれで程よく閉じる
 

mouth smile left

mouth smile right

口角を引き上げる 笑顔
頂点をRotateさせないこと(咥内と繋がる辺が絡まってどうしようもなくなるため)
 

f:id:hinzka:20200615071453p:plain

mouth frown left


mouth frown right

口角を引き下げる への字口
f:id:hinzka:20200615071510p:plain

 

mouth dimple left

mouth dimple right

口角を後ろに引っ張る(横顔で確認)
正面から見た口も広げる
 

mouth upper up left

mouth upper up right

口を上に引き上げる
Appleのリファレンスでは片方の口角だけ上げているが、日本人の口はそんな器用に動かないため、実際には両方の口角を上げることになり、結果として口全体が上がる このため唇の中央もいっしょに動かさないと違和感がある ので真ん中も上げています ガタついていますが動かすと問題ないです
 

f:id:hinzka:20200615071531p:plain

mouth lower down left

mouth lower down right

口を下に引き下げる
Appleのリファレンスでは片方の口角だけ下げているが以下同文
 

f:id:hinzka:20200615071549p:plain

mouth press left

mouth press right

口角を押し上げてつぶす 口元の生々しい動きに寄与する
 

mouth stretch left

mouth stretch right

口角を斜め下に引っぱる
 
 

 

tongue out

舌を出す 根本の位置は変えない
標準状態の舌をまっすぐ伸ばし、閉じた口から見える位置に調整する
(JawOpenで口を開くと舌先が曲がる)