Blenderのヘアーカーブシステムは髪や毛を自由に造形できて便利できる機能ですが、メッシュとヘアーカーブを関連付ける工程でミスが起こることがあり、よくわからないバグがたまに起こります。
今回は、特に動物の毛(Fur)の柄どを表現するときに、マテリアルがうまくレンダリングされない問題で、自分が考えてみた原因・解決法を解説していますので、同じようなトラブルがある方はよければ参考にしてみてください。
この記事は、ヘアーカーブにテクスチャの色がうまく表示されない問題の原因・解決法を解説した中級者向けの記事です。
難易度
ヘアーカーブにテクスチャからマテリアルの色を付ける方法
動物の毛の柄などをマテリアルで表現する方法は、通常は、
UVMapで決められた場所にテクスチャペイントで柄を描いてテクスチャ画像を作成、そのテクスチャをシェーダーのColorにつなぐだけです。
何の問題もなければこれでテクスチャ画像の色がヘアーカーブにも転送され、毛の柄になって現れるのですが、たまにうまくいかないことがあります。

テクスチャがカーブに反映されない原因
例えば、Duplicate Hair Curvesノードで毛を増やした場合、テクスチャがカーブに反映されません。
なぜかというと、見てわかるとおり、そもそもヘアーカーブにUVの情報やメッシュの情報を渡すパラメータがないからです。

例えばDuplicate Hair Curvesノードを使うならば、増えた毛はメッシュにスナップすらされておらず、毛根が固定されていません。それをメッシュに埋め込むにはAttach Hair Curves to Surfaceノードで
- Surface
- Surface UV Map
を指定して設定する必要があります。
Interpolate Hair Curvesノードを使ってカーブを補間して生成する場合も、この2つの情報をセットするパラメータがあります。
この情報をセットして、ヘアーカーブにメッシュ・UVMapの情報を渡さなければ、そもそもテクスチャがちゃんと表現されないと思われます。

Interpolate Hair Curvesノードを使ってカーブを増量されてる方は、そのままでマテリアルがきちんと表現されることが多いのですが、Duplicate Hair Curvesノードを使っている人は、その後Attach Hair Curves to Surfaceノードや自作ノードなどでUVMap情報をカーブに渡す必要があります。
※ガイドカーブだけの場合も同様で、そのままではテクスチャがきちんとカーブに転送されていません
UVMapを設定してもうまく表示されない場合
ただ、Interpolate Hair Curvesノードなどを使って、メッシュ情報やUVマップ情報なども設定したのに、なぜかテクスチャの色がきちんとカーブに表現されていないという場合もたまにあります。
そもそも、膨大なカーブを、メッシュにスナップ、関連付ける場合に、ミスが起こりがちという理由がまず1つあるからだと思われます。
- メッシュやカーブを複製したとき
- ポリゴンがおかしいとき、あとで変形したとき
- …etc
様々な理由でカーブを補間生成したり、増量してメッシュに関連付けるときにミスが起こって、カーブに表面メッシュのUVがうまく転送されないってことがかなりよくあります。
たまに、これが理由でテクスチャがうまく表示されないこともありますが、大体の場合テクスチャはちゃんと表現されることも多いです。
つまり、そもそもカーブの量が多かったりしてたまにエラーが起こるよという感じで、安定してないってことだと思うんですよね。PCによっても違ってくると思われます。

上画像:Surface Deformノードに、UV情報の転送に失敗したカーブが71本あるよと教えてくれるエラーが出ているところ。
ヘアーカーブシステム、そもそも安定してない問題があるんじゃないか…?という疑惑が自分の中にあります…。いや、対策すれば全然使えるんですよ。便利だし。ただ、たまにエラーが出がちなのかも。
以前メッシュをヘアーカーブに変換するという記事でも書いたのですが、この「Invalid surface UVs on 〇〇 curves」のようなエラーを解決するために、Delete Geometryノードなどでアタッチに失敗しているカーブを削除するというようなノードを自作することができます。
Hair Attachment Infoノードがあり、そこにメッシュ、UVマップを指定すると、カーブのアタッチに成功しているかどうかを出力してくれるパラメータがあるのでそれを使います。
ただ、こうして一部のカーブを削除するなどの行為によっても、UV情報をカーブに転送するさいにエラーがおきて、うまくマテリアル表示できない、みたいな問題が起こりました…。

UVマップ情報をうまくカーブに転送するには
つまり、カーブへUVマップ情報がうまく転送できないことにより、マテリアルがうまく表示されない。そういう問題だと思われます。
ジオメトリノード作成
これを解決するために、自分でUVマップをカーブに転送するジオメトリノードを組んでいる方もいました。方法はいろいろあると思いますが、自分は、さきほどのHair Attachment InfoノードのAttachment UVを使用することにします。
さきほどの「エラーが出たカーブを削除する」ノードに、Capture Attributeノードを追加し、Hair Attachment InfoのAttachment UV出力をAttributeにつないで、Group Outputに渡します。

※モディファイアプロパティで設定しやすいようにメッシュとUVマップの指定はGroup Inputにつないで設定できるようにしています。
Capture Attributeノードで、残ったカーブに、アタッチしてる場所のAttachment UVを持たせて、その属性をマテリアルでも使えるようにしています。モディファイアプロパティで出力属性に名前をつけることができるので、簡易にauvとしています。
これをSurface Deformモディファイアの前にはさみます。
マテリアル設定
マテリアル設定で、テクスチャ座標となるVectorに、さきほど設定したAttachment UVを設定していきます。
AttributeノードでAttachment UVにつけた名前を入力し、Vector出力をつなぎます。

まとめ
以上のような設定で、大体安定してきちんとマテリアルが表示されるようになります。
おそらく、そもそも持ってたUVマップ情報が、いろいろなジオメトリノードを重ねることで、どこかでエラーがおきてうまく渡せなくなったり、情報が壊れてしまっていると思われます。
なので、最後のSurface Deformノード前に、Attachment UV出力を使って、実際アタッチに成功しているカーブに、確実にアタッチしている部分のUVを渡すという方法で解決できます。
自分は今のところこの方法で安定して動作していますが、全ての場合にうまくいくかは正直なんとも言えません…。
ただもしうまく表示されないという方は、
- UVマップ情報をきちんと渡しているか
- ノードにエラーが出てないか
など確認してみて、どうしようもなかったら、Attachment UVなども使ってみることをオススメします。
ただ、最初に言いましたように、そもそもヘアーカーブシステムはエラーとかバグが起こりがちでは…?という感覚もあり、全然直らないときはカーブを付け直すのが一番確実です…。どこかでデータが壊れている気がするんですよね。メッシュを編集して変形したりすると高確率でバグったりするので。(ただバグを再現しようと思ってめちゃくちゃに構ってもバグらないときもあり、運とか、そのときの条件、データの安定さとかにもかなり左右されるみたいです。)
ヘアーカーブガイド
ヘアーカーブ記事をまとめて、どこから読めばいいか導線を書いたガイド記事です。ヘアー、ファー、ヘアーカード作成まで。


コメント