ホーム
MarkN流アバターセットアップ[Resonite玄人向け]

MarkN流アバターセットアップ[Resonite玄人向け]

· · Resonite 解説 アバター

こんにちは、「まーくん。(MarkN)」です

この記事は Resonite Advent Calendar 2025 の4日目の記事です

この記事では、Resoniteの玄人向けにMarkN流の軽量なアバターセットアップ方法を紹介します

はじめに

私の理解に誤りがある可能性もあるため、この記事を盲信しないでください
Resoniteのアップデートで記事の情報が古くなる可能性があります。

この記事のセットアップは主に 意図しない動作をさせない・他人のFPSを低下させない ことを重視しています。

この記事の内容に従う必要はありません。私と重視する内容が似ているなら参考にしてください。

具体的な実装方法までは解説しきれていない部分も多いため、以下の私がセットアップしたアバターを分解しながら読むことをおすすめします。(改変可能にするために一部最適とは言えない部分も残っています)

また、Resoniteで作業する際はこまめにインベントリにバックアップを保存するようにしましょう。

以下のサイトも参考になるので、ぜひ目を通してみてください。

初心者さんへ

初心者の方はこの記事は無視して、まずは簡単なところから楽しく気楽にセットアップを楽しみましょう。
Resoniteは中で一緒に作業ができるプラットフォームなので、JPチュートリアルでHelpボタンを押すなどしてメンターなどに手伝ってもらうか、
日本のResoniteDiscordサーバーで「アバター設定依頼」をしてみてください。

どうしても一人でやりたい方は、Resoniteの操作をある程度覚えてから、以下のサイトなどを参考にしてみてください。(これら以外にも色々あるので検索してみて)

目次

インポート系

挙動修正

軽量化

更新履歴等

Hips位置の誤認

アバターのボーンがResoniteの推奨する構造・命名になっていないとアバター化できなかったり、Hipsの位置を誤認したりします。

hipsの位置を誤認している例

足元にhipsがあるため、椅子に座ると浮いてしまいます。

alt text

hipsとspineの距離を元にhipsコライダーを生成するため、足元から胸あたりまである巨大コライダーが生成され、デスクトップモードで手が浮いてしまいます。

alt text

修正方法

ボーンがResoniteの推奨する構造・命名になっていない場合は、Blender等で修正しましょう。

UpperChestHipsConstraint 等があると hips の位置を誤認してしまいます。 不必要なボーンがある場合は、ボーンの名前に <NoIK> とつけることで無視させることができます。

  • 例:UpperChest<NoIK> UpperChest<NOIK> <noik>UpperChest

alt text

表記がResoniteの推奨に合っていない場合も書き直しましょう。

  • 例:ヒップhiphips

表記と位置が合っていない場合は、いい感じに辻褄を合わせてください。

Resoniteが推奨する構造

alt text

詳細を知りたい場合は公式Wikiを参照してください。

極端なスケール

アバタールートやMeshRenderer、ボーンのスケールが 1に近い値 になるようにしましょう。あえて1以外にするメリットはほとんどありません。

スケールがバラバラだとアウトラインの幅などが不均一になったり、ボーンの中にスロットを入れる系のアイテムの一部で問題が起きたりします。

alt text

アバタールートのスケールが 0.01 などになっている場合は、一度Blenderで開きましょう。

  1. まずはBlender上で大きさが 0.3~2.0mくらい (使用予定の身長に近い値)になっているのを確認します。
  2. なっていなければスケールを変えて、スケールの適用 を行います。

alt text

エクスポート形式は fbx または glb(gltf) のうまくいく方を使いましょう。
glb(gltf) の方がおすすめです。

glb(gltf)でエクスポート

私がglbでエクスポートする時の設定

  • 内容: カメラやボックスが含まれないように設定してください。(画像では隠れてる)
  • トランスフォーム: +y が上 です。(画像では隠れてる)
  • メッシュ: UVとノーマルにチェック。モディファイアーとタンジェントは必要があればチェック。
  • シェイプキー: シェイプキーの法線は必ずチェック
  • マテリアル: 画像をWebPにして画質を65~80くらいにしておくとインベントリ容量を節約できるかも?
  • アーマチュア: 「リーフボーン」は基本的につけなくていいです。アバター作者さんが適切に作ってくれているはずです。

