【VRC】ロングスカートについて考える・パート1【PhysBone】

ロングスカートをなんとかしたい。
私はアバター販売・衣装販売をしていますが、揺れもの関係のボーンは軽量化のために出来るだけ少ない本数で、それでいて直立+αでいい感じに見えればいい!というスタンスでやっております。しゃがみ、座りはあまり考慮されていません。

しかし、アバターパフォーマンスにとらわれない、比較的贅沢なボーン割でスカートを動かしてみたらどうだろう?しゃがんだり座ったりしたときにもキレイに見えるスカートが作れないだろうか?という思いつきです。
今回はその研究の記録と成果をまとめて綴りたいと思います。


とりあえずの現状と目標

今回サンプルとして使うモデルは、拙作でヒザ下までかかるスカートを履いている「エシュラン」です。

衣装の揺れものボーンは上着の裾、スカートに入っています。上着の方は十分だと感じているので、スカートの方だけを直していくことにしていきましょう。

修正前のエシュランくん。

スカートのボーンだけを抜き出してみました。
現状は腰回り一周が8本、縦に4本ずつ、32本のボーンで構成されています。中央にあるのはルートボーンです。ルートボーンにPhysBoneコンポーネントを付与することで、子になっている揺れものボーンが全て動くという仕組みになっています。

割りと簡素な作りですが私にしてはボーン数を奮発したほうです。

今回はコンストレイントなどを使わないで、出来るだけPhysBoneのコンポーネントも少なく、シンプルな構成でもなめらかに動くものを作る!というのを目標にしたいと思います。レッツゴー!

スカートの雛形モデルを作る

動くものを作るときは簡単な雛形を作ってからウェイト転送するのが一番効率がよく、かつ、美しく仕上がると思っています。
今回は作り方から紹介していくのでみなさんもぜひ手元でやってみてください。

そんなコトしてられるかよ!なんで出来上がるものは同じなのにそれぞれやらにゃいかんのだ!という方は雛形をDL出来るようにご用意いたしましたので、「パート2」へ飛んでください。

準備していこう

まずは兎にも角にもBlenderをご用意ください。
私はBlender3.6.5を使っています。LTS最新版なのでおそらく不具合などは出づらいと思います。

それから使いたいスカートのモデルを用意しましょう。
今回はアバターをそのまま改変していますが、衣装のみの場合でも大丈夫です。
FBXが同梱されていればそれをBlenderにインポートして使いますが、FBX単品が見つからないときはUnitypackageをUnityにインポートしたあと、展開されるFBXを探してBlenderにインポートしてください。

円柱を作って雛形を作る

最初に出ている立方体を消したら、オブジェクトモードでメッシュを追加します。

他にもプリミティブなメッシュは色々ありますが今回は円柱。

続いてボーンの数と円周の頂点数を合わせます。
左下にオプションが出ているはずなので、頂点を16くらいに設定してください。

オプションがたたまれていることもあるのでそのときは開いてあげてね。

スカートと形、大きさをある程度合わせます。

デフォルトだとこんなにデカいのであった。

タブキーまたは左上のメニューから編集モードに入って、スカートの上下と円柱メッシュの大きさを合わせます。Sキー(拡大縮小)が便利でしょう。

今回のテストモデルは巻きスカートで、ドレープが結構ひらひらした形なので、円柱は形状を維持したままスカートに少し埋もれる形で用意します。横から見ても出来るだけキレイに沿うようにS→Yキーで奥行きを調節してください。
スカートの雛形として今後役に立ってもらうために長めにしておきました。みなさんはお手持ちのスカートの長さに合わせてもらって大丈夫です。
この時注意が必要なのは、スカート全体にかかるように円柱をかぶせるのではなく、スカートが揺れ始めて欲しい位置くらいに円柱の上面を合わせることです。

今回はベルト部分から下を動かす感じでやってみます。

円柱が出来たら、Control+Rキーを押してループカットを行います。
横方向にメッシュを割る作業ですね。この割った数がボーンの数になります。とりあえず8で割ってみました。多いかな?いや、贅沢に使うって決めたんだ!!

ループカットの細かい操作方法は別途調べてください、スイマセン。

アーマチュアの設定

さてさて。ここまで準備ができたらアーマチュア(揺れものの骨)の設定です。
ボーンの配置の仕方は色々ありますが、今回はスキンモディファイアからアーマチュアを作成する方法でやっていこうと思います。

まず編集モードで辺選択モードに切り替え、縦軸の辺を一箇所全て洗濯します。そしてPキーで分離してください。

