お久しスコリカ…黒城ナディアです…
最後の更新からお時間が空いてしまいましたが、Blender記事制作を再開したいと思います!
本記事ではVRMファイルでUVスクロールを実現する方法と、それを応用してシェイプキーからUV座標をコントロールする方法について紹介します。
VRMに関する情報は検索エンジンからたどり着くのが難しかったりしますよね…
キーワードとして以下の言葉を検索するとほしい情報が見つかる可能性が高いです。
- VRM + UVスクロール
- _MainTex_ST
はじめに
ローポリキャラクター、特に顔に割く数頂点がほんの少しだけの3Dモデルにおいて、表情を切り替えるには主に以下の方法が考えられると思います。
- いわゆるお面を付け替える方法
- UVスクロールで表情を切り替える方法
VRMフォーマットではどちらの方法も(一応)対応しているので、紹介します。
①の方法は複数の顔メッシュを用意して、シェイプキーで表示したい表情を切り替えます。
おそらく一般的に用いられている方法で、実装方法も分かりやすいため本記事では割愛させていただきます。
今回は②の方法についてご紹介します。
特にUVスクロールによる表情切り替えの情報はあまり見つからず、UniVRMフォーラムのディスカッションに乗ってるくらい?でした
■検証に使ったUnityとUniVRMのバージョン
- Unity:Unity 2022.3.6f1
- UniVRM:0.128.3_b045 – VRM 0.x
3Dモデルの準備
このようなUVとテクスチャをもつローポリモデルを用意しました(ロボットパ〇タ!?)

頭部のテクスチャ(1024×1024)を縦横4分割し、それぞれに喜怒哀楽などの表情テクスチャを割り当てています。
BlenderからFBXファイルを出力し、Unityで作業を行います。
UnityのVRMモデル作成にて、一般的なVRMモデル作成の手順に従い1回目のインポート設定を実施して、正規化されたVRMモデルのインポートを実行した直後から説明します。

_MainTex_STを使ったUVスクロールによるシェイプキー制御
正規化後再インポートされたVRMモデルのプレファブを選択し、インスペクターから[BlendShapeProxy]コンポーネントの[BlendShape (Blend Shape Avatar)]を選択します。

「BlendShape (Blend Shape Avatar)」メニューにて、[Select BlendShapeClip]欄から編集したいBlendShapeの表情を選択します。

欄の下部にある[BlendShape/BlendShape List/Material List]のパネル選択ボタンがあります。
3種類のパネルではそれぞれBlendShapeの編集対象が異なります。
今回はこの中から[Material List]のパネルを選択します。

Serialized Property欄が表示されます。
欄内は「List is Empty」となっているのでリスト右下の[+]ボタンを選択し、BlendShapeの編集項目を追加します。
変更対象のメッシュおよび編集項目は複数追加することができます。

ドロップダウンリストは2段構成になっていて、1段目ではBlend Shapeに適用したいメッシュを選択します。

2段目のドロップダウンリストが表示されるので、[_MainTex_ST]を選択します。

表情切り替えしたいマテリアル・テクスチャを選択
_MainTex_STの項目について、[Tiling]のx、yの値を「1」に、[Offset]のx座標、y座標は値を切り替えたい表情の座標に対して0~1の割合の値をセットします。
UV座標におけるx, y座標の原点はテクスチャ画像左下を基準としています。
そのため、今回のように表情のUVマップが左上に存在する場合に、上から2行目の表情を指定するには、「-0.25」または「0.75」を指定します。
_MainTex_ST はUnityの内部変数で、UVのタイリング情報の制御に使用されるもののようです。
3Dモデルのプラットフォームの実装によりますが、VRM規格以外でも対応できる可能性があります。
最期に「Is Binary」を設定します。
この項目は☑(オン)の場合、BlendShapeの中間状態を出さないように切り替えることができます。
オフになっていると表情の切り替え時がスクロールするように変化するため、基本的に☑(チェック)をいれてください。

以上の設定をVRM BlendShapeで設定したい表情すべてに割り当て、最終的にVRMモデルをエクスポートしてください。
完成品はこちら!
パ〇タくんをVRoid Hubアップロードしてみました!
VRoid HubはMaterial List/_MainTex_ST によるBlendShape表情切り替えに対応しているようですね。

※ファンメイドモデルかつ教育的な目的で作ってはいますが、本記事含めて指摘されてしまった場合は別のモデルに差し替える可能性があります。
VRMフォーマットとMaterial Listについて
Material Listで選択できる項目には[_MainTex_ST]以外にも[Color], [EmissionColor]などがあり、特定の表情の時に顔の色を変えるようなことができるみたいです。
VRMフォーマットはリッチなプラットフォームと比較してできないこともありますが、やりようによっては以下のようなことも実現することができます。
- 驚いた表情の時にUVマップ切り替えと色替えにより青ざめる😱
- テクスチャの透明度(アルファ値)を切り替えることにより、疑似的にメッシュのON/OFFを行う
注意事項
- VRMの実装、つまりソフトウェアによって使えない場合があります
- 具体的には、Material Listおよび_MainTex_ST機能のサポート有無がソフトウェア実装に委ねられ、対応していないソフトウェアではシェイプキーがうまく動作しない場合があります
- 本記事ではVRM規格0.xにて、対応しているプラットフォームにて確認を行いました
VRM 1.0では動作確認を行っていませんのでご了承ください
参考


UVスクロールの視線制御も似たような原理でできる🤔
キーワードはVRMLookAtBlendShapeApplyer、調査継続…
- VRMの実装、つまりソフトウェアによって使えない場合があります
- 具体的には、VRMLookAtBlendShapeApplyer機能のサポート有無がソフトウェア実装に委ねられ、対応していないソフトウェアではシェイプキーがうまく動作しない場合があります
- ※視線制御に使うVRMLookAtHead + VRMLookAtBoneApplyer または VRMLookAtBlendShapeApplyer
コメント