alt text

重要
glbでインポートした際にはシェイプキーを動かした際に高確率で法線がおかしくなるので
メッシュのアセットを開いて、ブレンドシェイプの法線を取り除くブレンドシェイプの接線を取り除くを行いましょう。
(接線の方は必要無いかも?)

alt text

fbxでエクスポート

私がfbxでエクスポートする時の設定

  • パスモード: コピー
  • 内容: カメラやボックスが含まれないように設定してください。
  • スケールを適用: 「FBX単位スケール」にしてください。
  • 向き: -z が前、+y が上 です。
  • ジオメトリ: 「三角面化」はこの段階ではしない方がいいです。シェイプキーで動かした際の法線が崩れます。
  • アーマチュア: 「リーフボーン」は基本的につけなくていいです。アバター作者さんが適切に作ってくれているはずです。

alt text

モデルインポート

自分のスケールを 1 にしてインポートしましょう。

Blenderでちゃんとスケールを合わせているなら メートル でインポートしましょう。
fbxやスケールを合わせていない場合は ユーザースケール にしましょう。

アバターのアセットはオブジェクト内にいれましょう。

アバタークリエイター

アバタークリエイターの頭や手の位置は、ギズモやインスペクターでの数値入力で動かせます。 ドライブされているので動かせないと思いがちですが、普通に調整可能です。グラブして動かすよりも正確に移動・回転できるのでおすすめです。

動かしてもよい(Sliderがついている)スロットは以下の通りです

  • Headset
  • LeftHand
  • RightHand
  • Tooltip
  • Shelf
  • Grabber

alt text

ヘッドの位置は2つの丸い玉を基準に考えてください。 この2つの丸い玉の間がViewPointとなります。

  • 高さ: アバターの目に合わせる
  • 前後: 鼻先と同じくらいにする

これらが個人的なおすすめですが、好みが大きいので自分に合う位置を探してください。

もしヘッドの位置を変更後に、回転や中心が少しズレている気がしたら、もう一度アバタークリエイターの揃える系ボタンを押し直すと微妙なズレがきれいになります。

alt text

アバタークリエイターを小さくするとグラブエリアが小さくなり、物が掴みづらくなってしまいます。
基本的にアバタークリエイターのスケールは1にして、もし変えるとしても少し小さいくらいが良いでしょう(手の大きさを合わせる必要はありません)。

ツールの位置はデフォルトから変更しないことをおすすめします。 ツールの位置を変更してしまうとコントローラーに対するレーザーの位置や向きが変わってしまいます。アバターを着替えるたびにレーザーの位置や向きが変化すると直感的な操作が難しくなるため、基本的にそのままで、動かすとしても回転はいじらない方が良いです。

alt text

椅子で腰がひっくり返る

hipsボーンとspineボーンが十分離れていないと、椅子に座った際に少し頭を下げるだけで腰がひっくり返ります。

alt text

Blender等でhipsをspineから離しましょう。

元の位置:ほぼ重なっている状態

alt text

修正後:Blenderの編集モードでhipsボーンを少し下げます

alt text

これで、きれいに座れるようになります。

alt text

首が伸びる

何も設定していないとよく首が伸びてしまいます(伸びて見えるのは自分からだけかもしれません)。

alt text

アバタールートにある VRIKAvatar コンポーネントの HeadMaxFixDistance0.001 のように小さな値にします。 (画像では 1E-07 つまり 0.00000001 になっています。0 にしても良いと思います。)

こうすることで伸びなくなります。

alt text

足の接地

alt text

デフォルトのままだと足が地面にめり込んでいたり浮いていたりするので、ちゃんと接地するようにしましょう。

アバタールートに元々ついている LocomotionAnimationFeetMetrics というコンポーネントの FootHeight にチェックをつけ、適切な値を設定します。

alt text

足がグニャる

落下時やアバターを持ったときに足が頭の上まで上がってグニャることがあります

