🚀

Resoniteのアバターセットアップ - 自分でセットアップする方向け

2024/09/13に公開

はじめましての方ははじめまして。UniPocket運営です。


UniFesta2024が2024年10月開催決定!

UniFesta2024は2024年10月開催します。良ければ奮ってご参加ください。

Resoniteでのアバターインポート方法についてですが、大きく分けて二つ手法があります。

  1. ResonitePackageを利用
  2. Resoniteにアバターデータをインポート、セットアップして利用

このうち1についてはnoteの記事で取り扱います。ResonitePackageの利用方法について確認したい方はこちらを確認してください。

https://note.com/unipocket/n/nd14a75f206f1

本稿では、「Resoniteにアバターデータをインポート、セットアップして利用」をメインとして取り扱います。

NeosVRについて

この記事では、いくつかNeosVRに関する記述も取り扱っています。
NeosVRはResoniteに近いプラットフォームで、参考になる記事が多く含まれるため引用しています。


アバターデータのインポート・セットアップ手順

この記事では以下の通り定義します。

  • セットアップ: アバター化・アバター化後の調整を含んだ一連の工程
  • アバター化: アバターを着用できるようにするセットアップの中の一手順

アバターのデータ形式別解説

モデルデータについての説明

アバターは主に3つのデータが必要になります。

  • メッシュ情報
  • ボーン情報
  • テクスチャ情報

このうち「メッシュ情報・ボーン情報」にはモデルデータに入っています。
テクスチャ情報はモデルデータの形式によっては入っていますが、
中には入っていないこともあります。
このモデルデータをどの形式から生成するかで気を付けるポイントが変わります。

まずはResoniteにインポートしたいアバターのモデルを、FBX形式もしくはglTF形式のファイルで用意する必要があります。以下、導入したいアバターの形態別に解説します。

  1. FBX形式
  2. GLTF形式(GLB含む)
  3. VRM形式
  4. Non-Destructive Modular Frameworkをお使いの場合。例えば以下のツールがあります
  5. Unity Asset生成を利用した形式(明確なファイルがない)

それでは見ていきましょう。


FBXの場合

FBXの場合

ResoniteはFBX形式のモデルに対応しています。
そのまま次の「Resoniteへのインポート・アバター化」の項目にお進みください。

うまく動かなかった場合は、以下をご参考にモデルデータを再確認してください。

[モデルデータの確認] について

Resoniteでは、ボーンの認識について「名称ベース」で実施しています。
そのため、例えば服を着せた場合やアクセサリー用のボーンに、本来体で使われているべきボーンの名前が含まれている場合、誤ってアクセサリーや服用のボーンが体として認識されてしまうことがあります。

具体的な名称は下のWikiを確認していただき、もし該当する名前がある場合は、Wikiに記載のある通り、 <NOIK> という名称をボーン名のどこかに追加してください。

https://wiki.resonite.com/Humanoid_Rig_Requirements_for_IK

FBXの注意点

ResoniteではFBXを扱えますが、公式Wikiでは「最善」ではなく「まあ良し」の記述です。

https://wiki.resonite.com/Avatar_Creation

可能であれば下で解説する [GLTF形式] でのセットアップを検討してください。
現状のビルドで起こる問題としては次の通りです。
全て「そうなることもある」であり、必ずしも起きることでない点に留意してください。

  • ☆Resoniteがクラッシュする
    • 対処法: 現状調査中。FBXのバージョンを下げることで回避できるとの経験則がある。Issueは#168
  • ブレンドシェイプの名称/順序がおかしくなる
  • FBXにPre/Post Rotaionが入っているときに、不要なSlotが大量に生成される

https://uni-pocket.com/ja/items/6259160c-ce44-410e-b662-749b6c7874f1

もしFBX形式ではうまくインポートできない場合は、以下の手順でGLTF形式に変換してから [Resoniteへのインポート・アバター化] にお進みください。

GLTFの変換方法

GLTFの変換方法

変換方法についてはこちらのブログ等を参考に変換してください。OSSのツールも散見されましたのでそちらを使うのも手かもしれません。

https://bluebirdofoz.hatenablog.com/entry/2021/08/26/224216

変換しインポート後、うまく動作しない場合はモデルデータの確認を実施してください。

