見出し画像

Blenderパワーで非対応服を着せ替えする Part 2

さあ後半戦です。前半を読んでない方はこちらからどうぞ。

今回はPart 2ということで服が身体のボーンに追従して動くように設定していきます。そのために、まずはボーンの仕組みについて少しお勉強しましょう。

ボーン構造の仕組み

皆さんなんとなく分かっているかもしれませんが、ボーンを動かすとそれに対応したメッシュが動きます。これは一体どういう仕組みなのでしょう?
結論から言うと、

  • Armature Modifierを適用する

  • ボーン名称と同じ名前の頂点グループを作り、ウェイトを塗る

この2つをメッシュに対して行うと、ボーンと関連付けられて動くようになります。(これは Blenderでの話なので、Mayaなど他のソフトでは設定方法も異なります。)

Armature Modifier

まず、メッシュにArmature ModifierというModifierを追加します。その中にある Object で追従させたいArmatureを選ぶとそのArmature下のボーンと関連付けられます。画像では OffShoulderT_Inner というメッシュがArumature.001に関連付けられています。

Armature Modifier

頂点グループ(Vertex Group)

もう一つの仕組みが頂点グループというものです。その名の通り頂点の集まりに名前をつけた物を頂点グループと呼びます。メッシュを選択した状態で、右下のObject Data Propatiesを見ると、そのメッシュにどんな頂点グループが設定されているか見ることができます。

頂点グループ

頂点グループにはウェイトという概念があり、頂点の動きはウェイトの大きさによって変わります。ウェイトの最大値は1、最小値は0です。頂点グループ自体はボーンとは別の概念なのですが、ここで頂点グループにボーンと同じ名前をつけると、対応したボーンの動きとウェイトに対応した量、メッシュが動くようになるわけです。たとえば、上腕のボーンを90°回転させた場合、ウェイト1で塗られたメッシュは同じく90°回転しますがウェイト0の部分は動かない、そんな感じです。
ウェイトは各頂点1点1点がパラメータとして持っています。しかし当然ですが、普通のアバターでも何万とある頂点1点1点を選んで1つずつウェイトの数値を調整する…なんて現実的ではありません。そこでウェイトペイントと言って、ペンで色を塗るようにウェイトを設定できる機能があります。ちょっと試してみましょう。オブジェクトモードで適当なメッシュを選択して左上のメニューまたはCtrl+Tab長押しからウェイトペイントを選択します。

ウェイトペイントを選択

ここでは素体のメッシュを選択してみました。すると選んだメッシュが青や赤の色で表示されたと思います。ウェイトの塗られていない部分(ウェイト0)が青、ウェイト1が赤、黄色や緑はその中間です。
なお、ここで重要なポイントなのですが、このウェイトというのは相対値です。つまり、ある頂点に1つの頂点グループのウェイトしか存在しない場合、そのウェイトが1でも0.1でも同じことです。また、ある頂点のウェイトが

  • Hips 0.3

  • Spine 0.2

となっていた場合、実際の動きは

  • Hips 0.6

  • Spine 0.4

となります。(和は常に1となる)
これを知らずに適当に進めると、ウェイト塗りで大変な沼に浸かることになります(なりました)。ウェイト調整についてはこの後触れますが、もし自分でがっつりウェイト塗りをする場合は、この仕組み(詳しくは、「ウェイト 正規化」などで調べてみてください。)を理解してから進めることを強く推奨します。

右下のObject Data Propatiesから頂点グループを適当に選んでみると、色のつく部分が変わるのがわかるかと思います。後で触れますが、例えば服とアバターの関節位置が合わない、あるいは曲げたときに貫通する(とてもよくある)などの問題が起きたときはここでウェイトを塗り直してあげればうまくいくわけです。

服を身体のボーンに追従させる

さて、仕組みがわかったところで作業に入っていきましょう。やるべきことは大きく3つです。

  • Armature Modifierで関連づけるオブジェクトを身体の Armatureに変更する。

  • 頂点グループをアバター側に合わせる

  • ボーンとメッシュをアバター側の階層に統合する

Armature Modifier

1つ目は、簡単ですね。Armature ModifierのオブジェクトがArmature.001とかになっているのをアバター側の Armatureの名前に合わせます。終わり。
ここでは「Armature」に変更すればOKですね。

Armature ModifierのObjectを変更

頂点グループをアバター側に合わせる

2つ目は、少々面倒です。
というのも、先程頂点グループとボーンの名称を一致させると動くと言いましたが、ボーンの名前は作る人によって違います。L,Rなどの記号をどこにつけるかも違ったりします。

1つの方法は、服側の頂点グループの名前を1つずつ変えていく方法です。アバター側のボーン名称に合わせてあげればokです。少々手間ですが、とりあえずこちらが簡単です。今回のように半袖とショーパンの場合は、関係してくるボーン数も少ないので手間も少ないです。欠点として、服とアバターの相性によっては関節位置などが合わずに破綻する場合があります。服のボーンのウェイトはあくまで対応アバターのボーンに合わせて塗られています。そしてボーンの位置や大きさは当然アバターごとに違うので、名前を変えるだけであらゆる姿勢に対して貫通などの破綻なく対応するのは難しいです。それを直す場合は個別にウェイトを塗り直すことになります。