以下の値を設定します。

  • FeetHoverHeight: 0
  • MaxFeetVelocityOffset: 0.05 ~ 0.00 くらい (画像では 0.03)

alt text

移動アニメーション

LocomotionAnimationConfiguration コンポーネントを適当なスロットに「コンポーネントをアタッチ」から新しくつけましょう。

alt text

Gaits(list) の中に0, 1, 2, 3の計4つのパラメーターがあり、移動速度別に分かれています。 もっとも移動速度が速いときのパラメーターが 3 なのですが、この3のアニメーションは足が大股で動きすぎるため、削除することをおすすめします。

alt text

デスクトップモードでの指の自動モーションが気になるのであればそれもFloatingFingerCurlSwayMagnitude内の設定で修正できます

FloatingFingerCurlSwayMagnitudeの値を小さくしてください。

指先のタッチ判定位置

デフォルトでは指先のタッチ位置が関節にあることが多く、指を貫通させないとボタンが押せないことがあります。 (リーフボーンをつけるなどして指先に指の名前がついたスロットが存在すれば、自動で指先にタッチ位置が来ます)

このように指を貫通させないとボタンが押せません。

alt text

修正手順:

  1. 人差し指の TipTouchSource コンポーネントがついているスロットを探します。
  2. そのスロットの子供に新しくスロットを作り、指先に移動させます。
  3. TipTouchSource がついているスロットにあるコンポーネントを、すべて新しく作ったスロットに移動させます(コピーではなく移動)。

alt text

これで指先でボタンが押せるようになります。

alt text

レーザーのヒゲの奥行きを合わせる

アバターのスケールによって、レーザーのヒゲが出る位置が前後にズレてしまうことがあります。

アバターを着てスケールリセットした状態で位置を調整しましょう。 hand の中にある Tool Anchor のスケールを調整することでヒゲの位置が変化します。

alt text

調整すると、ちゃんと真横に出るようになります。

alt text

コライダー

アバターのコライダーは、掴む際はもちろん、以下のような様々な場面で使用されます。

  • 銃のあたり判定
  • トマト投げのあたり判定
  • アバターをよじ登る判定
  • 体に落書きするときの判定
  • 自動ドアの安全機能

そのため、しっかり設定しましょう。コライダーを可視化すると調整が楽になります。

また、アバターのコライダーは距離に応じて切り替わります。 アバターを着ている側のスケール基準で 2m以内 だと全身のコライダーがアクティブになり、2m以上 離れると全身を覆う1つのコライダーのみになり処理負荷の軽減が図られています。

後からコライダーを追加すると、離れた際にオフにならない場合があります。 もし追加した場合は、コライダーを rigCollidersEnabledStates に追加して、離れたらオフになるように設定しましょう。

こちらのサイトで詳しく解説されています。

調整前:腰コライダーが小さかったり、手のコライダーが傾いていたりします。外側のコライダーも少し大きすぎます。

alt text

調整後:いい感じです。

alt text

スカート貫通

Resoniteで貫通対策を完璧に行うのは大変なので、比較的簡単にできる方法を紹介します。

しゃがんだ時に、スカートが足に当たって持ち上がってしまう現象です。

alt text

これは、大きなボーンコライダーを足につけることで対策しています。

alt text

また、横のスカートが足より内側に来ないように、このようなコライダーもつけています。

alt text

ボーンを掴んだり伸ばしたりできるように

アホ毛を引っ張ったり、スカートをめくったりしたいですよね。

alt text

  • 掴めるようにする: DynamicBoneChain コンポーネントの IsGrabbable にチェックを入れます。
  • 伸びるようにする: MaxStretchRatio を1以上に設定すると、その分だけ伸びるようになります。

掴めない場合は、VisualizeColliders にチェックをつけてコライダーの球体が小さすぎないか確認してください。コライダーの半径を設定する項目もあります。

alt text

アイトラッキング

目が既にキョロキョロ動いているのなら、視線に関しては特に難しい設定はなく動くはずです。 EyeRotationDriverMaxSwing で目の可動範囲を自然な値に設定しましょう。

瞬きは、両目同時に閉じるシェイプキーを使うと片目閉じができません。左右に分かれているものを使いましょう。