GLTFの場合

GLTFの場合

GLTF形式はWebを中心としてファイルを取り回しよく扱えるように定義された、「仕様が公開されている」ファイル形式です。

https://www.khronos.org/gltf/

GLTF形式はResoniteの推奨形式です。
そのまま [Resoniteへのインポート・アバター化] にお進みください。

うまく動作しない場合はモデルデータの確認を実施してください。

[モデルデータの確認] について

Resoniteでは、ボーンの認識について「名称ベース」で実施しています。
そのため、例えば服を着せた場合やアクセサリー用のボーンに、本来体で使われているべきボーンの名前が含まれている場合、誤ってアクセサリーや服用のボーンが体として認識されてしまうことがあります。

具体的な名称は下のWikiを確認していただき、もし該当する名前がある場合は、Wikiに記載のある通り、 <NOIK> という名称をボーン名のどこかに追加してください。

https://wiki.resonite.com/Humanoid_Rig_Requirements_for_IK

GLTFの変換方法

変換方法についてはこちらのブログ等を参考に変換してください。OSSのツールも散見されましたのでそちらを使うのも手かもしれません。

https://bluebirdofoz.hatenablog.com/entry/2021/08/26/224216

GLTFでエクスポートする際の注意点

VRMの場合

VRMの場合

VRM形式の場合、GLTF形式に変換してからインポートする流れとなります。
変換手順は以下の記事をご確認ください。

https://wiki.resonite.love/uncategorized/vrmアバターについて

基本的なアプローチだけ記載します。

  1. .vrm の拡張子を .glb に変更する
  2. UniVRMを使用して GLBファイル(GLTF形式) をエクスポートする
  3. VRM自動変換スクリプトを使う(BlenderにVRMを入れてGLBファイル(GLTF形式)として出力)

いずれかの手順でGLBファイル(GLTF形式)が出来ましたら
[Resoniteへのインポート・アバター化] にお進みください。
推奨は1ですが、ボーンにメッシュがうまく追従しない場合は2を、
それでもなお追従しない場合は3をお試しください。

また、ボーン自体が正常に割当たっていない場合はモデルデータの確認をしてみてください。

[モデルデータの確認] について

Resoniteでは、ボーンの認識について「名称ベース」で実施しています。
そのため、例えば服を着せた場合やアクセサリー用のボーンに、本来体で使われているべきボーンの名前が含まれている場合、誤ってアクセサリーや服用のボーンが体として認識されてしまうことがあります。

具体的な名称は下のWikiを確認していただき、もし該当する名前がある場合は、Wikiに記載のある通り、 <NOIK> という名称をボーン名のどこかに追加してください。

https://wiki.resonite.com/Humanoid_Rig_Requirements_for_IK

NDMF(Non-Destructive Modular Framework)をお使いの場合

NDMF(Non-Destructive Modular Framework)をお使いの場合

Non-Destructive Modular Framework(通称なでもふ)を使用している場合は、NDMFの「Manual bake avatar」にてベイクされたデータを元に、GLTF形式に出力することで対応可能です。

自動でNDMFのアバターをエクスポート

GLTF形式でのエクスポートまで自動化できるツールがあります。

https://github.com/KisaragiEffective/ResoniteImportHelper

以下の手順で実施可能です。

  1. Package Managerを表示します。
    • WindowPackage Manager から表示できます
  2. UniGLTFをインストールします
    • +▼Add package from git URL... でURLを入力する画面を出します
    • このURLを入力: https://github.com/vrm-c/UniVRM.git?path=/Assets/UniGLTF
  3. ResoniteImportHelperをインストールします
    • +▼Add package from git URL... でURLを入力する画面を出します
    • このURLを入力: https://github.com/KisaragiEffective/ResoniteImportHelper.git
  4. Tools → Resonite Import Helper を開きます。
  5. Target avatar rootに処理したいアバターをドラッグ & ドロップします
  6. [Start] をクリック。
  7. 処理が終わったら [Open in file system] を押します。


処理で使う画面


処理後の画面

出てきた .gltf で終わるファイルがインポートするものです。
GLTFファイルが完成したら、次の [Resoniteへのインポート・アバター化] の項目にお進みください。


手動でベイク・エクスポートする方法

