使用バージョン: Blender 2.81
髪のボーンを物理演算で揺らしたいと思っていろいろ試したのですが、クロスシミュレーションと IK を使った方法に落ち着きました。 リジッドボディとジョイントを使う方法も試したのですが、そちらと比べると実装が比較的簡単で作業数も少ないのでおすすめです。

またボーンを物理演算で揺らすだけの簡易版と、ロール ( ひねり ) まで再現するロール版の二種類試してみました。 ポニーテールやツインテールのテール部分のような円柱っぽい髪なら簡易版、ストレートのロングヘアなど、ある程度長さがあって平べったい髪の束の場合はロール版というように使い分けるといいと思います。
今回はサンプルとして下図のようなフィギアとポニーテールのテール部分を用意したので、これを使って説明していきます。 このサンプルの髪にはすでにボーンが設定されていて、髪のボーンの親は頭部のボーンになっています。

目次
ボーン位置にクロスシミュレーション用のオブジェクトを配置
まずはボーンに合わせて、クロスシミュレーション用のオブジェクトを配置します。 このオブジェクトは八角形の円柱で作ります。 Shift + A キーから円柱を追加して、頂点数を「8」の八角形にし、髪のボーンの先頭に配置します。

編集モードで円柱を髪のボーンの最下部まで伸ばし、Ctrl + R キーでボーンの数に合わせて分割します。

分割したら各ボーンのヘッドやテールの位置に合わせて、各頂点を移動します ( 下図参照 )。

次に円柱を分割している各頂点を、上から順番に頂点グループに設定します。 分かりやすいように上から 1st、2nd、3rd というように名前を付けておきます。


最後にこの円柱にクロスシミュレーションを設定します。 このとき、円柱が落下してしまわないように、一番上の頂点グループ「1st」を「シェイプ」の「固定グループ」に設定します ( 下図参照 )。

ボーンにIKを設定
次にボーンに IK を設定していきます。 アーマチュアを選択してポーズモードにし、髪のボーンをひとつ選択します。 「ボーンコンストレイトを追加」から「インバースキネマティクス(IK)」を追加して、ターゲットには円柱 (Cylinder)、頂点グループにはボーンのテール部分 ( 下部 )にある頂点グループを指定します。

例えば一番上のボーンでは頂点グループ「2nd」を、二番目のボーンでは「3rd」をそれぞれ指定します。 そして IK の影響範囲である「チェーンの長さ」は「1」にします(下図参照)。 これをすべての髪のボーンに設定します。

このままだと円柱 (Cylinder) はとこにもペアレントされていませんし、髪のボーンは IK で縛られているため向きを変えることもできません。 なので髪の向きを変えられるようにコントロール用のボーンをひとつ追加して、そのボーンに円柱をペアレントします。

編集モードで髪の一番上のボーンのヘッド部分を選択して、Shift + S キーから「カーソル → 選択物」にして 3D カーソルを移動します。 そのまま Shift + A キーで新しくコントロール用のボーンを追加します。 今まで髪の一番上のボーンは頭のボーンの子になっていましたが、新しく追加したコントロール用のボーンに「オフセットを維持」でペアレントします。
次に新しく追加したコントロール用のボーンを、頭のボーンに「オフセットを維持」でペアレントします。
最後に円柱をコントロール用のボーンにペアレントしていきます。

オブジェクトモードで円柱 → アーマチュアの順に選択して、ポーズモードに変更します。 コントロール用のボーンだけをクリックしてアクティブにして、Ctrl + P キーから「ボーン」でペアレントします。
これでポーズモードで髪の向きを変更できるようになりました。

アニメーションさせてみると、クロスシミュレーションに合わせてボーンが揺れるのが確認できます。

ベンディングボーンを併用
次に髪のボーンをベンディングボーンにして、しなやかに曲がるようにします。 ベンディングボーンにする際には、ボーンのビューポート表示を「Bボーン」にしておくと分かりやすいと思います。

ボーンプロパティから「ベンディングボーン」のセグメントを調整します。

今回はセグメントを「3」に設定してみました。

各ボーンが 3つに分割されるので、通常のボーンよりしなやかに動くようになりました。
コリジョンを設定して完成
最後に体や頭にコリジョン ( 衝突判定 ) を設定します。


今回は頭と体にのみオブジェクトを配置して、それぞれ体のボーン、頭のボーンにペアレントしました。
他にもコリジョンを設定した障害物を配置してテストしたのが下記の図です。

これで簡易版は完成です。 弱点としては、IK で位置だけを追っているので前述したようにボーンのひねりはありません。 ポニーテールやツインテール部分には十分だと思いますが、ひねりが欲しい場合はもうひと手間必要になります。
髪のひねりを表現したい場合の手順
ここからはボーンのひねりが確認しやすいように、髪の形を下図のような平べったい形状に変更して進めていきます。

この髪を簡易版のままアニメーションさせると、髪のひねりはなく前後左右に揺れているだけなのがわかります。

それではこれに髪のひねりを加えていく作業に移ります。
ボーンの軸に合わせてエンプティを配置
IK の「回転」を利用すればスマートに実装できるかと思ったのですが、頂点グループをターゲットにしているためうまくいきませんでした。 そこで各ボーンのテール部分に「エンプティ」を配置して、座標軸を取得するという方法をとりました。
まず準備として平べったい髪の形に合わせて、円柱 ( Cyrinder ) の形状も左右に少し広げておきます。
次に Shift + A キーからエンプティを配置していきます。

すべてのボーンにエンプティを配置する必要はなく、ひねりがほしい部分にだけ配置します。 だいたいは中間から下よりになると思います。 今回は下から 4つ、各ボーンのテール部分に配置しました。 またエンプティは「十字」ではなく「座標軸」を使ったほうが分かりやすいです。
次に配置したエンプティの座標軸をボーンに合わせていきます。 ボーンのビューポート表示から「座標軸」を表示しておくと作業しやすいです。
髪のボーンの座標軸は Y 軸が下を向いているはずですが、追加したばかりのエンプティは Z 軸が下を向いているはずです。 これを合わせていきます。

座標軸を合わせたら、エンプティを円柱に頂点ペアレントしていきます。 オブジェクトモードでエンプティ → 円柱の順で選択して編集モードに移ります。

左右両端の頂点と、前 ( または後ろ ) の 3つの頂点を選択してから Ctrl + P キーで頂点ペアレントします。
他のエンプティも同様に、円柱に対して頂点ペアレントします。
回転コピーでエンプティの回転をトレースする
最後に髪の各ボーンにボーンコンストレイントから「回転コピー」を追加して、「ターゲット」に配置したエンプティを指定します。

エンプティーはボーンのテール部分 ( 下部 ) にあるものを指定します。

これで作業は完了です。 アニメーションさせてみると下図のように髪のひねりが反映されているのが確認できます。

今回の記事はここまでです。 最後まで読んでいただきありがとうございました!