設定例:

  • EyeLinearDriverEyes(list) をAddで増やし、LeftRight の2つを用意します。
  • OpenCloseTarget に左右の目閉じシェイプキーをそれぞれ設定します。

alt text

両目閉じしかなくても、Resonite内でシェイプキーを左右に分割することが可能です。 SkinnedMeshRenderer の目的のブレンドシェイプの左側の三本線をクリックし、メニューから ブレンドシェイプをX軸で分割 を選択してください(左右がX軸のアバターの場合)。

alt text

フェイシャルトラッキング

アバタークリエイターで「フェイストラッキングをセットアップ」にチェックを付けていれば、あいうえお(Viseme)に関しては自動で設定されます。

チェックし忘れていた場合は、AvatarMouthDataSourceAssigner コンポーネントを付け、TargetReference に元々ついている DirectVisemeDriverMouthTrackingSource の項目名を掴んで入れてください。

alt text

alt text

舌や頬の動きなど、あいうえお(Viseme)以外を動かしたい場合はIMouthTrackingSourceComponentコンポーネントを付け、一つ一つシェイプキーを割り当てましょう

以下が解説ワールドです
(Resonite起動中にリンク先のOpen Worldクリックでワールドが開く)

FPSと距離に応じて軽量化

DynamicBone は計算負荷があり、FPSが低くなると荒ぶることがあります(大人数の集合写真などでスカートや髪が痙攣したように震える現象)。

そのため、ValueGradientDriver<bool>ValueMultiDriver<bool> を組み合わせて、一定以下のFPSになったら DynamicBoneChain コンポーネントのEnableが切れる ように設定しましょう。

余裕があれば、Enableが頻繁に切り替わって負荷が増えないように ヒステリシス制御(例:20fpsまで下がったらOFF、25fpsまで上がったらONというように、行き帰りで切り替え地点を変える制御)を導入しましょう。 BooleanValueDriver<float>ValueGradientDriver<bool> のPositionをドライブして、BooleanValueDriver<float> のstateを ValueMultiDriver<bool> でドライブすることで実装できます。

動作例: 見ているユーザーのFPSによってDynamicBoneのON/OFFが変化します。

alt text
alt text

距離でのON/OFFも実装したい場合はさらに複雑になるので、参考アバター(つみれちゃん)を分解して確認するかMarkNに聞いてください。

alt text

LOD

画面に対して表示しているメッシュのバウンディングボックスの大きさの割合が一定以下になったら、表示を消す機能です。

アバターが画面の数ピクセルにしか映っていないのに、時計や指輪などを律儀に描画するのは計算資源の無駄ですし、チラチラ点滅してしまいます。ある程度小さくなったら見えなくなるようにしましょう。

設定方法:

  1. LODGroup コンポーネントをつけます。
  2. LODs(list) でAddを押し、Renderers(list) に制御したいレンダラーを入れます。
  3. ScreenRelativeTransitionHeight の値を、レンダラーを消したい値に設定します(例:画面の高さの1%以下になった時に消したければ 0.01)。

詳細はこちらの記事を参考にしてください。

バウンディングボックス

バウンディングボックスはLODの計算や、そのメッシュが視界に入っているかどうかの計算に使用されています。 ボーン一つ一つの動きをリアルタイムに計算すると負荷が高くなるので、できるだけ数を少なく、計算回数も減らしましょう。ただし、スキンドメッシュが変形する範囲よりも小さくしてしまうと、目に映っているのに描画されないなどの問題が起きるので注意が必要です。

注意: 現在(2025年12月4日時点)、スキンドメッシュレンダラーのバウンディングボックスの計算にバグがあるらしく、設定が正しく動作していません。デフォルト設定では正しく動作していそうなのですが、いくつかの設定がおかしくなっています。 (まだIssueを書いていないので、誰か書ける人はお願いします。)

そのため、現在は BoundsComputeMethod の手動設定は行わずに デフォルトの static のまま にしましょう。 本来は ProxyExplicit などに設定して最適化することが望ましいのですが、バグが直るまでは static 推奨です。

alt text