自動化ツールを使用しない場合、以下の手順でアバターをベイクできます。

  1. アバタールートを右クリック
  2. 右クリックメニューより[NDM Framework] -> [Manual bake avatar]
  3. ベイク済みアバターが生成されます

GLTFファイルのエクスポート

GLTFファイルを扱えるUnityのプロジェクトはいくつか存在します。
このうち、Humanoidの出力に対応しているのは以下の二つです。

  1. マテリアルをいい感じに整える
    UniGLTFの場合はMToon経由でUniUnlitに、UnityGLTFの場合はUnlitGraphに変更して、テクスチャを割り当てていってください。UniGLTFの場合はMToon変換まではシェーダーが対応していることもあります。
  2. マテリアルまで整えたデータをUniGLTFなりUnityGLTFなりで出力するとGLTF形式で出力できます。

より詳細の解説はこちら。ただしこちらはModular AvatarのManualBakeを利用しています。

https://github.com/konto250/GLTFimport

以上からGLTFファイル形式が用意できましたら
[Resoniteへのインポート・アバター化] にお進みください。

インポート後、うまく動作しない場合はモデルデータの確認を実施してください。

[モデルデータの確認] について

Resoniteでは、ボーンの認識について「名称ベース」で実施しています。
そのため、例えば服を着せた場合やアクセサリー用のボーンに、本来体で使われているべきボーンの名前が含まれている場合、誤ってアクセサリーや服用のボーンが体として認識されてしまうことがあります。

具体的な名称は下のWikiを確認していただき、もし該当する名前がある場合は、Wikiに記載のある通り、 <NOIK> という名称をボーン名のどこかに追加してください。

https://wiki.resonite.com/Humanoid_Rig_Requirements_for_IK

その他Unityでアバターをセットアップされている場合

その他Unityでアバターをセットアップされている場合

UnityからGLTF形式のファイルを出力します。

GLTFファイルのエクスポート

GLTFファイルを扱えるUnityのプロジェクトはいくつか存在します。
このうち、Humanoidの出力に対応しているのは以下の二つです。

  1. マテリアルをいい感じに整える
    UniGLTFの場合はMToon経由でUniUnlitに、UnityGLTFの場合はUnlitGraphに変更して、テクスチャを割り当てていってください。UniGLTFの場合はMToon変換まではシェーダーが対応していることもあります。
  2. マテリアルまで整えたデータをUniGLTF もしくは UnityGLTFで出力するとGLTF形式で出力できます。

より詳細の解説はこちら。ただしこちらはModular AvatarのManualBakeを利用しています。

https://github.com/konto250/GLTFimport

以上からGLTFファイル形式が用意できましたら
[Resoniteへのインポート・アバター化] にお進みください。

インポート後、うまく動作しない場合はモデルデータの確認を実施してください。

[モデルデータの確認] について

Resoniteでは、ボーンの認識について「名称ベース」で実施しています。
そのため、例えば服を着せた場合やアクセサリー用のボーンに、本来体で使われているべきボーンの名前が含まれている場合、誤ってアクセサリーや服用のボーンが体として認識されてしまうことがあります。

具体的な名称は下のWikiを確認していただき、もし該当する名前がある場合は、Wikiに記載のある通り、 <NOIK> という名称をボーン名のどこかに追加してください。

https://wiki.resonite.com/Humanoid_Rig_Requirements_for_IK


Resoniteへのインポート・アバター化

基本的なアバター化の手順

インポートするファイルが用意できたら、Resoniteにインポートしてアバター化しましょう。
まずはこちらの動画をご覧ください。基本的な手順が解説されています。

https://www.youtube.com/watch?v=mRTg09Vkz6c

