NeosVR内でのアバター着せ替え手順

この記事はNeosVR Advent Calendar 2021の12月2日の記事です。

adventar.org

NeosVR Advent Calendar 2021 1日目の担当は二酸化カメレオンさんで「最速で学ぶLogix入門」でした。まだ読めてないのですが、きっとLogiXを完全に理解できる記事なので後で読みます。3日目の枠はkazu0617さんで、何か動画を出してくれるそうです。楽しみですね。

2022/12/07追記

この記事の最新の手順でまとめ直した記事をネオスサーチにて書きました! そちらを見てください~

www.neossearch.com

初めに

アバターの服を着せ替えたい。」そう思ったこと、一度はありますよね?

専用服であればNeosVR内で簡単に着せ替えが可能です。専用服じゃなくても、頑張ればNeosVR内で行えます*1
この記事ではその手順を実例を挙げて紹介します。

今回着せ替えするアバターと服

今回は次のアバターと服を例に説明します。なお、作業途中の服やアバターは適宜保存しましょう。

komado.booth.pm sugary-boutique.booth.pm

[方法1]: RigTransferTipを使う方法

RigTransferTipというのはアバターのRigやMeshを別のアバターにコピーする公式ツールのようです。
同じスロット名のSkinnedMeshRendererのメッシュを上書きして、足りないボーンを付け足すTipっぽいです[※要出典]。誰か詳しい使い方をまとめて……。
開発者の動画を(機械翻訳で)ざっと見たところ、セットアップ済みのアバターに外部で変更を加えたメッシュなどを適用させるときに使えるやつらしいです。
今回のような着せ替え用途の場合、服のスケールやボーン構造がアバターと似通ってないと使えないと思われます(※未検証)。上手く行かなかった場合は「[方法2]: 服のボーンをアバターのボーンの子にする方法」で着せ替えを行ってください。

youtu.be

手順概要

  1. 服のモデルをインポート
  2. アバターのメッシュを外出し
  3. 服を複製して一つをアバターの子に入れる
  4. RigTransferTipで服の設定をコピーしてアバターに適用して服本来のボーンを削除
  5. 外出ししたアバターのメッシュを戻す

服のモデルをインポート

服の3Dモデルをインポートします。fbxファイルなどをNeosVRのゲームウィンドウにドラッグ&ドロップ、またはファイルブラウザから選択します。
インポーターでは、通常のアバターの3Dモデルと同様に3Dモデル→レギュラー/アバターヒューマノイドの身長に自動設定→高度な設定を選択します。
高度な設定では、アバターインポート時とは異なり「IKをセットアップ」のチェックを外しましょう。その他の設定はアバターインポート時と同じで構いません。

IKのセットアップをせずにインポートします

今回セットアップするアバターと服

再配布が禁止されている服の場合、他の人が保存できないようにするために服のルートスロットとメッシュのスロットにSimpleAvatarProtectionに付けましょう。
それぞれのスロットを選択して、コンポーネントをアタッチからUsers/Common Avatar System/SimpleAvatarProtectionをひとつずつ設定します。

SimpleAvatarProtectionの設定方法。ルートスロットとすべてのメッシュのスロットに付けるとよい。

以後の手順が失敗しても大丈夫なように、この段階でアバターや服をインベントリに保存しておきましょう。

アバターのメッシュを外出し

RigTransferTipによるコピーでは、アバターの子に入ってるSkinnedMeshRendererのスロットが対象になります。
アバターの素体や標準服が変更されてしまわないように、一旦アバターの外にSkinnedMeshRenederの付いたスロットを出してあげます。

アバターのインスペクターを開いて、RootNodeのようなSkinnedMeshRendererの付いたスロットがまとめられてる親スロットを選択します。 RootNodeのインスペクターを新しく開いて、「子にする:ワールドルート」ボタンを押してアバターの外にスロットを取り出しましょう。
これ以降はアバターの位置を動かすと、最後にRootNodeをアバターに戻すときに変な場所になってしまう可能性があるので、動かさないように注意しましょう。また、RootNodeのインスペクターは戻すときにも使うので、開いたまま置いておきましょう。

ルートスロットにメッシュのスロットらを取り出す。このとき、ボーンが一緒に移動しても問題はない。

服を複製して一つをアバターの子に入れる

