MeshClothの使い方

はじめに


このガイドはBoneClothの使い方の続きとなります。
そのためすでに説明された項目は省略して進めますので、このガイドの前にBoneClothの使い方を読むようにしてください。

MeshClothとは?


MeshClothはメッシュの頂点をクロスシミュレーションする手法です。
BoneClothよりもよりリアルな揺れを表現可能です。
ただしその分負荷が高くなります。

  • メッシュの頂点を操作することで揺れを表現します
  • メッシュにボーンが含まれていなくても利用可能です
  • 処理負荷が高いため大量に使用する場合はパフォーマンスに注意してください
  • 主にデスクトップPCやハイエンドコンソール機向きです

モデルインポーターの設定


MeshClothを利用する前に対象となるモデルのインポート設定を確認する必要があります。
MeshClothでは頂点を操作するためメッシュに対するRead/Write属性が必要です。

これは通常ではOFFとなっているため次のようにProjectビューで対象モデルを選択し、モデルインポーターのRead\WriteチェックをONに設定してください。

また、[Rig]の”Optimize Game Objects”はOffである必要があります。

その他の条件


  • スキニングメッシュの場合は1頂点の最大ウエイト数が4以下である必要あります。

MeshClothの導入


それではMeshClothを導入していきましょう。
ここではサンプルにあるUnityChanKAGURAのスカートを例にセットアップを解説します。

まずBoneClothと同じくHierarchyの右クリックメニューからMagica Clothコンポーネントを追加します。

コンポーネントはキャラクタールートの直下に配置するようにしてください。
これは通常Animatorコンポーネントの子になります。

そしてCloth Typeを[Mesh Cloth]に変更してください。
これでインスペクターがMeshCloth用に切り替わります。

MeshClothのインスペクターは次のようにMain設定部分のみがBoneClothと異なります。
それ以外の部分はBoneClothと同じです。

レンダーメッシュとプロキシメッシュ


MeshClothを扱う場合に重要となる概念がプロキシメッシュです。
MeshClothではレンダーメッシュ、つまり表示用メッシュをそのままシミュレーションに利用しません。
これは主に次の理由からです。

  • レンダーメッシュをそのまま利用すると頂点数が多すぎてシミュレーションの負荷が膨大になる
    (単純に見えるメッシュでも頂点数が1万を超えることが珍しくありません)
  • トライアングルの接続構造が大体においてシミュレーションに適さない
  • 表現の都合でメッシュが分割されているケースが多い
    (例:スカートの裏と表でマテリアルを分けるために分割など)

このような問題を解決するのがプロキシメッシュ(代理メッシュ)です。
プロキシメッシュはレンダーメッシュを元に頂点を削減した仮想メッシュです。
このプロキシメッシュは実行時にメモリ上にのみ存在します。

次の図は元のレンダーメッシュ(上)と簡素化されたプロキシメッシュ(下)の関係です。

下段のプロキシメッシュは頂点が削減され形状が簡素になっているのが分かると思います。
MeshClothではシミュレーションはすべてこのプロキシメッシュで実行されます。
そしてその結果が元のレンダーメッシュにフィードバックされ画面に表示される仕組みとなっています。
これはとても重要な概念であるため覚えておいてください。

レンダーメッシュの登録


ではプロキシメッシュの元となるレンダーメッシュを登録していきましょう。
登録できるのはSkinnedMeshRendererとMeshRendererです。
KAGURAのスカートは次のようにSkinnedMeshRendererが割り当てられています。

このSkinnedMeshRendererをMeshClothのSource Renderersリストに登録してください。

シーンビューにプロキシメッシュが表示されるようになります。

このプロキシメッシュは簡素化する前なので、まだレンダーメッシュと同じ構造をしています。

レンダーメッシュは複数登録することも可能です。
その場合はすべてのレンダーメッシュが1つのプロキシメッシュに結合されます。

リダクション


レンダーメッシュを登録した時点のプロキシメッシュはレンダーメッシュと同じ構造をしています。
このままシミュレーションを開始することも可能ですが、前述した通りプロキシメッシュはより簡素化して使用する方がパフォーマンスの点でも安定したシミュレーションの点でも利点があります。
この簡素化の作業を行うのがリダクションです。