以下、おさらいと補足情報になります。

  1. ユーザースケールを事前に1に再設定。
    • 「コンテキストメニュー」を開き、「スケーリング無効」になっていることを確認。
    • 「スケールリセット」が表示されている場合はクリックし「スケーリング無効」になったことを確認。
  2. モデルデータをResoniteの画面上にDrag & Drop
  3. [3Dモデル] → [一般的なほとんどのモデル] → [メートル (FBXの場合は[ヒューマノイドの身長に自動設定]) ] → [高度な設定]
    • FBXの場合は [3Dモデル] → [一般的なほとんどのモデル] → [ヒューマノイドの身長に自動設定] → [高度な設定]
  4. (高度な設定) マテリアルは通常[XiexeToon] / 陰影が目立った方がいいなら[PBS]
  5. (高度な設定) アセットをオブジェクト内に入れるにチェック
  6. インポート実行
  7. モデルのルートスロットをインスペクターで開き、VRIKのBoneReferencesに想定通りのボーンが割当たっているか確認。想定通りに割当てられていない場合はblender/Unityで修正
    • 想定通りではない例:
      • 「Chest」ボーンに「UpperChest」が割当てられている
      • 「UpperArm」ボーンに「UpperArm_Ribbon」が割当てられている
[ボーンの割当て] について

Resoniteでは、ボーンの認識について「名称ベース」で実施しています。
そのため、例えば服を着せた場合やアクセサリー用のボーンに、本来体で使われているべきボーンの名前が含まれている場合、誤ってアクセサリーや服用のボーンが体として認識されてしまうことがあります。

具体的な名称は下のWikiを確認していただき、もし該当する名前がある場合は、Wikiに記載のある通り、 <NOIK> という名称をボーン名のどこかに追加してください。

https://wiki.resonite.com/Humanoid_Rig_Requirements_for_IK

アバタークリエイターでアバター化します。

  1. ホーム画面から[アバタークリエイター]をクリック。アバタークリエイターを生成
  2. ヘッドセットをモデルの頭にだいたい合わせて、パネルの揃えるボタンを上から5つ押す
  3. 手の位置を合わせる
  4. パネルから「作成」を押す

アバター化に関する参考情報

インポート後の調整

インポートした後、色々なところが気になると思います。
Unityに直接入れてそのままアップロードせず、マテリアルの設定やアニメーションの設定をすると思います。それと同じようなものです。

ここですべてのパターンを網羅することはできないので、代表的な気になる点と、
その他困りそうなものをFAQとしてまとめます。

マテリアルの設定について

テクスチャを入れたい場合はこちらの動画をご確認ください。

https://www.youtube.com/watch?v=0r61bbkDALw

lillさんのセットアップマニュアルにはより詳細な情報があります。

  • (販売アバター等の場合)Unityで開いてマテリアルを確認できるようにしておく
  • 半透明テクスチャを使っている場合BlendModeをAlphaにする
  • ShadowRampをいい感じのものにする。表情(頬染め等)用の半透明メッシュはShadowRampナシがよい
  • ShadowSharpnessを0にする
  • Outlineを適宜設定する。OutlineWidth=0.1、Outline=Litが無難。UnityPackageがあるならそれを参考にする。OutlineMaskがあるなら読み込んで設定する
  • EmissionColorを調整する。RGBA=1,1,1,1は大抵の場合明るすぎる。UnityPackageがあるならそれを参考にする
  • Matcapはマスクが使われていなければ入れる。マスクが使われているなら諦める。MatcapTintはいい感じにする
  • NormalScaleをいい感じに調整する。UnityPackageがあるならそれを参考にする
  • その他適宜入っているマスクやテクスチャで使えそうなものをいい感じに適用する

以下のXiexeToonマテリアルについて解説した記事も参考になります。

https://note.com/akiram_vr/n/n5e55290e2cee

ShadowRamp(★)
モデルに影が落ちるときに生まれる影のグラデーションのパターンをここで指定します。
デフォルトだと灰色で段階がはっきり分かれたShadowRampが入っているため、くっきりしたグレーの影が落ちます。
これが人物などの場合だと極めて血色が悪く見えてしまうため、「Clear」を押して丸ごと消すか、少なくとも変更することを強く推奨します。

ShadowSharpness(★)
影が入り始める鋭さを指定します。
ワールドやアイテムによっては光に影が落ちる設定が入っており、その際の影の付き方を指定するパラメータです。
上げるほどパキっとした影になりますが、人物などでは違和感が強いため「0」推奨です。

Resoniteと類似の仕様である、NeosVRでのマテリアル設定に関するFAQも参考になります。
こちらも確認してみてください。

https://neosvrjp.memo.wiki/d/Avatar_Import#content_4

