突き抜けの防止

概要

アクションゲームなどの激しい動きを伴うクロスシミュレーションで、よく問題となるのが布の足や身体への突き抜け問題です。
例えば次の画像ではスカートが意図せずに太ももを貫通しています。

新しい機能である Surface Penetration(サーフェス浸透拘束) / Collider Penetration(コライダー浸透拘束) を使うことで、この問題を改善することが可能です。
次の画像はSurface Penetrationを適用した例です。
布が太ももを貫通していないことに注目してください。

2つのスキニングタイプ

機能を設定する前に、まず適用するメッシュの構造を把握する必要があります。
ここではスカートを例に取り上げます。
まず重要なのがスカートに主要なボーンのウエイトが含まれていて、アニメーションを行っても破綻していないかという点です。
次に2つのタイプを示します。

主要ボーンのウエイトが入っている場合
1つ目のパターンはスカートにすでに足などの主要ボーンのウエイトが入っており、アニメーションに追従する作りとなっているものです。

このパターンでは、上の図のようにアニメーションを行ってもスカートが破綻しません。
足を上げた場合は、スカートにウエイトが入っているので形状が変わります。
この場合は元のスカートの動きに対して、クロスシミュレーションをブレンドするのが、もっとも強固で良い見た目となります。
これを実現するのが Suface Penetration(サーフェス浸透拘束)となります。
破綻しないスカートを実現する場合は、こちらの方式を採用することを推奨します。

主要ボーンのウエイトが入っていない場合
2つ目のパターンはスカートに足などのボーンウエイトが入っていない場合です。

このパターンでは、上の図のようにアニメーションを行うと足がスカートを飛び出してしまいます。
足を上げた場合も同様です。
この場合は、ある程度はコライダーによる衝突判定でめり込みをカバーできますが、激しい動きを行うとどうしても突き抜けなどが発生していまいます。
このパターンで有効となるのが Collider Penetration(コライダー浸透拘束)です。
Collider Penetrationを設定することで、スカートのパーティクルが最寄りのコライダーと紐づき、不用意にコライダーの裏側に回るのを阻止できます。
逆にこのメッシュパターンの場合は Surface Penetrationを使用するのは推奨しません。
SurfacePenetrationはメッシュの現在のオリジナル形状に合わせて計算されるため、逆に突き抜けが酷くなる可能性があります。

 

Bone Clothの場合

上ではMeshClothについて説明しましたが、浸透拘束はBoneClothに対しても設定可能です。
BoneClothの場合もメッシュと同じく、ボーン自体がアニメーションにより変形するかしないかにより Surface Penetration / Collider Penetration を使い分ける必要があります。
例えばアニメーションに合わせてボーンが変形しスカートが破綻しないようになっている場合は Surface Penetrationを、そうでない場合は Collider Penetrationを利用することが推奨されます。

 

Surface Penetration(サーフェス浸透拘束)

サーフェス浸透拘束では、パーティクルが指定された軸(XYZ)方向に浸透できる距離を設定できます。
これにより例えばスカートが内側にあまり入り込まないように制限できます。
この機能はUnityの標準クロス(Unity Cloth)のSurface Penetrationとほぼ同じです。

上の図では青いラインがパーティクルの法線を、オレンジのラインが浸透できる距離を示しています。
この例では各パーティクルがZのマイナス方向に一定以上浸透できないように制限しています。

インスペクタでは次のパラメータを使います。

項目 説明
Max Connection Depth 浸透拘束を適用するパラメータの最大深度を設定します。
Penetration Axis パーティクルのどの軸に対して浸透できるかを指定します。
Penetration Distance パーティクルが浸透できる距離を指定します。
深度ごとに曲線で指定可能です。
Moving Radius パーティクルが移動できる最大半径を指定します。
パーティクルは最大浸透距離に隣接する、この半径の球内部でのみ移動可能となります。
深度ごとに曲線で指定可能です。

作成した浸透データはクロスモニターの[Penetration]にチェックを入れることで確認が可能です。

また同じくクロスモニターの[Particle Axis]もしくは[Vertex Axis]をチェックすることでパーティクル/頂点の軸を確認することができます。

軸はUnityのギズモと同じくX=赤、Y=緑、Z=青、となります。

次は今回のスカートにSurface Penetraiontを適用したGifです。
スカートが足を貫通していないこと、その上でクロスシミュレーションが適用されていることに注目してください。

今回設定したクロスパラメータのプリセットは以下からダウンロード可能です。
※zipを解凍して中のjsonファイルをプリセットとしてロードして下さい。

surface_penetration_skirt_preset

 

 

Collider Penetration(コライダー浸透拘束)

コライダー浸透拘束では、パーティクルが最寄りのコライダーに浸透できる距離を指定できます。
このデータは設計時に作成されます。
これにより実行中にパーティクルが不用意にコライダーの裏側にまわるようなことを防止できます。
Collider PenetrationはSurface Penetrationの代替品であることに注意してください。
そのため、Collider PenetratoinはSurface Penetrationほど強固ではありません。
Surface Penetrationが利用可能な場合は、あちらを利用することを推奨します。

上の図ではオレンジのラインが接続するコライダーを指しています。
パーティクルはこの設計時に紐付いたコライダーの裏側に回り込まないように制限されます。

インスペクタでは次のパラメータを使います。

項目 説明
Max Connection Depth 浸透拘束を適用するパラメータの最大深度を設定します。
Connection Distance パーティクルが接続するコライダーを検索する時に、その最大検索距離を指定します。
Penetration Distance パーティクルが浸透できる距離を指定します。
深度ごとに曲線で指定可能です。
Moving Radius パーティクルが移動できる最大半径を指定します。
パーティクルは最大浸透距離に隣接する、この半径の球内部でのみ移動可能となります。
深度ごとに曲線で指定可能です。
Penetration Ignore Collider List 接続として無視するコライダーを指定します。

Collider Penetrationはコライダーに接続されるので、コライダーリストを設定することを忘れないようにして下さい。

作成した浸透データはクロスモニターの[Penetration]にチェックを入れることで確認可能です。

次は今回の足のウエイトが入っていないスカートにCollider Penetrationを適用したGifです。
スカートが足を貫通していないこと、その上でクロスシミュレーションが適用されていることに注目してください。
また、Surface Penetrationの動作とほとんど変わらない点も注目してください。

今回設定したクロスパラメータのプリセットは以下からダウンロード可能です。
※zipを解凍して中のjsonファイルをプリセットとしてロードして下さい。

collider_penetration_skirt_preset

 

以上で、突き抜け防止策の設定は完了です。