[Unity]Dynamic Plane Colliderを使った長衣の貫通防止[Dynamic Bone]

こんばんは。糸凪邑です。

前回に続き、灰色の人の製作時に遭遇した問題とそれに対する自分なりの解決方法についてです。


今回はアバター制作でよくある(らしい)、いわゆる膝を上げた時にスカートのような揺れもの衣類が貫通する問題について。


さっそくですが、こちらが現在BOOTHで販売中のものです。

・3Dモデル「灰色の人」 - HollowCradle - BOOTH

https://hollowcradle.booth.pm/items/2435679


ストールは違う事情で服にめり込んでいますが、長衣の裾は膝を上げても貫通しないことが確認できると思います。

流石に○字バランスみたいな角度は無理ですが、普通に動く範囲であれば問題ないはずです。


後述しますが、動きが不自然なのはいくつかのボーンで軸制御を行っていること、揺れる部分の長さに対してのウェイトの付け方が粗い、DynamicBoneのパラメータ調整がいまいち等など、色んな理由があるかと思われます。

方法にしても、もう少し良いものがあるのかもしれませんが、とりあえず今の自分にはこれくらいが限界でした。


動きに関してはさておき、目的であった貫通防止は達成できましたので、そのやり方を残しておきます。

具体的な内容としてはタイトル通り、"Dynamic Plane Colliderを使った長衣の貫通防止"についてです。

普通のDynamicBoneColliderを使っても上手くいかなかった場合、苦し紛れかもしれないけれどこんなやり方もありかもよ?的な最終手段としてご覧頂ければ、と。


それでは本文へ。



どうやって揺らすか、DynamicBoneとCloth

まず、揺れものをどう作るかというお話から。

自分が調べた感じですと、こういったスカートやワンピースなどの揺れもののの作り方は以下が挙げられるようです。


1.Cloth

・Unity 5 でおこなうクロスシミュレーション - Unity Technologies Blog

https://blogs.unity3d.com/jp/2015/11/24/unity5clothsimulation/


2.DynamicBone

・Dynamic Bone | アニメーション ツール | Unity Asset Store

https://assetstore.unity.com/packages/tools/animation/dynamic-bone-16743?locale=ja-JP


3.Constraint

・コンストレイント - Unity マニュアル

https://docs.unity3d.com/ja/2018.4/Manual/Constraints.html


この内、Constraintはアニメーションを付ける時に使ったり、何かと併用したりするものであり、手軽に揺らす類のものではないとか。

初めての揺れもの作りではなるべく揺らしたいなぁと安直に考えた結果、ClothかDynamicBoneの2択になりました。


じゃあどちらにするか、と。


調べてみるとどちらも一長一短なようですが、Clothを使う場合は処理の重さに加え、一番は独立したメッシュが必要らしいことから今回のような切り分けにくい構造には向いていないと判断。


てなわけで、DynamicBoneを使うことに。


初めてのAssetsStoreでのお買い物に手こずりながら、何とか購入した後、先人たちが記した記事をいくつか参考にし、適当にDynamicBoneを設定すると、すぐにゆらゆらと揺れ始めました。

なんと素晴らしいアセットでしょう。


ただ、このままだとコライダーを設定していないので、身体にめり込みます。

というわけで、足や胴体にDynamicBoneColliderをいくつか設置し、再確認。

すると、雑に動かしても激しく身体を貫通することは無くなりました。


■参考■

・DynamicBoneでふわふわスカートを作る(基本パラメータ編) | バーチャルライフマガジン

https://vr-lifemagazine.com/vrchat-dynamicbone/


・【VRChat】Dynamic Boneのinsideで貫通しないスカートを作る - BlackIceCoffeePhenomenon

https://yananann.hatenadiary.jp/entry/2018/11/17/195631


・ダイナミックボーン(DB)を使った貫通に強い揺れるスカートの作り方 - ※個人の感想です

https://mojamegane.hatenablog.com/entry/2019/11/16/061332



しかし、ここで別の問題が発生。

足を曲げてみると裾を貫通します。

どうやらコライダーの表面を滑り落ちている模様。


これでは全く意味がありません。

色々調べ、コライダーの位置や大きさを調整してはみますが、ある程度の角度を超えて足を上げると何事もなかったかのように貫通します。


あくまで僕の考えではありますが、このモデルの形状にそもそもの問題があるようです。


上記の参考のとおり、DynamicBone使用時の貫通問題に対しては、コライダーのBoundにInsideまたはOutside指定したDynamicBoneColliderを利用したものが一般的なようです。

ただ、これらはどちらも短い丈、あるいは裾が広がったデザインの場合です。


僕のモデルですと、裾が膝程度と長く、また、身体に沿った形状をしています。


もし短い丈であれば、ボーンの本数やOutside設定したコライダーの個数や密度を増やすなりして対処できそうです。

しかし、長くなればなるほど、足を挙げた際、裾に設定したボーンの間隔が広くなり、コライダーを滑り、その結果足が貫通します。


じゃあInside型であればどうなのかと。

Inside型では、DynamicBoneを付与したボーンをInside設定したコライダーで覆い、そこから出さない=DynamicBoneColliderの表面に沿ってボーンが移動させるようにすることで貫通を防止します。

一見大丈夫そうなのですが、これにはちょっとした問題点がありまして。

長い裾かつ直線的なボーンの構造だと、ボーンに触れる曲面が平面に近くなる程度に大きなコライダーでないと、ボーンが滑って中でぐちゃってしまう。