2つ目の方法は、服に付いているウェイトは使わず、ウェイト転送という方法で自動でウェイトを塗る方法です。この方法を使うと関節位置が合わないなどのトラブルがなくなりますが、大抵自動ウェイトだけだと全てうまくはいかないので、手動でウェイト塗り直しが必要になる可能性が高いです。
つまり、どっちの方法でも完璧にするなら自分でウェイトを塗る作業は必要です。とりあえず、名前を変えていく手法の方が簡単である程度うまくいく場合が多いので、名前変更がおすすめです。クオリティを求める場合は、ウェイト転送してから自分で細かいウェイトを調整する方が良いと思います。結局自分でウェイトペイントするなら到達点は一緒ですが、塗りなおし前提なら転送したほうが楽だと思います。

頂点グループの名前を変える

では、1つ目の手法である頂点グループの名称変更を解説します。
まず、もともとの頂点グループの名前を確認します。Hips, Spine, Chestなどはたいてい同じはずです。

服側の頂点グループ

対して、アバター側は素体の頂点グループを確認してみます。素体側は腕から指、足まですべて含まれているので数が多いですね。
名前を突き合わせてみると、Hips, Spine, Chest, Shoulderは同じ名前ですが、  Upper Arm と Upper_arm はアンダーバーの有無と大文字小文字が違うことが分かります。

アバター(素体)側の頂点グループ

今回はUpper ArmとUpper Legだけ名前を変えればよいことが分かりました。簡単ですね。
今回はいじるところが少なかったので、別の服を見てみましょう。こちらは服の方にも指などを含めたすべての頂点グループが入っています。ここから実際にウェイトの塗られている頂点グループを探し出して名前をチェックしないといけないので少々手間ですね。また、こっちは名前も大文字小文字の違いがあるため直す部分が多いです。ちなみに、指の頂点グループなど、頂点グループはあるが服にウェイトが塗られていないものに関しては、関係ないので削除してしまっても問題ありません。

全ての頂点グループが入った服

服によってこのあたりの作りは違うため、難易度は異なりますがやることは一緒です。服側の頂点グループの名前をアバター側のものにあわせて1つずつ変更していきましょう。この時名前がちゃんと設定出ているかは、ポーズモードで動かしてみればわかります。

ウェイト転送を使う

もう一つの方法として、ウェイト転送でウェイトを塗りなおす方法についても見ていきましょう。
ウェイト転送を使う場合、頂点グループも転送元のものがコピーされるため、先に服側についている頂点グループを削除します。ここで消しておかないと、元の頂点グループに加えて転送された頂点グループが全て登録されるので、似てるけど微妙に違う名前の頂点グループが2個ずつ存在することになってめちゃめちゃ見づらくなります。

Delete All Groups

画像のように、Vertec Group欄の右にある下矢印ようなマークからDelete All Groupsを選択するとすべての頂点グループを一括で削除できます。
注意点ですが、ここで揺れもののボーンがある場合は、全削除してしまうと揺れものボーンの頂点グループも削除されてしまいます。その場合は揺れものボーンの頂点グループ以外を選択して消していきましょう
削除ができたら、アバター側のArmatureに対応した頂点グループを登録します。メッシュ→Armatureの順にShiftを押しながら選択します。画面右のOutlinerから選ぶ場合はCtrlを押しながら選択します。
選択出来たら Ctrl+P で Set Parent To メニューを出し、With Empty Groups を選択します。これでアバター側Armatureのボーン名と同じ頂点グループが一括で登録されます。

空の頂点グループを登録

頂点グループが登録出来たら、ウェイトを転送します。
オブジェクトモードで、転送元→転送先の順でShiftを押しながらメッシュを選択します。画面右のOutlinerから選ぶ場合はCtrlを押しながら選択します。ここでは、転送元を素体、転送先を服とします。すると、素体側が濃いオレンジ、服側が薄いオレンジの輪郭で表示されるはずです。なお、ここでは素体から転送しますが、形が近い服がある場合は、そちらから転送しても大丈夫です。

メッシュを2つ続けて選択

正しく選択出来たら、この状態でウェイトペイントモードに入ります。モードの選択は画面左上のメニューまたはCtrl+Tab長押しからできます。
ウェイトペイントに入ったら、服のメッシュが青く(ウェイト0で)表示されるはずです。ここで、左上のメニューから、Weights > Transfer Weights の順に選択します。

Transfer Weights を選択

すると、左下にTransfer Mesh Dataというのがでてくるので、Transfer Mesh Selection を By Name にします。これで各頂点グループの名前に対応したウェイトが自動で塗られます。

By Name を選択

