ご存知のとおり Blender のヘアーパーティクルには「ヘアダイナミクス」という機能があって、重力や風などの物理演算を使って髪をアニメーションで動かす事ができます。 髪が物理演算で動くのは素晴らしいのですが、髪が体と衝突したときに突き抜けてしまうことがあります。

ヘアパーティクルが体を貫通しています
重力で落ちた髪が体を貫通してします

これを防ぐためにいろいろなことを試しました。 おかげさまで下記のように髪が体に沿って動くようになり、いろいろなポーズを取っても体を貫通しないようにすることができました。

腕を上げたポーズでも髪が体を貫通していません
胸周りや腕、肩でも髪が貫通していません

今回はヘアーパーティクルが体を貫通しないようにする方法をまとめておきたいと思います。

目次

  1. ヘアーパーティクルのウェイトとピン留め
  2. コリジョンを使った衝突判定
  3. フォースフィールドを使った擬似的な衝突判定
  4. 子パーティクルに「補間」を使っている場合

ヘアーパーティクルのウェイトとピン止め

ヘアダイナミクスをオンにしてアニメーションの再生ボタンを押せば物理演算でヘアーパーティクルが動きますが、動かしたくない部分は「ピン止め」で固定することができます。 例えば下記の画像では、頭のてっぺん付近からヘアーパーティクルを生やしています。

頭頂部から垂れているヘアーパーティクル

ヘアダイナミクスを有効にしてアニメーションさせると、下記のように頭頂部からまっすぐ髪が垂れて、頭部のメッシュを貫通しているのがわかります。

髪が重力で落ちて頭を貫通しています
※補足:ヘアーパーティクルとその発生源であるメッシュオブジェクト間に衝突判定はありません

そこで「ピン止めゴールの強さ」を上げて、もう一度アニメーションさせてみます。

ピン止めゴールの強さを調整
ピン止めによって頭頂部が固定されました

ピン止めによって頭頂部が固定され、メッシュを貫通しなくなりました。 ピン止めを強くすればするほど、可動部分が少なくなり髪が動かなくなります。 「ピン止めゴールの強さ」はヘアーパーティクルのウェイトに依存しています。

ヘアーパーティクルのウェイト

ヘアーパーティクルのウェイトはパーティクル編集モードでウェイトブラシを選択すると確認できます。 ウェイトが強いほどピン止めの効果が高く、ウェイトが「0」の部分はピン止めされません。

ピン止めは形をできるだけ崩したくない頭頂部や前髪などで使うと効果的だと思います。

コリジョンを使った衝突判定

Blender には「コリジョン」という衝突判定をしてくれるモディファイアがあります。 下記の画像では地面に見立てた平面にコリジョンモディファイアを設定して、上からパーティクルを落としています。 パーティクルが平面に接触すると跳ね返るのが確認できます。

床に接触したパーティクルが跳ね返っています

コリジョンは普通のパーティクルだときれいに表現できるのですが、ヘアーパーティクルだと使い勝手がいまいちです。

下記の画像では円柱にコリジョンを設定してあります。 これを髪の方へアニメーションで移動させてみます。

髪の近くにコリジョンを設定した円柱を用意
コリジョンに接触した髪が暴れる

コリジョンにヘアーパーティクルが接触するとかなり暴れます。 仕方がないのでシミュレーションの「品質のステップ数」を下げることにしました。

品質のステップ数を下げる
デフォルトでは「5」ですが「3」まで下げました

するとさっきよりは落ち着くのですが、それでも少し暴れて安定しません。 さらに品質のステップを下げると円柱を貫通するようになってしまいます。

いろいろ試したのですがオブジェクトのサイズを 5倍、10倍と大きくしていくと、それにともなって挙動が安定していきました。 でもモデルは実寸で作りたいのでこの方法は却下。 結局コリジョンでは満足のいく結果が得られなかったので、他の方法で衝突させることにしました。

フォースフィールドを使った擬似的な衝突判定

フォースフィールド」を使うことで、安定してヘアーパーティクルを擬似的に衝突判定させるとができました。

フォースフィールドを使った衝突判定ではきれいに髪と衝突する

でもよく見ると円柱と髪の間に大きな隙間があります。

髪と円柱の間には隙間が発生しています

実はこの隙間 ( 距離 ) がポイントで、この距離を狭くしていくと髪の挙動が安定しなかったり、衝突判定が甘くなります。 なのであえて隙間を開けるように設定します。

衝突させたいオブジェクトよりひとまわり小さいオブジェクトを作って、それにフォースフィールドを設定するようにすれば、隙間があいてるようには見えません。

衝突させたいオブジェクトよりひと回り小さいオブジェクトをつくりフォースフィールドを設定する
ひとわまり小さいオブジェクトを作りフォースフィールドを設定する

フォースフィールドの設定は下記のようにします。

フォースフィールドの設定項目
タイプ
シェイプ サーフェス
強さ 調整
減衰のパワー 10
Z方向 +Z
最大を使用 チェックを入れる
最大距離 0.04 以上

まずシェイプは必ず「サーフェス」にします。 「強さ」はアニメーションで確認しながら調整します。 弱いとメッシュを貫通するし、強すぎるとヘアパーティクルが暴れます。 減衰のパワーは基本的に「10」にしておきます。

ポイントは最大距離です。 僕のモデルは実寸なのですが、0.04 – 0.05 ( 4cm – 5cm ) の距離をとると安定します。 ですがこれはモデルによって大きさが違うのでそれぞれだと思います。

調整の手順としては、距離を 0.04 – 0.05 程度に設定しておき、強さをだんだん上げていくという感じで行います。

実際のフィギアでは下記のような感じで衝突判定用のオブジェクトを入れています。

フィギアに衝突判定用のひと回り小さなオブジェクトを内包させる
ひとまわり小さいオブジェクトを内包させています

子パーティクルに「補間」を使っている場合

基本的にコリジョンやフォースフィールドは親パーティクルに影響し、子パーティクルは親パーティクルの動きに追従します。 子パーティクル自体の衝突判定は計算されていません。

子パーティクルの表示方法を「シンプル」ではなく「補間」にしている場合は、下記のように髪が体を貫通してしまう場合があります。

補間された子パーティクルが体を貫通する

これは親パーティクルが肩の前後で分かれてしまっているのですが、その間を補間するように子パーティクルが表示されているからです。 このような場合は、パーティクルタブの「パーティング」を調整することで子パーティクルを各親パーティクルの方へ分けることができます。

子パーティクルをパーティングで分ける
補間された子パーティクルがパーティングされ貫通が緩和されました

今回はフォースフィールドを使って擬似的に衝突判定を作りましたが、本来はコリジョンを使うものだと思います。 ヘアーパーティクルのコリジョン設定でいい方法がないか、もうちょっと研究したいと思います。

参考にさせていただいたページ

Hair collisions setup blender 2.79 – YouTube

Blenderのヘアーパーティクルを使った髪型の作り方メモ