以前、ヘアーカードを作成する記事を書いたんですが、ヘアーカードを作成できても、頭に並べるのがとても難しくて手間がかかります。
そこで、ジオメトリノードで、ヘアーカードをヘアーカーブに沿わせるノードを組んで、簡単に思い通りに並べる方法を解説します。
ヘアーカーブならブラシで簡単に形や場所を変えられるし、大量のヘアーカードを短時間でキレイに並べることができます。
おくれ毛表現などで数枚のヘアーカードを少し髪型に沿わせたい場合にも使えるのでオススメです。
この記事は、Blenderでヘアーカードをヘアーカーブに沿わせるジオメトリノードの組み方を解説している中~上級者向けの記事です。
難易度
※このノードセットはGumroadで無料配布もしております。最後にアドレスなど記載していますので良ければ見ていってください。
これから作るジオメトリノードについて
アイディア元
ヘアーカード作ったはいいけど、頭に沿わすのがめちゃくちゃ難しいことに気づき、何かいい方法はないのかと方法を探していたところ、Daniel Bystedtさんの動画を見つけました。ジオメトリノードでヘアーカードをヘアーカーブに沿わせるノードを組んでおられて、しかもかなりパラメータが多く、内部のシステムも複雑で機能性が高いものを無料で配布しておられます。
ノードを作成したくない、パラメータが多く機能的なノードが欲しい方は以下の紹介動画のリンクよりBlenderファイルを手に入れることができます。
自分は、ここまで機能が高いものではなく、ただ板ポリを沿わせられるノードが組めればいいと思ったので簡単なものを自作することにしました。内部のシステムはおそらく全く違うと思います。Daniel Bystedtさんのノードを見ても仕組みが難しくてよくわからなかったため、自分が使いやすい、超簡単なシンプルなノード構成にしたからです。(そのため、法線の揃い方などは複雑になってくると自分のはいつか破綻するのかもしれませんが、いまのところシンプルな髪型の場合は破綻なく使えております)
このような、簡易版であるということをご了承ください。

ヘアーカーブにヘアーカードを沿わせるジオメトリノードを作成する
ヘアーカーブのSurface Deformモディファイアの後にジオメトリノードを追加してください。(このノードでメッシュが作成されるのでSurface Deformは機能しなくなります。)
ノードの全体像は下図のようになります。

- カーブの数だけ出したヘアーカード
- ヘアーカーブの数だけヘアーカードを複製して、For Each Elementノードに渡します。
- ヘアーカードをカーブに沿わす
- For Each Elementノードの中です。ここで1つのヘアーカードをヘアーカーブに沿わせる処理をすることで、あとのヘアーカードも同様の処理がなされます。長いのでAとBの部分に分けて説明します
- 沿わせるメッシュの法線に揃えたヘアーカーブ
- ヘアーカードに沿わせるヘアーカーブとして参照するカーブを渡している部分です。そのカーブの方向を調整して、ノーマルを近くのメッシュの法線にあわせます。こうすることでヘアーカードがねじれてぐちゃぐちゃになることを防いでいます。
- 仕上げのノード
- マテリアルを設定したり、メッシュを分割したりしています。
以下に順番に詳細を解説していきます。部分を解説していくので、以上の図や説明を見て全体のつながりを把握してください。
①カーブの数だけ出したヘアーカード
ヘアーカーブの数だけヘアーカードを複製して、For Each Elementノードに渡します。
Object Infoノードにヘアーカードオブジェクトを設定します。Transform Geometryノードはヘアーカードをスケールさせて調整する用に挟んでいます。
Domain Sizeノードでカーブの数を取得して、Duplicate Elementsノードでヘアーカードを同数複製します。

②ヘアーカードをカーブに沿わす
Aの部分
ヘアーカードをInstanceとしてFor Each Elementノードに渡したあと、Realize Instancesで実体化します。ここから変形させるためにSet Positionノードへつなげています。
Bounding Boxでヘアーカードの最小、最大サイズを取得してMap Rangeで0~1までの値に正規化します。さらにSeparate XYZノードでY軸方向の値だけ出力してSample CurveノードのFactorに入れます。
Sample Curveノードではヘアーカーブの1本分の情報を取りたいので、For Each ElementノードからのIndexをCurve Indexとして使います。
これでインデックスが同じ数のヘアーカーブにヘアーカードが沿うことができるようになります。
Sample CurveノードのCurvesにはヘアーカーブのカーブオブジェクトをわたしますが、また後述します。