RigTransferTipでコピーする元となる服のモデルと、コピーを適用させる服のメッシュが必要になるので、服を複製します。
うち1つをアバターの子に入れて、位置・回転・拡大/縮小のリセットを行い、GrabbableコンポーネントとRigコンポーネントを削除します*2(※複製したもう一方の服のモデルの方のRigコンポーネントを削除すると上手く着せ替えできないので注意)。
※拡大/縮小のタイミングで服のモデルが小さくなりすぎたり大きくなりすぎたりした場合は、おそらくこの手順では着せ替えは成功しません。上手く着せ替えが出来なかった場合は[方法2]の手順での着せ替えをしてください。

位置・回転・拡大/縮小のリセットと不要なコンポーネントの削除

RigTransferTipで服の設定をコピーしてアバターに適用服本来のボーンを削除

Essential Tools/MiscからRigTransferTipを取り出して装備します。

RigTransferTipはNeos Essentials/Miscの中にある白いチップ。

RigTransferTipを装備した手で、複製したまま何もしてない服のモデルに向かってセカンダリー(スティック押し込み、タッチパッド押し込み、Rキーなど)をします。
RigTransferTipの上部に表示されてるテキストに服のモデルが登録されたのを確認したら、次にアバターに向かってトリガー(プライマリー、クリック)をします*3

メッシュとボーンがアバターにコピーされました。Neos謎技術のチカラです。

RigTransferTipの上部にコピー元の服のモデル名が乗った状態で、アバターに向かってトリガーして転送。

アバターの子に入れた服のモデルの中に、服本来のボーンが存在しますが、邪魔になるので削除しましょう。

服のボーンを削除

外出ししたアバターのメッシュを戻す

避難しておいたアバターのSkinnedMeshRenderのスロットをアバターの子に戻します。
開いておいたRootNodeのインスペクター*4から、アバターの元の場所に戻しましょう。

RootNodeを元のCenteredRootの中に戻す。

その後、新しい服と標準服との両方が表示されているので、標準服のメッシュを非アクティブのスロットの中にまとめて非表示にします。 新しいスロットを作成してActiveをオフにし、非表示にしたい標準服をそのスロットの中に移動させます。

RootNodeの子スロットを作成してActiveをオフにし、隠したいメッシュのスロットを移動させる。

完成

以上の手順完成です。一旦保存した後、インベントリから取り出したり着てみたりしてうまく出来てるか確認しましょう。上手く出来てなかった場合は手順をやり直すか、方法2で着せ替えをしましょう。

着せ替え完了

[方法2]: 服のボーンをアバターのボーンの子にする方法

こちらは手作業での服の着せ替えになります。他のVRサービスのためにUnityで着せ替えをやるときと同じように、アバターのボーンに服のボーンを入れ子にしていく作業です。
こちらの方法は手間が多いですが、専用服じゃなくても対応できると思います。専用服じゃない場合は細かい調整が必要になると思いますが、今回の記事では特に解説しません*5
人力作業になるので、途中でミスったり作業過程を忘れたときでも復元できるように、途中途中でバックアップを保存するようにしてください。

手順概要

  1. 服のモデルをインポート
  2. アバターの直下に入れてサイズ・位置合わせ
  3. 服のボーンを対応するアバターのボーンの子に入れる

服のモデルをインポート

方法1のときと同じやり方でインポートします。

こちらの手順の場合、揺れものはインポート直後のこのタイミングで設定しておくと良さそうです*6

サイズ・位置合わせ

セットアップ済みのアバターを用意します。デフォルトの状態だとアバターがゆらゆら動いてて着せ替え作業の邪魔になるので、TポーズやAポーズで固定させます。
DevToolTipでアバターのインスペクターを開いて、アバターのルートスロットを選択します。VRIKコンポーネントを探して、IKPositionWeightが1になってるはずなので0にしましょう。これでTポーズまたはAポーズで固定されます。

※注意:この状態でアバターを着てしまうと、手が全く動かせなくなってリスポーンするしかなくなります(ダッシュメニューの操作は可能です)。ダッシュメニューでのリスポーン方法や緊急リスポーンジェスチャーを覚えておくか、他の人がいる場所で作業しましょう。作業途中のアバターを着た状態で緊急リスポーンをすると、アバター自体が失われるので、間違って着てしまったときのために作業途中のアバターはこまめに保存しましょう。
アバターを着る際にはIKPositionWeightを1に戻しましょう。

VRIKのIKPositionWeightの場所。0にするとポーズが固定される。

