ご存知のとおり Blender のヘアーパーティクルには「ヘアダイナミクス」という機能があって、重力や風などの物理演算を使って髪をアニメーションで動かす事ができます。 髪が物理演算で動くのは素晴らしいのですが、髪が体と衝突したときに突き抜けてしまうことがあります。
これを防ぐためにいろいろなことを試しました。 おかげさまで下記のように髪が体に沿って動くようになり、いろいろなポーズを取っても体を貫通しないようにすることができました。
今回はヘアーパーティクルが体を貫通しないようにする方法をまとめておきたいと思います。
目次
ヘアーパーティクルのウェイトとピン止め
ヘアダイナミクスをオンにしてアニメーションの再生ボタンを押せば物理演算でヘアーパーティクルが動きますが、動かしたくない部分は「ピン止め」で固定することができます。 例えば下記の画像では、頭のてっぺん付近からヘアーパーティクルを生やしています。
ヘアダイナミクスを有効にしてアニメーションさせると、下記のように頭頂部からまっすぐ髪が垂れて、頭部のメッシュを貫通しているのがわかります。
そこで「ピン止めゴールの強さ」を上げて、もう一度アニメーションさせてみます。
ピン止めによって頭頂部が固定され、メッシュを貫通しなくなりました。 ピン止めを強くすればするほど、可動部分が少なくなり髪が動かなくなります。 「ピン止めゴールの強さ」はヘアーパーティクルのウェイトに依存しています。
ヘアーパーティクルのウェイトはパーティクル編集モードでウェイトブラシを選択すると確認できます。 ウェイトが強いほどピン止めの効果が高く、ウェイトが「0」の部分はピン止めされません。
ピン止めは形をできるだけ崩したくない頭頂部や前髪などで使うと効果的だと思います。
コリジョンを使った衝突判定
Blender には「コリジョン」という衝突判定をしてくれるモディファイアがあります。 下記の画像では地面に見立てた平面にコリジョンモディファイアを設定して、上からパーティクルを落としています。 パーティクルが平面に接触すると跳ね返るのが確認できます。
コリジョンは普通のパーティクルだときれいに表現できるのですが、ヘアーパーティクルだと使い勝手がいまいちです。
下記の画像では円柱にコリジョンを設定してあります。 これを髪の方へアニメーションで移動させてみます。
コリジョンにヘアーパーティクルが接触するとかなり暴れます。 仕方がないのでシミュレーションの「品質のステップ数」を下げることにしました。
するとさっきよりは落ち着くのですが、それでも少し暴れて安定しません。 さらに品質のステップを下げると円柱を貫通するようになってしまいます。
いろいろ試したのですがオブジェクトのサイズを 5倍、10倍と大きくしていくと、それにともなって挙動が安定していきました。 でもモデルは実寸で作りたいのでこの方法は却下。 結局コリジョンでは満足のいく結果が得られなかったので、他の方法で衝突させることにしました。
フォースフィールドを使った擬似的な衝突判定
「フォースフィールド」を使うことで、安定してヘアーパーティクルを擬似的に衝突判定させるとができました。
でもよく見ると円柱と髪の間に大きな隙間があります。
実はこの隙間 ( 距離 ) がポイントで、この距離を狭くしていくと髪の挙動が安定しなかったり、衝突判定が甘くなります。 なのであえて隙間を開けるように設定します。
衝突させたいオブジェクトよりひとまわり小さいオブジェクトを作って、それにフォースフィールドを設定するようにすれば、隙間があいてるようには見えません。
フォースフィールドの設定は下記のようにします。
タイプ | 力 |
シェイプ | サーフェス |
強さ | 調整 |
減衰のパワー | 10 |
Z方向 | +Z |
最大を使用 | チェックを入れる |
最大距離 | 0.04 以上 |
まずシェイプは必ず「サーフェス」にします。 「強さ」はアニメーションで確認しながら調整します。 弱いとメッシュを貫通するし、強すぎるとヘアパーティクルが暴れます。 減衰のパワーは基本的に「10」にしておきます。
ポイントは最大距離です。 僕のモデルは実寸なのですが、0.04 – 0.05 ( 4cm – 5cm ) の距離をとると安定します。 ですがこれはモデルによって大きさが違うのでそれぞれだと思います。
調整の手順としては、距離を 0.04 – 0.05 程度に設定しておき、強さをだんだん上げていくという感じで行います。
実際のフィギアでは下記のような感じで衝突判定用のオブジェクトを入れています。
子パーティクルに「補間」を使っている場合
基本的にコリジョンやフォースフィールドは親パーティクルに影響し、子パーティクルは親パーティクルの動きに追従します。 子パーティクル自体の衝突判定は計算されていません。
子パーティクルの表示方法を「シンプル」ではなく「補間」にしている場合は、下記のように髪が体を貫通してしまう場合があります。
これは親パーティクルが肩の前後で分かれてしまっているのですが、その間を補間するように子パーティクルが表示されているからです。 このような場合は、パーティクルタブの「パーティング」を調整することで子パーティクルを各親パーティクルの方へ分けることができます。
今回はフォースフィールドを使って擬似的に衝突判定を作りましたが、本来はコリジョンを使うものだと思います。 ヘアーパーティクルのコリジョン設定でいい方法がないか、もうちょっと研究したいと思います。