リダクションパネル

簡素化は2つのスライドバーを組み合わせて行います。

Simple Distance 単純に近くにある頂点同士を結合します。
メッシュの構造などは考慮しません。
Shape Distance

メッシュの形状を元に近くにある頂点同士を結合します。
サーフェスとして接続されていない頂点は例え近くにあっても結合されません

シーンビューを見ながら調整

スライドバーを動かしてみてください。
スライドバーを動かすとリアルタイムでプロキシメッシュが簡素化されてシーンビューに表示されます。
シーンビューを見ながらプロキシメッシュを簡素化してみましょう。

どの程度簡素化すればよいのか?

これはメッシュの形状や長さ、どのようなシミュレーションを行いたいかにより変化するので一概に基準を設けるのは難しい問題です。
ただ目安として次の指標を参考にしてください。

  1. プロキシメッシュは簡素なほどパフォーマンスが良くなります
  2. レンダーメッシュの細かい突起物が無くなる程度には簡素化すべきです
  3. あまり簡素化しすぎると衝突判定が弱くなります。
    またレンダーメッシュとプロキシメッシュの乖離が大きくなり表示が不安定になる場合もあります。
完成したプロキシメッシュ

今回はプロキシメッシュのサーフェスがほぼ平坦になる程度まで簡素してみました。

頂点ペイント


プロキシメッシュの簡素化が終わったら次は各頂点の振る舞いについて決定する必要があります。
これを行うのが頂点ペイントです。
BoneClothと違いMeshClothの頂点ペイントは重要です。
それはMeshClothでは頂点属性がすべて無効で初期化されているためです。
そのためMeshClothでは必ず頂点ペイントを行い各頂点の属性を決定する必要があります。

固定属性と移動属性

ここで行うべき重要な作業は動かない頂点と動く頂点を明確に区分けすることです。
スカートの例では腰付近の頂点は動かさず、それ以外は自由に動けるようにするのが理想です。
動かない頂点を固定属性、動く頂点を移動属性と呼びます。

頂点ペイントの起動

頂点ペイントは次のペンマークのボタンで起動します。
起動するとシーンビューがペイントモードに切り替わります。

ペイントパネル

ペイント属性はペイントパネルを使って設定します。

Point Size 表示される頂点球の大きさ
Brush Size ペイントブラシのサイズ
Shape ONにするとプロキシメッシュの構造がギズモで表示されます
Culling ONにするとプロキシメッシュの頂点法線がシーンカメラと逆方向の場合に頂点球が表示されなくなります
Z test ONにすると頂点球が表示メッシュと深度テストされた結果が表示されます
Through ONにすると奥行きを無視してカーソル内のポイントを塗りつぶすことができます。
ブラシサイズも専用のものに変化します
Paint Attribute ペイントする頂点属性を選びます

頂点属性は3つのカテゴリに分かれています。

Move 移動属性
自由に移動できる頂点に設定します
Fixed 固定属性
移動しない頂点に設定します
Invalid 灰色 無効属性
シミュレーションから除外する頂点に設定します。
例えばワンピースのように腰から上は一切シミュレーションに関係しない場合は無効属性に設定することでパフォーマンスが向上します。
完成したペイント

では実際にペイントしてみましょう。
ペイントする属性を選択しマウスカーソルをプロキシメッシュに合わせてクリックorドラッグすることでペイントしていきます。

今回のスカートでは次のようにペイントしました。
ペイントが完了したらExitボタンを押してペイントモードを抜けてください。

これでプロキシメッシュに関する一通りの設定は完了です!

パラメータ設定


最後に動きを制御するパラメータを設定していきます。
ここではBoneClothの使い方と同じくプリセットから簡単に設定してみましょう。

次のようにPresetメニューから[skirt]を選択してください。

これでskirtのプリセット内容がパラメータに展開されました。

動作確認


それでは実行してみましょう!
実行中にキャラクターを動かしてスカートが揺れていれば成功です!

この次は?


今回はMeshClothの最低限の設定まで行いました。
ただ、アニメーションを見てわかるようにこのスカートには人体との衝突判定がまだ設定されていません。
そのためスカートが脚を突き抜けて移動してしまいます。
次の章ではこの衝突判定の設定について詳しく説明します。