次に、服のモデルをアバター直下に入れて、サイズ調整をします。
アバターのルートのインスペクターと服のインスペクターを開いて、服のスロットをグラブしてアバターのスロットの直下に移動します。
その後、位置・回転・拡大/縮小のリセットボタンを押して調整します。
また、この時点でGrabbableコンポーネントは邪魔になるので削除しておきましょう。

位置・回転・拡大/縮小のリセットと不要なコンポーネントの削除

その後、スケールを調整します。専用服なら基本的にはスケール1で大丈夫だと思いますが、アバターや服によってはスケールが100倍や0.01倍になっていたりするのもあるので、大きすぎたり小さすぎたりしたら0.01や100を入れて適宜調整してください。
また、複数アバター対応のために個別で指定されているものもあります。 今回の服は説明書きにスケール0.965と指定があるので、それを入力します。

スケールの入力。今回は0.965。

その後、服のArmatureをアバターのArmatureの子に入れて、位置をリセットします。※拡大/縮小はリセットしないように。
もし服の位置がズレてたり思ってたのと違う場所にあれば、DevToolTipを装備してギズモを動かして調整しましょう。
このときに着せ替え前の服が邪魔で細かいところが見えなくなると思うので、邪魔な服はActiveをオフにしておきましょう。新しくスロットを作ってActiveをオフにして、その子に不要な服のメッシュを入れると簡単です。

標準服のメッシュを非表示に。服のArmatureを移動。

服のボーンの移植

あとは作業です。服のArmatureの各ボーンを、対応するアバターのArmatureのボーンの子に一つずつ入れていきます。
服のHipsをアバターのHipsの子に、服のSpineをアバターのSpineの子に……といった手順で入れ子にするだけです。
※この作業をやる前に一度アバターを保存しておくことをオススメします。作業途中でよくわからなくなったときに復元できるので。

同名のボーンを入れ子に。Hips→Chest,UpperLeg_L,UpperLeg_Rのような分岐がある場所はUpperLegやShoulderなどの四肢のボーンからやる方がやりやすそう。

完成

以上の手順で着せ替えは終わりです。最後に、VRIKのIKPositionWeightを1に戻してからアバターを着たりしてみて確認します。
もし服の一部が変な場所に吹っ飛んでしまってる場合は、ボーンの移植が上手くできていません。再びIKPositionWeightを0にしてから問題のボーンを移植してください。

宣伝

アバターセットアップ関連のお手伝いをする活動を #NeosVR着付けフォース としてやっています。
今回の記事の内容やアバター関連の質問などでも何かしらお手伝いをしますので、お気軽にお声がけください。

[おまけ]: 関連Tips

空のボーンの削除

服のモデルにはHumanoidボーンの必要な部分がHipsの位置から入っていることが多いですが、実際に服のメッシュのウェイトが乗っていないボーン*7も含まれています。
服のボーンの移植をする前に、SkinnedMeshRendererの「空のボーンの削除」ボタンを押すと、ウェイトが乗っていないボーンの参照を削除できます。服の着せ替えに必要なボーンはこの操作で残ったボーンだけなので、不要なボーン数を減らせます。

空のボーンの削除で必要なボーンだけがわかる。このリストに乗っていないボーンは不要。

専用服のボーンを使わずに、アバターのボーンを使う

RigTransferTipで行っていることを手作業でやろうとする方法です。RigTransferTipを使用するほうが簡単ですが、こういうこともできるよと教えてもらったので書いておきます。

上記の空のボーンの削除を行った後に、服のモデルのウェイトが乗っているボーンをアバターのボーンに差し替えます。
服のArmatureの位置合わせを気にしなくてもよくなりますが、元のアバターに無かったボーンは正しく移植させる必要があります。
あとたぶん服のモデルとアバターのモデルのスケールが一致してないとうまくいかなそうです(※未検証)。

手作業でやる場合、服のメッシュが少ないのであれば[方法2]よりこちらの方が簡単だと思います。
入れ替えを行った後に、服のArmatureを削除して入れ替え忘れが無いか確認するのがわかりやすそうです。※削除する前にはアバターを保存しておいて復元できるようにしておきましょう。

アバターのRigで服のボーンを差し替え。

AFKマテリアルの設定方法

Neosではユーザーが別のセッションへ移動したときに、そのユーザーの抜け殻が透明のマテリアルに変更されます。
上記手順での着せ替えによって持ち込んだ服にはその設定が付いていないため、
アバターの素体は透明なのに服は通常というエッチ変な状況になってしまいます。