一辺を縦方向にすべて選択してPキーを押す

分離したオブジェクトを選択し、編集モードで一番上の頂点を選択した状態でスキンモディファイアを追加します。

なんか四角いの出てきた!焦らずに次の作業をしよう。

そしたら一番上の頂点が選択されていることを確認して、「ルートをマーク」を押し、その後オブジェクトモードに切り替えて「アーマチュアを作成」をクリックしてください。
無事にボーンが縦に並んで生成されたら、円柱から切り離したオブジェクトは削除してOKです。

これを円周分全部やります。がんばろう。

出来上がったらこんな感じになります。

メッシュに沿ったアーマチュアが出来た!

このままだとアーマチュアが複数あってごっちゃゴチャなので、ひとまとめにします。
円柱を一旦非表示にして(右上の目玉マークをクリック)、オブジェクトモードでアーマチュアをすべて選択、その後メニューから統合を押します。

右上にあるアウトライナーから直接選択すると便利です。
ひとつのアーマチュアにまとまったぞ!

これでアーマチュアは完成、とは行きません。もう少し頑張ります。
今ボーンにはそれぞれ自動で生成されたボーン名が振り分けられているのですが、これをもう少しわかりやすく命名してあげましょう。

編集モードに入って、ボーンを一つ選択します。とりあえず手前側中央の一番上に「Skirt_center」と命名します。
その後、「Skirt_center」を下のボーンに順番にコピペしまくっていくと、順に「Skirt_center.001」「Skirt_center.002」とリネームされていくので、下まですべて名前を付けましょう。これをぐるっと全部のボーンにやります。やります!やるんですよ!!

ボーン名を変更するところは右側の骨マークの一番上です。

真ん中のボーンはこれでいいのですが、今回は楽をしたいので左右のボーンは名前を揃えてあげたほうが良いでしょう。そして身体の左側になるボーン(つまり画面では右)の手前から、「Skirt_1_L」「Skirt_2_L」・・・と名前を付けていき、背中側中央のボーンには「Skirt_Back」と命名します。
中央から反対側は「Skirt_1_R」「Skirt_2_R」と同じように命名して行ってください。

こんな感じに名前がついたはずです。

続いてルートボーンを配置します。
編集モードで「追加」→「単一ボーン」でボーンが中央に一本どんと生えてきたと思います。

デデドン。

このボーンをいい感じに上の方に持って行って、名前を「Bone_Skirt_Root」などに変更してあげてください。このボーンにPhysBoneのコンポーネントをアタッチすることになります。

ルートボーンの向きは下向きになるようにします。

そして各ボーンの親をルートボーンの子にしていきます。そうするとルートボーンから子になるボーンに点線が生えてくると思います。コレを一周やります。

右側のペアレントの項目からRootなどで検索して親子付してください。
全部紐づけたものを上から見たところ。

あと少しでアーマチュアは完成、頑張ります。
一旦「Shift+C」キーを押して3Dカーソルの位置を初期化します。その後編集モードでルートボーン以外のボーンをすべて選択、「アーマチュア」→「ボーンロール」→「ロールを再計算」→「カーソル」を押して、ボーンロールを設定しましょう。
こうすることでボーンが常に外側に動くように設定されたと思ってください。アーマチュアの設定は以上です。

中央のルートボーンは選択しません。
ロールが揃った状態を上から見た図。キレイですね。

ウェイトの設定

さて次にウェイトを設定していきましょう。数が多くて大変ですが、もうひと踏ん張りがんばってください。

先程まで非表示にしていた円柱を表示させ、「円柱」→「Shift+アーマチュア」の順にクリックします。
それから「オブジェクト」→「ペアレント」→「空のグループで」で親子付をします。

成功すると円柱にアーマチュアモディファイアが自動追加されます。

ここで自動ウェイトをつかうとあとでぐちゃぐちゃにウェイトが乗ってしまう可能性があるので、頑張って手作業で割り当てていきます。

円柱を選択して編集モードに入り、右側の「頂点グループ」という項目から頂点グループ名を選択して、該当のボーンのテール位置にある頂点に「割り当て」ボタンを押してウェイトを1ずつ割り当てていきます。

ボーン名を表示しておくとやりやすいかも。

ウェイトペイントモードで塗るのでもOKです、やりやすい方でやってみてください。

ウェイトペイントモードならこんな感じです。

全部塗り終わった時、最上段の頂点には何も割り当てられていない状態で大丈夫です。
これでひな形のスカートが完成しました。お疲れ様です!パート2へ続く!!