Bの部分
Sample Curveからの続きです。ヘアーカーブのカーブ1本に沿って、ヘアーカードの位置をSet Positionで修正しています。

さきほどAの部分でヘアーカードのY軸(縦方向の値)を0-1に正規化した値をSample CurveにFactorとして入れたので、
板ポリ上のY位置に応じて、カーブのどの位置を参照するか決めることができるようになりました。
つまり、板ポリの縦方向と、カーブの長さが対応するようになったということです。
なので、板ポリの縦方向はカーブの位置と対応しているので、Positionとしてそのまま出力。今の時点ではただの線しか出ていません。
横方向Xは、カーブのTangent×Normal(※1)で出せるので、それをスケールして、横方向の位置を取得できるようにします。こうして縦×横の平面が出来ます。
そして厚み方向のZ方向は、カーブのNormalベクトルで出せますので、それに板ポリのZ方向の厚みをスケールして、これで立体を再現できたことになります。
板ポリの厚みって何だ?板ポリは平面では…?と思う方がいるかもしれませんが、板ポリは少し折り曲げて厚みをつけて立体化しておいた方が自然になります。右図のように中央付近を少し折り曲げておいたり、根本部分を少し曲げておくと、髪の付け根部分が自然に見えたりします。
あとでXYZ方向にスケールをかけることで、ヘアーカードの大きさを全体一律で簡単に変えることができるようになります。
というわけで、XYZ方向の立体の位置をAddノードで足し合わせて、Set Positionノードに入力し、ヘアーカードを変形します。

③沿わせるメッシュの法線に揃えたヘアーカーブ
Sample Curveに参照するカーブを渡している部分です。
カーブを渡す前に、Normal方向を近くのメッシュの法線にあわせます。こうすることでヘアーカードがねじれてぐちゃぐちゃになることを防いでいます。
Group InputのGeometryから出てるのはヘアーカーブそのものです。Reverse Curveでカーブ方向を反転し(なぜかデフォルトでは逆になっていた)、Set Curve Normalでノーマル方向を近接面の法線に合わせています。(Set Curve Tiltでねじれを一応0°に直していますがあまり意味ないかもしれません…)
近接面のノーマル方向を取得するのにSample Nearest Surfaceノードを使っています。
Object Infoに頭部メッシュなど、髪が付くオブジェクトを設定し、それを法線サンプリングのメッシュにつなぎます。ValueとしてはNormalノードからNormalを取得します。

④仕上げのノード
For Each Elementノードから出たヘアーカードメッシュを調整しているノード群です。
見たまんまですが、分割したりシェイドスムースでなめらかにしたり、Set Materialノードでマテリアルを設定したりしています。

完成
これで完成です。ノード内にあったように、Group Inputで値を外部から変更できるようにすると、ヘアーカードや頭部メッシュ、ヘアーカードのスケールなどをパラメータとして調整可能なノードが出来上がります。

右図がジオメトリノードを使ってヘアーカードを並べた頭部の図。
ヘアーカードに設定した板ポリの根本を少し内側に曲げると、生え際部分も少し内側に曲がり、自然に見える。
板ポリを変形させるだけですぐ全体に反映されるので調整も楽にできます。

ちなみに、上部メニューの
Object > Convert > Mesh
でメッシュに変換でき、そこから自由にメッシュ変形して形の調整ができます。
数が多くてヘアーカードを並べられない、頭に沿って綺麗に並べたい、という場合にとても便利なのでぜひ使ってみてください。

無料配布
このノードセットをGumroadというサイトで無料配布しています。

左図のサムネです。下のサイトから商品ページへ行き、メールアドレスと0円って値段いれるだけでBlenderファイルを受け取れます。
注意書きとして、カーブを生やしただけだと細くなってヘアーカードがよく見えないので、ちょっとブラシでグルーミングして見えるようにしてから使うと使いやすいです。
試してみようかなって方はダウンロードしてみてください。



コメント