表情切り替え

StandardController ノード系を使用した表情設定(表情設定ツールなど)は便利ですが、今のResoniteで軽さを求めるなら AvatarRawToolData コンポーネントを使いましょう。

StandardController Fluxノードと AvatarRawToolData コンポーネントを esnyaさんのMOD ResoniteMetricsCounter で比較すると、Fluxの方が30倍ほど計算時間が長いです。

5000個複製した際のFPSやRenderTimeの比較

コンポーネント 283 FPS

alt text

Flux 14 FPS

alt text

圧倒的な差があります。比較に使用した実装は以下の通りです。

コンポーネントAvatarRawToolDataからValueFealdValueCopy

alt text

Flux (FluxでValueFealdにドライブ)

alt text

実装方法

AvatarRawToolData の使い方は簡単で、コンポーネントをつければアバターを着た際にコントローラーの値がそこで取得されます。 ただし使用できるのは以下の5つのみです

  • Primary <bool>
  • Secondary <bool>
  • Grab <bool>
  • PrimaryStrength <float>
  • SecondaryAxis <float2>

alt text

これらの値をFluxでシェイプキーにドライブするか、以下のように制御しましょう。

  • MultiBoolConditionDriverBooleanValueDriver<float> を使用
  • ロジック例:「Primary false & Secondary false & Grab true の場合、このシェイプキーを1にする」
  • SmoothValue などを組み合わせると滑らかになります。

alt text

Fluxとコンポーネントでこれだけ差があるのはバグの可能性が高いそうなので、誰かIssueを書いてください。

未使用ボーン・シェイプキー削除

ボーン削除

Bone(list) に入っているボーンが多いと読み込みに時間がかかります。未使用のボーンはボタン一つで削除できるので整理しましょう。 SkinnedMeshRenderer の下部にある 空のボーンの除去 ボタンを押してください。

alt text

シェイプキー削除

シェイプキーも数が多いと読み込みに時間がかかります。 SkinnedMeshRenderer の下部にある 使用していないブレンドシェイプを除去 ボタンを押して削除しましょう。

alt text

メッシュベイク

アバターに SkinnedMeshRenderer が複数あると、それだけドローコールが増え、処理に時間がかかります。普段使いするアバターはメッシュをベイクしてまとめましょう。

注意: 現状のResoniteでは、顔のようなシェイプキーが多いメッシュを体とまとめてしまうと逆に重くなる場合があるらしい(未検証)ので、「顔」と「顔以外」のように分けるのがおすすめ です。

手順:

  1. グルーツールを スキンドメッシュをベイク のモードにします。
    alt text
  2. ベイクしたいメッシュを一つのスロットの子供にまとめ、親スロットを掴みながらセカンダリを押します。
    alt text
  3. ベイクをするとメッシュのアセットが別物になるので、DevToolの「新規作成」→「アセット最適化ウィザード」を出します。
    alt text
  4. リファレンスにアバタールート(またはAssetスロット)を入れて 使われていないアセットを削除 を実行します。
    alt text
  5. このままだとベイク後のアセットがルートのAssetsスロットに出てしまうので、ベイクした SkinnedMeshRendererMesh の中身を掴んで、アバターのAssetsスロットの適当な場所に移動しておきましょう。

マテリアル

できるだけまとめましょう。 アバターによっては同じテクスチャなのにパーツ毎にマテリアルが分かれていたりするので、特別な理由がない限りは統合します。

  • マテリアルの種類: 可能ならPBS系の不透明Opaqueを優先して使いましょう。常時発光部にはUnlitを使います(光のあたり具合を計算する必要が無いから)。アニメ調にしたい箇所のみXiexeToonにしましょう。
    XiexeToonの解説記事

  • BlendMode: 透過テクスチャを使っているマテリアルもできるだけ Cutout にし、どうしても半透明にしたい箇所のみ Alpha にしましょう。

テクスチャ

テクスチャの最適化はグラフィックボード(GPU)のVRAM(メモリ)使用量に直結するので積極的に対処しましょう

インポート前に画像を圧縮しても自分のストレージを節約できるだけで、GPUへの負荷はほとんど変化しないことに注意してください