今回のモデルを使って自分で試した感じですと、ボーンを覆う程度のコライダーであれば、90度に満たない段階でコライダー内部でボーンが折れ曲がってメッシュがぐちゃぐちゃになってしまいました。


上に書いたように、もしかしたら球体の大きさを凄まじい大きさにすればなんとか動くのかもしれませんが、見た目的&調整面的によろしくないので、避けるべきと判断しました。

(単に僕の腕不足で使い方が悪かっただけという可能性がありますし、おとなしくメッシュの形状をいじって前後にふくらませるという選択肢もあった気もしますが、その時は何かに追い詰められていたのでしょうね。)



さて、どうしようか、と。

足上げを妥協するというのも考えたのですが、そもそも座った時に足が90度になるわけですし、流石に最低限の部分は必要だろうと却下。


頭を抱えて探していくと、DynamicBonePlaneColliderというものを発見しました。


・【Dynamic Bone 第四弾】 「平面」で衝突させる「DynamicBonePlaneCollider」の使い方を解説! 髪やスカート、胸などボーンを揺らす大人気アセット「Dynamic Bone」Vol.4 - Unity AssetStoreまとめ

https://www.asset-sale.net/entry/Dynamic_Bone_DynamicBonePlaneCollider


これは文字通り、平面のDynamicBone用コライダーです。

通常のDynamicBonePlaneColliderはスフィアまたはカプセル型なのに対して、こちらは一定方向に対して広がる、大きさが無限の平面(らしい)です。


これを使って足の貫通問題を解決してみます。

先に完成型を載せておくとこんな感じです。




各方向のDynamicBoneを設定した各ボーンを角度の異なる2つの平面で区切ることで、その平面の内側に入って来ないようにしつつも、その平面によって持ち上げられるような、そんなイメージです。


以下がその手順となります。



DynamicBonePlaneColliderを用いた貫通防止の手順

まず、当モデルの長衣の裾に仕込んだボーン形状はこんな感じ。

3連1セット×8方向です。

中心に1つだけあるのはこれらをまとめて動かすように置いたParent(Root的な)ボーンですが、実際には使いませんでしたので無視して下さい。


正面中央から反時計周りに0〜7と番号を振り、それぞれのRootにDynamicBoneを付けてあります。



また、Blenderにおけるモデリング時に、X軸方向に回転させることで裾の外側に回転するよう、各ボーンの軸方向をいじってあります。


Blender内で、Transfom OrientationsをLocalに、Transform Pivot PointをIndividual Originsにして、全てのRootボーンをX軸方向に回転させたもの。


これらに対して、各方向のボーンセットをそれぞれ2つのDynamicBonePlaneColliderで挟んでいきます。

Unity上ではコライダーの方向が直線で表示されるだけなので少しわかり辛いかと思いますが、平面を可視化するとこんな感じです。

少々雑ですが、緑色の線が平面を表していると考えて下さい。

上図のように、各コライダーに2セットずつ兼任させ、両足にそれぞれ4つずつ、型8つ配置します。

配置時は足(Leg.LやLeg.R)に直接設定するのではなく、Emptyを追加し、それにDynamicBonePlaneColliderを設定します。

この時、対象のDynamicBoneをDynamicBonePlaneColliderの直線(法線?)が伸びる側に置くように配置できてさえいれば、対象以外のDynamicBoneに触れていても問題ありません。

どのコライダーに衝突するかはDynamicBone側の[Colliders]で設定することになりますので。


ちなみに単なる貫通防止であれば右足に前後右、左足に前後左の3方向分で計6つか、頑張ればそれ以下で十分ですが、わずかでも自然な感じを出したかったので8つ置きました。

試してみて、必要な分だけ配置して下さい。


配置したら、後は各DynamicBoneに対して、自身を挟む2つのコライダーを衝突対象として[Colliders]に設定していきます。

各ボーンで設定するDynamicBoneColliderが異なりますので、どれを平面に沿わせたいのか確認しつつ設定しましょう。

この画像ではHipsも設定してありますが、不要であれば外して下さい。


最後に、DynamicBoneを設定した前後左右4方向のRootボーンに対して[Freeze Axis]を[x]に変更します。

平面のコライダーという性質上、DynamicBoneがその平面上を滑っていってしまうので、回転軸を制限することでそれを防止します。

これはモデルとボーンの構造的に必要だったから設定しましたが、ものよっては必要ないと思います。

平面を滑ることへの対処方法の一例としてお考えいただければ、と。


前後左右の間にある他の4方向(モデルの斜めにある4つ)に関して軸制御をしなかったのは、極力自然な感じを出したかったからです。

もし設定していない部分が貫通するようでしたら、同様に軸制御してあげれば貫通は防げると思います。

もちろん制限すればするだけ奇妙な動きになりますが、その辺りはモデリングソフト側でボーンの向きをいじってあげれば多少は改善される...かもしれません。


DynamicBonePlaneColliderを用いた裾の貫通防止に関しては以上です。


あくまで初心者が試行錯誤してやむおえず選んだ方法ですので、間違っても綺麗なやり方とは思いませんが、同じように苦しむ方でもうどうしようもないって時は一度お試しいただくと解決したりしなかったりするかもしれません。


まぁ、問題は起きないことが一番なので、あらかじめ問題の存在を認識した上で、デザインやモデリング、リギングの段階でそれを回避すべきなんでしょうね。


ではまた。

コメント