第13回 有料アセット dynamic boneで髪を揺らそう~今日から使える揺れもの制御~
髪とか服とかどうせなら揺らしたいですよね。
11月11日にアセットストアで大規模なセールが行われたのはご存知でしょうか?
ポッキーの日…ではなくunity的には独身の日。それにちなんで日本、韓国のunityユーザーを対象に一部アセットが半額で販売されました。
ちなみに独身以外でも半額でした、これを機会に有料アセットに手を出してみたなんて方もいるのではないでしょうか?
今回はそんな有料アセットのなかでもVRchatユーザーご用達のdynamic boneを使った揺れもの制御を解説していきます。
第13回はこんな流れで進めていきますよ
~STEP1.とにかく揺らしたいんだ!実装編~
早速実装だ!の前にちょっとだけ復習です。
現実の肉体は筋肉の収縮に合わせて骨が動きますが、アバターのバーチャルな体はその反対です。
骨格(ボーン)を動かし、その動きに対して肉体(メッシュ)がついてきます。
dynamic boneは読んで字の通りボーンに追加する機能です。メッシュ側に追加しても機能してくれないので注意しましょう。
とにもかくにもまずは導入しなければ始まりません。
第10回の記事を参考にダイナミックボーンを購入しておきましょう。
有料アセットでもやることは変わりません、インポートしましょう。
インポートが完了したらユニティちゃんのボーン構造を把握しておきましょう。
緑色の部分がunity上で人の体である、と判断しているboneです。
灰色はとりあえず放置されているboneになります。
今回はどちらかというとこの灰色のboneのほうが重要です。
横から見るとわかりますがしっかり服のすそや髪、胸にもboneが入っていることがわかりますね。
揺らしたい部分にboneがないと揺らしようがないので揺らしたい部分にboneがあるか確認しておきましょう。
揺らしたい部分を見つけたらAdd ComponentからDynamic Boneを追加します。
Dynamic Boneが追加されました。
追加されたDynamic BoneのRootに揺らしたい部分のboneをドラッグしてあげます。
ちなみにこのRootがあってさえいれば体のどこにコンポーネントを追加しても機能するらしいです。
足に髪を揺らすコンポーネントを追加しても大丈夫…頭がこんがらがりそうなので素直に揺らしたい部分に追加するのがいいでしょう。
前髪のBoneの指定が完了しました。
ただ揺らすだけであればこれで設定は完了です、実際に揺れるか確認してみましょう。
揺れの確認は中断上部にある再生ボタンを押すことで確認できます。
再生ボタンをクリックすると強制的にGameウィンドウに切り替わるためSceneをクリックして切り替えましょう。
そこには中腰になったユニティちゃんがいますが揺れの確認に支障はありませんからこのままユニティちゃんを左右に動かしてみましょう。
前髪が左右の動きに合わせて揺れていますね。設定は問題ないようです。
ここで「んん?前髪のboneは二層になっているけどこっちに追加しなくても揺れるの?」と思った方は鋭い!
実は「設定しなければダイナミックボーンの設定は下の階層にも影響する」仕様になっています。
例えば長髪のアバターがいたとして、髪のboneが100個あったとしても一番上の階層に設定を追加すれば他の99個も同じように揺れるということです。
「なぁんだ、だったら髪に追加しないで頭のboneに指定すれば髪はまとめて揺れるじゃん!」
…そうですよね、ユニティちゃんは顔のメッシュが分かれていますから全部まとめて揺れますよね。
ユニティちゃんでは活用できませんがHeadより下の階層に髪のBoneしかないアバターなどには有効な仕様なので覚えておきましょう。
ちゃんと設定してあげると髪だけ揺れるようになります。
~STEP2.ここはこう揺らしたい!揺れ方調整編~
STEP1.でとりあえず揺らすことはできました、しかしこのままでは髪も服も全部同じ揺れ方になってしまいます。
せっかく有料アセットを購入したからできる限り現実に近い揺れ方をさせたい、そう思うのは当然です。
STEP2.ではさらに細かく揺れを調整していきましょう。
揺れ方は主に3種類の値を調整することで調整することができます。
1つ目はDamping(減衰)。数値を小さくすれば揺れる速度が速くなり、大きくすると遅くなります。
空気抵抗などを考慮する場合は少し大きめにするといいです。
2つ目はElasticity(弾性)。元いた位置に戻ろうとする力を調節できます。
0にすると戻る力がないので揺れたら揺れっぱなし、元の位置には戻りません。
逆に1にすると戻る力が最大のため揺れなくなってしまいます。
3つ目がStiffness(剛性)。揺れるboneの硬さを調整できます。
値が小さければ柔らかく、大きければ硬い質感で揺れます。
1にしてしまうと最大硬度で揺れなくなるので注意が必要です。
以上、説明した3つの値は時間変化で調整することもできます。
グレーのウィンドウをクリックします。
するとCurveウィンドウが表示されるので下の選択肢から好みの時間変化の形を選びます。
画像の場合は「最初の値は0だが1秒間で右肩上がりに値が1に変化する」カーブです。
これを上手に活用すれば「最初はふわっとなびいて後からなびいた髪がスローになる」といったシャンプーのCMのような表現が可能になります。
自分が納得するまで3つの値を調整し、揺れ具合を調整しましょう。
…そうそう、大事なことが一つ。
「unity上の挙動とVRchat上での挙動が異なる場合がある」事例があるのでunityだけでなくVRchat上でも挙動をこまめに確認しておきましょうね。
~STEP3.ここでは揺れてほしくない!コライダー調整編~
STEP2.まで理解できれば大部分は満足いく揺れ具合になったことでしょう。
…服のすそが揺れたときに太ももにめり込むのが気になる?
そんな問題ももちろん解決できます。
STEP3.ではコライダー(衝突判定)を利用して服の揺れを制御しましょう。
コライダーって何?と思うかもしれませんが、要は「ここから先は揺れちゃダメ!」な判定をunityに追加するということです。
今回は試しにスカートのすそを太ももにめり込まないようにしましょう。
Boneの配置を確認するとスカートのBoneであるJ_L_Skirt_00に干渉しそうなのはLeftUpLegですね。
LeftUpLegにDynamic Bone Coliderを追加しましょう。
追加すると黄色の球が表示されます。これがゲームでよく言う「当たり判定」の範囲です。
このままでは大きすぎますし、判定の位置もおかしいです。
3つの値で判定を調整しましょう。
Centerでは判定の位置を調整することができます。
X,Y,Z軸それぞれに入力しただけ移動します。
Boundでは判定の影響を内側、外側のどちらに及ぼすか指定します。
今回はめり込んでほしくない、ということなので外部に影響するOutsideでOKです。
Radiusは判定の球の大きさを調整することができます。
今回は太ももに収まるか、少しはみ出る程度の大きさまで調整しましょう。
調整後はこんな感じ。もう少し判定球の大きさを大きくしてもいいかもしれません。
これでコライダー側の設定は完了です。
次は揺れる側のBoneにさっき作ったコライダーを指定してあげましょう。
Dynamic Boneの中にあるCollidersを開きます。
Sizeを0から1にするとElement(要素)が一つ追加されます。
ここでさっき作ったコライダーを指定します。
これで「このBoneが揺れる時、指定したコライダーの影響を受ける」設定ができました。
実際に動かすと太ももにめり込まなくなっていることがわかるでしょうか?
今回は簡易的にコライダーを一つ追加しただけですが細かくこだわる場合は複数個のコライダーが必要になります。
ちなみにこのコライダーを応用すると「手に判定をつけることで前髪が手の動きに合わせて動く」ように見せることもできます。
その場合は手のコライダー判定を少し大きくしてあげるといいでしょう。HMDとコントローラーがぶつかる前に反応します。
実装できれば前髪を暇なときに前髪をいじいじ…なんて現実でもやりそうな表現ができます。
プリンに仕込んでぷるぷるさせてもよし、現実だと絶対に揺れない石像を揺らしたりして「揺れ」を楽しみましょう!