マテリアルを両面表示にする(Culling / Sideness)
標準では片面描画のため、スカートの裏などからメッシュが透けている場合がある。
両面設定にしたい場合は下の図のようにマテリアルのCulling(間引き)をOFFにすることで対応。

DynamicBoneについて

Resoniteでは揺れものの表現に「DynamicBone」を使用しています。

DynamicBoneを入れたい場合はこちらの動画をご確認ください。

https://www.youtube.com/watch?v=xa1oPHyPrn4

セットアップマニュアルにはより詳細な情報があります。

  • DBはまとめて入れない(アバター最適化ガイドラインを投げ捨てること)
  • ボーンの終端にendと名前のついたボーンがあるならSimulateTerminalBonesのチェックを外す
  • ボーンをつけるときは「子にしたものをセットアップ」
  • Inertiaは髪なら0.4、スカートなら0.7ぐらい
  • InertiaForceはInertiaを10倍にして-1をかけたもの
  • DampingはInertiaの20倍か30倍
  • Elasticityは弄らない
  • Stiffnessは髪を揺らしたときにめり込まない限界の数字まで上げる。前髪なら大抵0.95~0.98ぐらいまであげる。髪にDBColliderは使わない
  • スカートはStiffness0.6~0.8ぐらい。DBColliderは貫通が酷ければ使うが諦めも大事
  • 重力を使うときはGravityをy=-0.98にして、Damping=0、Elasticity=5ぐらいにする。InertiaやInertiaForceは0.1,-1ぐらいでStiffnessは0.1~0.4ぐらいで調整

Resoniteにおける揺れもの設定の話も参考になります。

https://nanasai.hatenablog.jp/entry/2023/12/10/165046

なんもわからんかったらとりあえず
Elasticity
Damping
を調整すればよい

その他

  • Resoniteのアバターで出来ること・出来ないことの比較:
    Neosのアバターで出来ること、できないこと
  • テクスチャが入らない: Resoniteでテクスチャを入れるかBlenderで入れる
  • 目が動きすぎる: Head/EyeManagerのEyeRotationDriverのMaxSwingをいい感じにする。EyeManagerがなかったらいい感じに作る
  • 目の閉じ方が左右で違う: EyeLinerDriverのOpenCloseTargetが正しいか確認する
  • しゃべると耳や服がぴくぴくする: SkinnedMeshRendererの付いているスロットに間違ったDirectVisemeDriverがついていたり設定されていないか確認する
  • 顔に変な影が入ったりガビガビしたりする: 顔のSkinnedMeshRendererのMeshからStaticMeshを開き、「ブレンドシェイプの法線を取り除く」「ブレンドシェイプの接線を取り除く」を押す
  • 足が下に曲がる(最新版では起きなくなったらしい): アバタールートスロットのVRIKAvatarコンポーネントのMaxFeetVelocityOffsetを0.2ぐらいにする
  • 前髪がかかる: AvatarRenderSettingsを適当なスロットを作り入れる(/Config/RenderSettingsなど)。NearClipをいい感じに設定する。0.075~0.125ぐらいが大抵よいが、着て確認すること。
  • 服の着せ替え: こちらの記事を参考にする。

参考情報

参考になるサイト群

今まで上げた内容以外で引っ掛かる場合もあると思います。

色々なサイトに知見があるのでそれらのサイトを紹介します。

ただ、15分間自分で試して(調べて)解決法が分からない場合は
Resonite / ResoniteJapan Discordで聞いてみるのをお勧めします。[1]

https://discord.com/invite/resonite-japan

直接的な解決法がないものでも、間接的な解決方法があるかもしれません。

  • NeosVR日本語Wiki の「Avatar_Import」

基本的にはここを確認してみてください。体系的にまとまっています。

https://neosvrjp.memo.wiki/d/Avatar_Import

  • lillさん制作 「アバターセットアップ」

何か見逃しているかもしれません。今一度確認してみてください。

https://lillill.notion.site/by-lill-21ba5946cdd841339366b93913a52407

  • Resoite非公式日本語Wiki

https://wiki.resonite.love/uncategorized/site-collection

  • Notion for Resonite内Tips
    全体的なTipsであればここを確認してみてください。

  • AdventCalendar
    Resonite・Neosで毎年末にアドベントカレンダーを書いています。
    そちらにだけ情報がある場合もあります。去年のものはこちら

