UnityのClothを使ってPlaneに布の表現を加え、形をリアルタイムに変更する

Unityに取り込んだ3DCGモデルは、ジャケットやスカート等の服を着せてモデリングしていると思います。

ボーンを設定し、アニメーションを付ければそのボーンの動きによって服も動くようになっています。

ゲーム内で着せ替えが出来るような機能を作る場合は、キャラクターモデルに服のモデルをインスタンス化し、切り替えが出来るようにします。

blenderで作成した服、鎧や足をガードする装備等を作成した後Unityに取り込み、キャラクターが装備を着せかえることが出来るようにします。

しかしキャラクターモデルのボーンに服のモデルのプレハブを設定し、キャラクターが動いた場合に服はボーンとともに動きますが、

そのボーンの動きとは関係ない部分で重なってしまう事があります。

本来であれば服が手や足の動きに合わせて動いてほしい所です。

そんな時にClothの機能を使うと、服が設定したコライダの動きに合わせてリアルタイムに形状を変化させる事が出来ます。

いやぁこの機能すごいです!

スポンサーリンク

Clothの設定と使い方

まずは試しにPlaneを作成し、このPlaneにClothを設定しどのように形状を変化させるか見てみます。

布のサンプルを作成

ヒエラルキー上で右クリック→3D Object→Planeを選択します。

PlaneのMesh ColliderのConvexにチェックを入れ、Is Triggerにチェックを入れます。

PlaneのMeshColliderのIsTriggerにチェックを入れる

Is Triggerにチェックを入れないとキャラクターがPlaneのコライダと物理的に当たってしまい、布が逆側からしかうごかなくなってしまいます。

PlaneのインスペクタでAdd Component→Physics→Clothを選択し、Clothを取り付けます。

Clothコンポーネントを取り付ける

Skinned Mesh RendererのMeshにこのゲームオブジェクト(Plane)のメッシュを指定します。

ここで指定したメッシュ形状が設定したコライダと接触した時に、形状を変えます。

形状を変えるには変えたい部分のメッシュが他のメッシュと分かれている必要があります。

例えばキャラクターの体と服のモデリングは別にして、メッシュを分けておきます。

Clothの設定項目

Clothの設定項目を見てみます。

Clothの設定項目

Stretching Stiffnessは布の伸縮率。
Bending Stiffnessは布の曲げ剛性。
Use Tethersは布が離れすぎるのを制限するか。
Use Gravityは布に重力を与えるか。
Dampingは動きの減衰値。
External AccelerationはXYZ軸に一定に加える加速度。風を表す時にいいかも?
Random Accelerationはランダムに加える加速度。
World Velocity Scaleはワールド座標の動きがスケールにどれだけ影響を及ぼすか。
World Acceleration Scaleはワールド座標の加速度がスケールにどれだけ影響を及ぼすか。
Frictionはコライダと接触した時の摩擦。
Collision Mass Scaleは衝突時のパーティクルの増加量?。
Use Continuous Collisionは連続の衝突を有効にするかどうか。
Use Virtual Particlesは1つの三角形毎にひとつの仮想パーティクルを追加する?
Solver Frequencyは一秒間ごとのソルバー反復の回数?精度を上げるパラメータみたいです。
Sleep Thresholdは布が動かなくなる為のしきい値。
Capsule Collidersは布と接触するCapsuleColliderを設定
Sphere Collidersは布と接触するSphereColliderを設定

となっています。

実行しながら値を変えていくといいかもしれません。

詳細については参考サイトを見てください。

布の動きの制限を加える

次にClothのEdit Constraintsを設定します。

Edit Constraintsボタンを押してシーンビューを見ます。

ClothのEdit Constraints

↑のようにシーンビューに表示されます。

VisualizationはMax DistanceとSurface Penetrationの見た目を変えます。

Selectモードの場合はマウスのドラッグで範囲指定をし、下の項目で全部の値を変更する事が出来ます。

Paintモードの場合は個々の頂点を指定し、個別に下の項目で値を変更する事が出来ます。

Max Distanceは元の頂点の位置からどれだけ動くかの最大値を指定します。例えばスカートの腰の部分は動かさないので腰の周りの頂点を指定し、Max Distanceを0にします。

Surface Penetrationは布がメッシュを突き抜ける深さを指定します。この値を0にすると布は突き抜けず、完全にめくり上がるという事になります。

では実際にClothのEdit Constraintsボタンを押し、Planeの上側の頂点を選択し、Max Distanceを0に設定してみます。

頂点の選択はSelectモードで行う事にします。

元からMax Distanceを0に設定していたのであれですが・・・、最初はMax Distanceのチェック項目に-が表示され、そこをチェックした後にMax Distanceを0に設定します。

これでPlaneの上の頂点群は固定されることになります。

今回はSurface Penetrationは設定しない事にします。

布の当たり判定をするコライダの設定

次にClothに設定したメッシュが接触するコライダを設定します。

Clothのメッシュは不特定多数のコライダとの接触は出来ず、あらかじめ接触するコライダを指定しておく必要があります。

今回はキャラクターに接触判定のコライダを取り付け、Clothのコライダに設定する事にします。

Clothが判定出来るのはCapsuleColliderか、SphereColliderを2つ用意し、スタート地点、エンド地点を指定します。

キャラクターをRigidbody+CapsuleColliderで動かしているのであれば、このCapsuleColliderをClothに設定すればいいですが、わたくしのキャラクターはCharacterControllerで動かしていますので、新たにCapsuleColliderをキャラクターに取り付けサイズを調整し、CharacterControllerのコライダとサイズを合わせておきます。

服との辺り判定のCapsuleColliderを取り付ける

↑がキャラクターのインスペクタです。

CapsuleColliderのIs Triggerにチェックを入れ物理的には当たらないようにします。

実際のコライダのサイズは、

CapsuleColliderのサイズをCharacterControllerと一緒にする

↑のようにCharacterControllerのコライダのサイズと同じにしておきます。

キャラクターにコライダを設定出来たら、PlaneのClothのCapsule CollidersのSizeを1にして、キャラクターのCapsuleColliderを設定します。

ClothにキャラクターのCapsuleColliderを設定

これで設定が出来ました。

キャラクターをPlaneに接触させて、確認してみましょう。

↑のようにPlaneが布のように少し動いており、キャラクターと接触するとその部分の形状が変わっているのがわかります。

Cloth機能すごいですね!

この記事ではClothの基本的な使い方をやりましたが、

UnityのClothを使うと、髪、鎧、マント等の動きを作成する事が出来、設定したコライダとの接触で形状を変化させる事も出来ます。

では、髪、鎧、マントにClothを設定してみました。

参考サイト

Unityマニュアル-Cloth-

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

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます