VRChat のアバターを VRM 1.0 形式で変換し出力する Modular Avatar で使われている基盤フレームワークである NDMF に基づくプラグインです。
[!IMPORTANT] NDMF VRM Exporter は Modular Avatar と lilToon の組み合わせが最も効果的になるように設計されています。また VRChat アバターにおけるブレンドシェイプの多さが VRM に変換して利用する時に処理負荷の悪影響を受けやすいので Avatar Optimizer と併用する形での最適化を強く推奨します
NDMF VRM Exporter には以下の特徴を持っています。
まず VRChat Creator Companion または ALCOM を事前にインストールします。その後 レポジトリ追加のリンク をクリックしてレポジトリを導入します。手動で登録する場合は https://hkrn.github.io/vpm.json
を指定します。
レポジトリ導入後は NDMF VRM Exporter
を検索してインストールすることで利用可能になります。
VRC Avatar Descriptor
があるところで Add Component
から VRM Export Description
コンポーネントを検索し設定VRM Export Description
コンポーネント内にある Retrieve Metadata via VRChat API
で自動設定Authors
の左横の ▶️ をクリックして 🔽 にしたのち、➕ ボタンで作者名を設定Assets/NDMF VRM Exporter/${シーン名}
内にアバター名のついた VRM ファイルが出力されていることを確認Untitled
になりますNDMF VRM Exporter は出力した VRM ファイルを閲覧する機能を持っていません。そのため出力された VRM ファイルを手元環境で確認する場合は VRMファイルが使えるアプリケーションは? から「ビューワー」を選択して適宜アプリケーションを導入して読み込んでください。その際は必ず VRM 1.0 対応のものを利用してください(VRM 0.x のみ対応の場合は読み込めません)。
アップロードして確認する場合は VRoid Hub の利用を推奨します。
NDMF VRM Exporter が提供するコンポーネントは VRM Export Description
のひとつのみです。コンポーネントを有効にした状態(コンポーネント名の横にチェックボックス ✅ がついてる状態)で再生すると VRM ファイルが生成される仕組みとなっています。
[!TIP] 処理の性質上 VRM ファイルの生成は最低でも数秒、場合によっては数分と時間がかかるため、AV3 Emulator などを使ってアバターをデバッグする際はコンポーネントを無効にすることを推奨します
VRM のメタデータに直接対応しています。詳細な情報は モデル情報 および VRoid Hubの利用条件とVRMライセンスについて を参照してください。
Metadata のうち Authors と License URL が必須項目となっています。また Author は最初の要素が空文字のみで構成されないように、License URL は URL として正しい形式で設定する必要があります。
メタデータのうち基本情報を設定します。
[!WARNING] アバターのサムネイルが正方形でない場合はサムネイル画像が入りません(VRM の出力自体は可能です)
名前 | 説明 | 必須 | 備考 |
---|---|---|---|
Avatar Thumbnail | アバターのサムネイル画像 | 仕様上 正方形であることが必須で、大きさが 1024x1024 であることを推奨 している | |
Authors | 作者名 | ✅ | 共同制作を想定して複数指定可能 |
Version | アバターのバージョン | 記法として特に定まったものはないが、自動入力では セマンティックバージョニング をベースにした擬似 カレンダーバージョニング を採用している | |
Copyright Information | 著作権表示 | 著作権表示 を想定 | |
Contact Information | 連絡先情報 | 問い合わせ先もしくはそれが容易に確認できる URL が望ましい。なおメールアドレスは個人情報であるとともに悪用リスクがあるので使用は極力避けるべき1 | |
References | 参照元情報 | 例えば Booth で購入した商品を利用しているならその商品 URL の列挙が望ましい |
[!WARNING]
Retrieve Metadata via VRChat API
はアバターをアップロードしないと表示されません。2 使用時に値が設定されていた場合は一部を除いて上書きされるのでご注意ください
Retrieve Metadata via VRChat API
は VRChat SDK 経由で VRChat API を利用してアップロード済みのアバターの情報からメタデータの基本情報を自動的に設定します。実行時に以下の設定を行います。
Avatar Thumbnail
は VRChat のアバターのサムネイルを中央揃えで切り取り 1024x1024 にリサイズして設定
NDMF VRM Exporter/VRChatSDKAvatarThumbnails
にオリジナル版と加工版のふたつが保存されますAuthors
はユーザ名を設定
Version
は {YYYY}.{MM}.{DD}+{version}
形式
{YYYY}.{MM}.{DD}
は VRChat にアバターを更新した日付が入る{version}
は VRChat 側のアバターの現在のバージョンを設定Copyright Information
は Copyright ©️ {最初にアバターをアップロードした年} {ユーザ名}
を設定Contact Information
はユーザ名に対応する VRChat のリンク
Enable VRChat User Link as Contact Information
のチェックを外すと自動入力されなくなります(その場合は上書きもしません)処理の取り消しが可能でその場合は設定されません。また処理の過程でエラーが発生した場合も同様に設定されません。エラーが発生した場合はコンソールに詳細なエラーメッセージが表示されます。ただし VRChat の認証失敗のみボタンの下にメッセージが表示されます。
メタデータのうちアバターに対するライセンス部分を設定します。
[!NOTE] 初期設定として VRM Public License 1.0 が適用されます。独自のライセンスを使用したいケース 3 を除いて設定する必要はありません
名前 | 説明 | 必須 | 備考 |
---|---|---|---|
License URL | ライセンスのURL | ✅ | 初期値は https://vrm.dev/licenses/1.0/ |
ThirdParty Licenses | 第三者のライセンス情報 | ||
Other License URL | その他のライセンスのURL |
メタデータのうちアバターに対する利用許諾の部分を設定します。
[!WARNING] 初期設定として最も厳格な設定になっているため原則として設定を変更する必要はありません。これらの項目をひとつでも変更する場合は想定外のリスクが発生する可能性があります
名前 | 説明 | 必須 |
---|---|---|
Avatar Permission | アバター使用の許諾設定 | |
Commercial Usage | 商用利用の許可設定 | |
Credit Notation | クレジット表記の必須設定 | |
Modification | 改変の許可設定 | |
Allow Redistribution | 再配布の許可設定 | |
Allow Excessively Violent Usage | 過度な暴力表現の許可設定 | |
Allow Excessively Sexual Usage | 過度な性的表現の許可設定 | |
Allow Political or Religious Usage | 政治または宗教用途に対する利用の許可設定 | |
Allow Antisocial or Hate Usage | 反社会もしくはヘイトに対する利用の許可設定 |
VRM の表情設定を行います。
[!IMPORTANT] 表情はブレンドシェイプと機能的によく似ていますが、同一ではありません 4
[!NOTE] まばたきとリップシンクの表情は VRC Avatar Descriptor コンポーネントから情報を取得して自動的に設定されます。また Avatar Optimizer を利用している場合は表情に指定されたブレンドシェイプが最適化対象から外す処理を行う関係で除去されずに残ります
VRM のプリセットである以下の項目を設定することが可能です。
表情設定については以下の二種類が選択可能です。
BlendShape
)
AnimationClip
)
[!TIP] Avatar Optimizer を利用する場合は可能な限りアニメーションクリップよりブレンドシェイプを利用するようにしてください。アニメーションクリップを用いる場合 Avatar Optimizer のブレンドシェイプに対する最適化がしにくくなります 5
表情の組み合わせおよび自動的に設定されることも相まって意図せずメッシュの破綻を起こす可能性があるため、その対策として VRM では表情の制御方法を提供しています。詳しい仕様については プロシージャルのオーバーライド を確認してください。
NDMF VRM Exporter では VRM の仕様と直接対応する形で以下の表情の制御方法を提供しています。設定可能な値は None
/Block
/Blend
の3つで、いずれも初期値は None
です。
Blink
)LookAt
)Mouth
)MMD 互換のブレンドシェイプが存在する場合は Set Preset Expression from MMD Compatible
を利用して設定することが可能です。その場合は以下の表に基づいて設定されます。加えて表情の制御方法が全て Block
に設定されます。
表情名 | 設定先ブレンドシェイプ名 |
---|---|
Happy | 笑い |
Angry | 怒り |
Sad | 困る |
Relaxed | なごみ |
Surprised | びっくり |
プリセット表情の設定を全てリセットする場合は Reset All Preset Expressions
でリセットすることができます。
ユーザ独自の表情を設定します。
[!WARNING] 表情名に非 ASCII 文字を使うと出力時に文字化けする既知の問題があるため ASCII 文字のみを使うようにしてください
[!NOTE] VRM の仕様では
Custom
の表情数に制限はありませんが、VRM アニメーションを使う場合は UniVRM の実装制約 により 100 個の上限があります
複数個指定可能なため追加削除と表情名の指定を行う必要はありますが、基本的な設定方法はプリセット表情と同じです。表情名をプリセット名と同じ名前で定義することも可能ですが仕様上許容されておらず、実装依存ではあるものの原則としてプリセット表情が優先されます。
以下の設定が可能です。lilToon シェーダからの変換時に利用されます。
Enable RimLight
Enable MatCap
Enable Outline
Enable Baking Alpha Mask Texture
[!WARNING] TexTransTool (TTT) の AtlasTexture コンポーネント 使用時にマテリアルの組み合わせ次第では
Enable Baking Alpha Mask Texture
と TTT のプロパティベイクの二重焼き込みの影響で表示上の問題が発生する場合があります。その場合はEnable Baking Alpha Mask Texture
か TTT のプロパティベイクのどちらかを無効にしてください
リムライト、マットキャップ、アウトラインのうち表示上の互換性の問題からアウトラインのみ有効となっています。
ビルド時にのみ除外する VRC PhysBone Collider コンポーネント及び VRC PhysBone コンポーネントを設定します。
Excluded Spring Bone Colliders
Excluded Spring Bones
ビルド時に非表示のゲームオブジェクトがある場合は出力から除外しますが、この項目を使うことによってゲームオブジェクトを非表示に設定しなくても出力を除外することが可能になります。
ビルド時にのみ除外する VRC PhysBone Constraint コンポーネントを設定します。
Excluded Constraints
利用目的は Spring Bone Options
の Excluded Spring Bone Colliders
および Excluded Spring Bones
と同じです。
以下の設定が可能です。
Make All Node Names Unique
Enable Vertex Color Output
Disable Vertex Color on lilToon
Enable Vertex Color Output
が無効、シェーダが lilToon ではないのいずれかに該当する場合は何もしませんEnable Generating glTF JSON File
Delete Temporary Object Files
KTX Tool Path
KHR_texture_basisu
が付与されます名前はビルド対象のアバター(ゲームオブジェクト)につけられた名前がそのまま利用されます。
ビルド時に非表示のゲームオブジェクトが存在する場合はそのノードがなかったものとして扱われます。またそのノードの子孫が存在する場合も同様に扱われます。
[!NOTE] VRC PhysBone が登場する前に使われていた Dynamic Bone からの変換には対応していません
VRC PhysBone については VRM Spring Bone のジョイントに変換されます。ただし Immobile および Limit については VRM Spring Bone に対応する仕様が存在しないため、「動きにくくする措置」として以下で計算されます。
VRM Spring Bone と VRC PhysBone は計算方法が異なるため結果は同一になりません。また VRM Spring Bone の仕様に存在しない以下の項目には変換に対応していません。
Ignore Transforms
Endpoint Position
Grab & Pose
[!TIP] 枝分かれが生成される場合スプリングボーン名に
.${番号}
が末尾に付与されます。番号は 1 からはじまり、たとえばスプリングボーン名がSB
で 2 つ存在する場合はSB.1
とSB.2
になります。
VRC PhysBone の子孫に枝分かれが存在する場合は Multi-Child Type
に基づき以下の対応が行われます。
Ignore
First
Average
VRC PhysBone のコライダーは以下の三種類に対応しています。
Capsule
(カプセル)Plain
(平面)Sphere
(球)Inside Bounds
が有効もしくは Plain
の場合は VRMC_springBone_extended_collider
拡張に対応しているアプリケーションが必要となります。対応していないアプリケーションを利用した場合は前者が存在しないものとして、後者の場合は半径 10km の巨大スフィアコライダーを設定する形でそれぞれ処理されます。
Constraint または VRC Constraint が使われている場合は VRM Constraint に変換されます。またその場合は以下の三種類に対応しています。10 変換元に複数の Constraint または VRC Constraint が存在する場合は最初のひとつのみが変換されます。11
AimConstraint
RotationConstraint
ParentConstraint
いずれも複数ソースノードを持つものについては VRM Constraint の仕様上対応できないため、最初のソースノードのみ利用されます。
RotationConstraint
は Freeze Rotation Axes
の結果によって変換先が変わります。
X軸 | Y軸 | Z軸 | 変換先 |
---|---|---|---|
✅ | ✅ | ✅ | RotationConstraint |
✅ | ❌ | ❌ | RollConstraint (X軸) |
❌ | ✅ | ❌ | RollConstraint (Y軸) |
❌ | ❌ | ✅ | RollConstraint (Z軸) |
✅ | ✅ | ❌ | (変換しない) |
❌ | ✅ | ✅ | (変換しない) |
❌ | ❌ | ❌ | (変換しない) |
Unity Constraint での Constraint Settings
および VRC Constraint での Freeze Rotation Axes
以外の Constraint Settings
と Advanced Settings
の設定の変換は VRM に仕様に対応する機能が存在しないため対応していません。
スプリングボーンと同様に VRM Constraint と Unity/VRC Constraint は計算方法が異なるため結果は同一になりません。
lilToon シェーダが使われている場合は MToon 互換設定に変換します(MToon 未対応の環境のために KHR_materials_unlit
も付与します)。その場合は以下の処理を行います。
MToon Options
の Enable Baking Alpha Mask Texture
が有効の時のみMToon Options
の Enable Rim
が有効かつ乗算モードの時のみMToon Options
の Enable MatCap
が有効かつ加算モードの時のみMToon Options
の Enable Outline
が有効の時のみlilToon 以外のシェーダが使われている場合は MToon の変換は行われず、glTF 準拠の最低限の設定で変換します。
以下のいずれかに当てはまっていないかどうかを確認してください。これらは全てコンポーネント上に事前に警告またはエラーメッセージが入ります。特に1番目は起こりやすいです。
VRM Export Description
コンポーネントにチェックが入ってないVRM Export Description
コンポーネントが VRC Avatar Descriptor
コンポーネントと同じ場所にいないAuthors
設定が入っていないLicense URL
設定が URL 形式として不正ただし Skinned Mesh Renderer の実行時破損検出処理で NDMF のコンソールにエラーとして表示されることがあります。その場合は該当する Skinned Mesh Renderer を Mesh Renderer に変更するか、プロジェクトの作り直しが必要になります。
このツールではそのような機能を持っていませんが、VrmDowngrader と VRMRemaker がありますのでそちらを使いください。ただし 0.x に変換して 1.0 に戻す形の再変換を行った場合は原則としてサポート対象外となりますのでご注意ください。
ありません。また実装予定もありません。
VRChat アバターを VRM に変換(またはその逆)するツールとして定番である VRM Converter for VRChat は VRM 0.x の仕様準拠で変換するのに対して NDMF VRM Exporter は VRM 1.0 の仕様準拠で変換するという点にあります。
そのため VRM Converter for VRChat では対応する VRM 0.x の仕様上どうしても変換できないカプセルコライダーおよび拡張コライダーとコンストレイントが NDMF VRM Exporter では変換することができます。その他の違いとして以下の表にまとめています12。
項目 | VRM Converter for VRChat | NDMF VRM Exporter |
---|---|---|
VRM 0.x への変換 | ✅ | ❌ |
VRM 0.x からの変換 | ✅ | ❌ |
VRM 1.0 への変換 | ❌ | ✅ |
VRM 1.0 からの変換 | ❌ | ❌ |
出力設定 | 毎回設定が必要 | 初回のみ |
Modular Avatar の対応 | 変更のたびに Manual bake avatar が必要 | 追加設定不要 |
MToon の自動変換 | ❌ | ✅ (lilToon のみ) |
UniVRM | 必要 | 不要 |
NDMF VRM Exporter は他ツールとの干渉を避けるように設計されているため、VRM Converter for VRChat と一緒に入れて扱うことができます。NDMF VRM Exporter は VRM 0.x を扱えず、また Modular Avatar を利用していない着せ替えには対応せず VRM から VRChat 向けアバターに変換することもできないため、その場合は VRM Converter for VRChat が出番になります。必要に応じて使い分けてください。
VRM 1.0 を出力できる点は同じですが、出力するまでの過程が異なります。
VRoid Studio の場合は VRM の出力に XAvatar を利用する関係で VRoid Studio の導入が別途必要で、作業自体は Unity 単体で完結しません。くわえて Modular Avatar を使って着せ替えを行なっている場合 VRoid Studio 向けに XAvatar の作業行程を新たに構築する必要があるため、その構築を NDMF VRM Exporter では不要とする点が強みとなります。
XWear Packager と NDMF VRM Exporter は一緒に入れることができるため、XWear/XAvatar が必要な場合は XWear Package 経由で VRoid Studio を、Modular Avatar を使っている場合は NDMF VRM Exporter を使い分けることが可能です。
まずそのエラーメッセージが利用するにあたっての制約(例えばファイルサイズやポリゴン数上限など)によるものではないことと、ほかの VRM に対応する複数のアプリケーションで利用できるかどうかの確認が必要です。動作結果と問い合わせ先の表は以下のとおりです。
[!NOTE] ほかの複数アプリで確認する場合は最低でも2種類以上で動作確認をしてください
利用先アプリ | ほかの複数アプリ | 問い合わせ先 |
---|---|---|
✅ | ✅ | (何もしなくてよい) |
❌ | ✅ | 利用先アプリの問い合わせ窓口 |
✅ | ❌ | NDMF VRM Exporter に Issue を起票(ただしこれはイレギュラーなので基本的に発生しない) |
❌ | ❌ | NDMF VRM Exporter に Issue を起票 |
利用制約は軽量化によって解決できることがあります。軽量化についての詳細は VRChatアバター最適化・軽量化【脱Very Poor】 を参照してください。
厳密には VRCPipelineManager コンポーネントで管理されているブループリント ID が発行されている必要があります。これはアバターの初回アップロード後に自動的に発行されます ↩
これは VN3 のような法務的監修を受けたライセンスとは別の完全に独自運用のライセンスを想定しています。ただし独自ライセンスの運用は法務上の相談ができる環境でなければ原則として避けるべきです ↩
ブレンドシェイプに直接対応するものは表情ではなく VRM の派生元である glTF におけるモーフターゲットです ↩
これは Avatar Optimizer に対してアニメーションクリップに含まれる変形対象のすべてのブレンドシェイプの最適化を無効にする必要があるためです。変形対象となるブレンドシェイプの数が多いほどその影響が大きくなります ↩
VRM の派生元である glTF の仕様として ノード名が一意であることを求めていません。その一方で利用先アプリケーションによってはノード名が一意であることが求められる場合があるため、開発用途でなければ有効のままにしてください ↩
lilToon において頂点色は 輪郭線設定 または ファー設定 として転用されますが、VRM の派生元である glTF では本来の目的である頂点色として使われるため、設定を解除すると意図しない色出力が発生することがあります ↩
VRM をサーバにアップロードして利用する場合はテクスチャ圧縮をサーバ側で実施するため NDMF VRM Exporter 側で実施する必要はありません。一方でサーバにアップロードしないかつ KHR_textures_basisu
に対応しているアプリケーションを利用するか、開発用途の場合でこのオプションが有用になることがあります ↩
1.0.5 以前は枝分かれに考慮されていなかったため、枝分かれも繋がったひとつのスプリングボーンとして出力されていました ↩
Position Constraint (実質的に Parent Constraint も同様) は未対応ですが https://github.com/vrm-c/vrm-specification/issues/468 で要望があがっています ↩
VRM Constraint が glTF のノードの拡張として実装されており、ひとつのノード(=ゲームオブジェクト)につきひとつの VRM Constraint しか持つことができないためです ↩
元々の開発の動機は VRM Converter for VRChat の VRM 1.0 への未対応によるものでした。しかし仮に対応できたとしても毎回手作業が必要になるのに対して極力自動化したい動機が別にあったのと VRChat のアバター着せ替えにおける一大勢力である Modular Avatar を中心とする NDMF 圏の恩恵を最大限受けられるようにするため NDMF プラグインとして実装した経緯があります。開発にあたって lilycalInventory の思想を設計上の参考にしています ↩
com.github.hkrn.ndmf-vrm-exporter
Undefined
1.0.7 (Changelog)
2022.3 or later
No dependencies
No legacy packages
Undefined