解像度

自分が許容できるギリギリまで解像度を低くしましょう。 再調整 の左にリサイズしたい解像度の長辺を入力して 再調整 を押します。

alt text

アルファ除去

アルファを使用していないテクスチャはアルファの除去を行いましょう。 同じように見えるテクスチャでも、アルファ情報を消すだけでVRAMの使用量をかなり削減できます。

テクスチャアセットの下部にある アルファを取り除く ボタンを押してください。

alt text

効果:

  • アルファ除去前: 21.33MB(圧縮形式がBC3)

    alt text

  • アルファ除去後: 10.67MB(圧縮形式がBC1)

    alt text

最適化前とFPS比較

普通にインポートして、MaterialとDynamicBoneと表情設定を行ったアバターと
今回紹介した最適化を行ったアバターを101体出して比較

FPS比較

条件最適化前最適化後
近距離視界内31 fps79 fps
近距離視界外46 fps91 fps
60m視界内32 fps103 fps
60m視界外45 fps212 fps

alt text
nanobananaにグラフ作ってもらった

最適化前スクショ

最適化前のFPS測定結果
alt text
alt text
alt text

最適化後スクショ

alt text
alt text
alt text
alt text

更新履歴

  • 2025年12月4日 公開
  • 2025年12月5日 タイトル変更・項目順序変更・微修正多数
  • 2025年12月5日20:00 Blenderからglbでエクスポートした際の解説追加・おすすめ記事追加
  • 2025年12月6日 fps比較追加・画像まわりの処理を修正(内部の話)・その他微修正

この記事を共有する

Xでポスト

おすすめの記事

【Resonite】アバターインポート&セットアップ実演解説! のサムネイル

【Resonite】アバターインポート&セットアップ実演解説!

VRMアバターのインポートとアバターのセットアップを、実演を交えながら分かりやすく解説します。Resoniteは最新のソーシャルVRプラットフォームで、VRの中であらゆるものをその場で創作・共有できま …

Resonite 解説 アバター
Resonite Headless webUI

Resoniteヘッドレスサーバーをブラウザで簡単管理!「MarkN Resonite Headless Controller」を公開しました

こんにちは、「まーくん。(MarkN)」です。 Resoniteのヘッドレスサーバー、便利ですよね。常設ワールドを立てたり、フレンドがいつでも入れる場所を提供したりと、様々な活用法があります。 た …

Resonite 作ったもの プログラミング 解説
Google Apps Scriptのロゴと、翻訳をイメージさせる吹き出しや地球儀のアイコンを組み合わせたもの。背景にうっすらとプログラムのコードが見えるデザイン

超簡単!GASで作る無料翻訳APIの作り方

「自分だけの翻訳APIを、無料で簡単に作れたら便利だと思いませんか? 実はGoogleアカウントさえあれば、プログラミングの経験がない方でも、意外と手軽に自作できるんですよ。外部サービスの契約やサー …

作ったもの Resonite 解説 プログラミング
竹あかりを作るアイテム

竹に穴を開けるアイテムを作った「竹あかり」

「ちょっぱや!バーチャル竹あかり」というイベントで使用された、竹あかり制作アイテムを作りました このアイテムを使うと、VR内で竹を丸鋸で切断して、ドリルを使って好きな場所に穴を開けたて、オリジナルの竹 …

作ったもの プログラミング Resonite おすすめアイテム イベント
合成音声Style-Bert-VITS2の学習方法 のサムネイル

合成音声Style-Bert-VITS2の学習方法

この記事では、Style-Bert-VITS2 をインストールして学習してモデルを作成するところまでを解説します。 注意事項 Windows対象 Nvidia製GPUが必要(RTXシリーズなど) 保存 …

AI 解説 プログラミング
NASA Space Apps Challenge 2025で最優秀賞を受賞しました! のサムネイル

NASA Space Apps Challenge 2025で最優秀賞を受賞しました!

NASA Space Apps Challenge 2025で最優秀賞を受賞! こんにちは、MarkNです。2025年10月に開催された「NASA Space Apps Challenge 2025」 …

Resonite イベント