服のマテリアルも変更する手順は次の通りです。

服のメッシュのスロットを開いて、コンポーネントをアタッチからUsers/SimpleAwayIndicatorを設定します。
AwayMaterialには他のメッシュと合わせて、アバター直下のPBS_RimMetallicを設定し、Rendererには服のSkinnedMeshRendererを設定します。 次に、Head ProxysなどにあるAvatarUserReferenceAssignerの項目をaddしてSimpleAwayIndicatorのUserをセットします。
これを全てのメッシュに設定します。

SimpleAwayIndicatorに必要な参照をセットする。UserはAvatarUserRefenceAssignerを使う必要がある。

設定は以上です。最後に設定が正しくできてるか確認をします。
DevToolTipの新規作成から、エディター→ユーザーインスペクターを選択します。
出てきたユーザーインスペクターで自分の名前を選択し、presentInWorldをオフにします。
するとAFK状態のときの自分の様子が確認できるので、設定漏れが無いかの確認に使ってください。

ユーザーインスペクターのpresentInWorldでAFK偽装できる。設定忘れを確認しやすい。

服の切り替え

デフォルトの服と追加服を随時切り替えたい。そう思ったこと、一度はありますよね? 仕組みはシンプルです。切り替えをしたい服のメッシュを下記の構造のSlotにまとめます。

Cloth
 ├服Aをまとめたスロット
 │ ├服Aのメッシュ1(上着)
 │ ├服Aのメッシュ2(スカート)
 │ └服Aのメッシュ3(靴)
 └服Bをまとめたスロット
   ├服Bのメッシュ1(上着)
   ├服Bのメッシュ2(スカート)
   └服Bのメッシュ3(靴)

上の状態で、ClothのスロットにコンポーネントをアタッチからTransform/Drivers/BooleanSwitcherを追加します。 AutoAddChildrenにチェックを入れると、ActiveIndexに指定されてるindexのスロットだけActiveがオンになり、他のスロットはActiveがオフになります。

BooleanSwicherによって複数のスロットのActiveのうち1つだけ有効にできる。ActiveIndexのスロットのActiveだけが有効。

あとはNeosButtonなりコンテキストメニューなりハンドサインなりで、このActiveIndexを切り替えるようにできれば着せ替えは完了です。
Buttonコンポーネントが付いているスロットにCommon UI/Button InteractionsにあるButtonValueShiftやButtonValueSet
BooleanSwitcherのActiveIndexを操作するのが手軽だと思います。
yoshi1123_ publicの中に実装サンプルを置いているので、使ってみたい方は試してみてください。 neosrec:///U-yoshi1123-/R-e9b350ec-e5c4-418e-a511-997086a8edea *8

*1:※専用服じゃない場合、Blenderでの着せ替えができる方はそちらでやった方がたぶん簡単です。ぼくはBlenderで着せ替えしたことないのでよく知りませんが。

*2:RIgTransferTipはRigコンポーネントの情報を別のRigコンポーネントの付いたオブジェクトに転送する挙動のようです。今回の着せ替えのでは、アバターの子に入れた服のメッシュをアバターのRig配下と誤認させるために、服のRigコンポーネントを削除しています。

*3:RigTransferTipの適用は、厳密には「アバターのボーンに向かって」トリガーをする必要があります。今回の手順では、アバター本来のボーンは一旦アバターから避難しているため、代わりにアバターの子になっている服のボーンに向かってトリガーをする必要があります。位置のリセットをしていない場合は適用箇所がズレている可能性があるので注意してください。

*4:もしRootNodeのインスペクターを残しておかなかった場合は、Rootスロットのインスペクターを開いて探してください。

*5:専用服以外を着せる場合、入れ子にした後に服のボーンの位置やサイズをいい感じに調整したり、貫通対策をしたりするだけです。それが面倒ですが。

*6:アバターの子に入れたあとにDynamicBoneの設定をしようとすると、「子にしたもののリグのみセットアップ」のボタンが使えません。「子にしたものをセットアップ」ボタンを押すと、Collider用のスロットが入ってた場合に変になるかもしれないです。もちろんDynamicBoneの設定からColliderのスロットの設定を外せば問題無いので、誤差の範囲ではあります。

*7:アバター制作をしたことがないので、用語の使い方が間違っていても許してください。

*8:このURLをコピーした後に、NeosVR内のホーム画面の「クリップボードから貼り付け」ボタンを押すとパブリックフォルダが出てくる