これでウェイト転送は完了です。
うまくいったか確認してみましょう。適当なVertex Groupを選択すると、ウェイトが塗られているのが確認できると思います。

Hipsのウェイトを確認

さらに、Armatureを選択してポーズモードに入り、ボーンを動かしてみます。

ポーズモードで確認

うまく動いているようですね。とりあえずウェイト転送はこれで完了ですが、実際には素体と服の形状は違うため、細かい部分で気になる部分が出てくると思います。そういう場所は自分でウェイトペイントモードからウェイトペイントをして直しましょう。

参考: 自分でウェイトペイントする

先ほどから自分でウェイトを塗りましょうと言っているのでウェイトペイントのやり方についても触れておきます。
まず、ウェイトペイントへの入り方ですが、オブジェクトモードでボーン→メッシュの順に選択してからウェイトペイントモードに入ります。
こうするとウェイトペイント中にCtrl+クリックでボーンを選択することができます。

ウェイトペイント中にボーンを選択

選択したボーンはRで回転させたりできるので、ウェイトを塗りながら動きを確認することができます。
ウェイトを塗るときは、画面上部のWeight, Radius, Strengthでペンを調整しながら塗っていきます。

ウェイトペンの調整

ウェイトはその名の通り塗るウェイトの値です。例えば0.5で塗るとその頂点のウェイトが0.5になります。Radiusはペンの半径、強さは説明が難しいですが、この値を下げると例えばウェイト1にしていても最初は0.3くらいで塗られて、重ね塗りすることで値が1に近づいていくような挙動になります。
ちなみに、ペンタブがある人はペンの感圧機能を利用することもできます。また、作業すると分かりますが毎回画面上部にカーソルを持っていくのは面倒なので、画面上で右クリックするとカーソルのすぐそばにこの3つのメニューを出すことができます。

で、肝心なのはじゃあどこをどれくらいのウェイトで塗れば貫通しなくなるのか、なんですが、正直私もわかりません。なんとなく試行錯誤しながらやっています。頑張りましょう。

メッシュとボーンの構造を統合する

ウェイトが良い感じになったらメッシュとボーンの構造を統合していきます。基本的にボーンは元のアバターのものを使うのですが、服についている揺れものボーンだけはアバター側に移植する必要があります。
揺れもののボーンはどの階層に入っていたのかをメモしておき、アバター側の同じ階層に入れます。やっていきましょう。

ボーンの移動

編集モードで揺れものボーンを選択して、分離します。
まず、揺れものの親ボーンを選択し、メニューから
Select > Similar > Children などを使って該当部分をすべて選択していきます。
今回はベルト部分にボーンがあるのでこちらを選択します。

ボーンを選択

選択出来たら 右クリック > Separate Bones > Separate Bonesで別のArmatureに分離します。

Saparate Bones
ボーンが分離された

分離できると画像のようにボーンが別Armatureの子として独立します。
今度はこれをアバター側に統合していきます。
分離されたArmature > 体のArmatureの順に選択し、Ctrl+Jで統合します。

Belt_rootが統合された

このままではベルトのボーンがArmature直下に入っているので、服側と同じ階層であるHipsの子にします。
エディットモードで統合されたボーン →親にしたいボーンの順に選択し、Ctrl+P > Keep Offset します。
これでボーンが正しい階層に入りました。

Belt_rootがHipsの子になった

揺れものボーンが複数ある場合は、この手順を繰り返します。
これでボーンの関係づけは終了です。

さきほどの画像だと、Buckle, Belt, Fastenerなどのボーンが見えますが、これはアバターがもともと着ていた服の揺れものボーンです。アバター側の元の服を削除する(新しい服のみ残す)場合は、元の服についていた揺れものボーンを削除しておきましょう。でないと使われてない謎のボーンが残ってしまいます。

メッシュの移動

ボーン側は少々手順が複雑でしたが、メッシュの方は比較的簡単です。
メッシュをアバター側Armatureとペアレント関係にしていきます。服のメッシュ→アバターのArmature(ボーン)の順に選択して、
Ctrl+P > Object (Keep Transform) と選択します。

これで服のメッシュがアバター側Armatureの子になりました。Outlinerで見ても、素体などと同じ階層に移動していると思います。

メッシュの階層を移動した

すべて完了したら、不要になった服側のArmature(Armature.001)を削除します。
また、アバターがもともと着ていた服が不要な場合は、元の服のメッシュは削除してしまいましょう。

これで作業はすべて完了です。あとはfbxをエクスポートしてUnityでの作業になります。fbxのエクスポートについてはこちらの記事を参考にしてください。

以上、お疲れさまでした。
詳細を説明しきれていない部分、私の理解が足りていない部分、実は便利な機能で作業しやすくなる部分…などあげればキリが無いですが、とりあえずは使えるようになると思います。ここまで読んでいただきありがとうございました。

VRChat関連の技術的な情報などを書いています。「スキ❤️」や「フォロー」していただくとモチベになります。「サポート」していただいたら私が美味しいものを食べます。