https://adventar.org/calendars/8649

非ヒューマノイドのアバターセットアップ

非ヒューマノイドのアバターもResonite内で作成できます。

[基本的な手順] → [アバタークリエイターでアバター化]で操作した通り、
Resoniteではアバタークリエイターを利用してアバター化します。
そのため、3Dモデルをそのままインポート もしくは 作成し、アバタークリエイターでアバター化するといったことも可能です。

なお、「頭」「右手」「左手」の設定ができますが、アバター作成時に欠けた部位はアバターを着た際にデフォルトのものが代替されます。
手を表示したくない場合などは「右手」「左手」にダミーの箱を用意してアバターセットアップ後、箱のMeshRenderer / BoxColiderを非アクティブにすることも可能です。

フルボディトラッキングについて

Resoniteはフルボディトラッキングに対応しています。
類似のソフトウェアであるNeosVRの記事が参考になりますので、以下をご確認ください。

Neosには二つのキャリブレーションが存在します。

  1. トラッカーキャリブレーション
  2. アバターキャリブレーション

それぞれの違いとして、以下の通りとなっています。

トラッカーキャリブレーション: Neosの一般的な骨格 と 現実の骨格 の位置をキャリブレーションする機能。Neosを起動後初回だけすればOK。Haritoraなどずれない前提のトラッカーであれば以後再起動しても調整する必要なし。
アバターキャリブレーション: アバターの骨格 と Neosの一般的な骨格 の位置をキャリブレーションする機能。Neosにアバターをインポート後一回だけ確認する必要あり。正しく動いているのであれば以後調整不要。

この考え方を踏襲すれば問題ありません。
そのため、まずは以下を確認し問題ないか判断してください。

https://neosvrjp.memo.wiki/d/�ե��ܥǥ��ȥ��å�����

まとめ / 様々な改変について

インポート作業・記事をここまで読んでいただきありがとうございました。

この記事ではあくまでデータを整えてインポートし、アバター化する部分、アバター化した後の「みんな直したいであろう部分」「みんな確認したいであろう部分」に触れています。

その後のカスタマイズは個々の自由です。

Resoniteの改変の可能性はかなり広いです。
1日で「何かありませんか?」と聞きまわっただけでもこれだけありました。
個々のパターンは長くなるため説明しませんが、皆さんもすぐに見ることができると思います。

  • タコ足・髪の毛でモノを取る(EffectorTargetで延ばしている)
  • 自分だけ見える音声情報(ミュート・ウィスパー・シャウト・ブロードキャスト)
  • 自分の背中に乗せているランドセルがなんでも入る四次元ポケット
  • アホ毛を抜くと脳が出てくる
  • アホ毛を抜くと占いができる
  • 喋ると上部にあるHoloが光る
  • 喋ると波形情報がネームプレートに表示される
  • Resonite内にあるギミックをアバター内に内包させる(翻訳機等)
  • ネームプレートの変更(色・日本語化…)
  • 名前を言語設定毎に表示を切り替える
  • アイテムの出現ショートカットを仕込んでいる
  • 自分の頭の手前でトリガーを押すと巻物が出てきて、そこにツールが入ってる
  • 移動方法を追加して他のユーザーに掴まれるようにしている
  • 移動方法を追加してジャンプ力の強化をしている
  • 自分の好みに合わせてバッジの削除・追加をしている
  • 表情設定の追加
  • 暗いワールドでライト点灯させるために目が光るようになっている
  • 自分の胸ぐらいに「ヒト/ケモ」のボタンを押し、人によって見た目を変える。変えた情報は保存される

また、分からないことがあった場合でも聞ける体制が整っています。
Discord の Resonite Japanでも質問を受け付けております。
対面が良ければJPチュートリアルワールドでヘルプボタンを押して確認することも可能です。

是非皆さんも自分好みの改変をしてみてください。


ぶい。

脚注
  1. GoogleのAI学習チームが採用している手法。 15 分ルール: 行き詰まったら、15 分間は自分で試してください。15 分が経過したら、助けを求めてください。- https://www.reddit.com/r/MachineLearning/comments/4w6tsv/ama_we_are_the_google_brain_team_wed_love_to/↩︎

UniPocketブログ

Discussion