お世話になっております。
GroomをMayaで作成し、MetaHuman タブにある Groom Exporter で、GroupID を9個にし、UE5.71にインポートしました。
その後、Groomのボーン制御用に、Mayaで板のポリゴンを使って簡易メッシュを作り、ボーンを7列作成し簡易メッシュとバインドし Skeleton MeshとしてUEにインポートしました。
更に、Groom Asset から Dataflowを作成し、Control Rig で動くのを確認したのですが、GroomのGroupID 9個に対しボーンを個々に指定したいのですが、どのようにDataflowを修正したらいいか分かりません。
お手数ですがご教授ください。よろしくお願いいたします。
[Attachment Removed]
お世話になっております。
UEのGroomDataflowでは、まず前提として「GroupIDとボーンを直接紐付ける」仕組みはありません。なので、GroupIDごとにボーンを指定するやり方はできません。
やり方としては、各Groupを個別に扱って、その選択ごとにスキニング用のウェイトを作っていく形になります。つまり「このGroupはこのボーンに効かせたい」というのを、マッピングではなくウェイトで表現します。Groupが9あってボーンが7でも問題なくて、いくつかのGroupが同じボーンを共有する形になります。
そのあと、それぞれで作ったウェイトをまとめて、最後にSplineSkinningに変換します。通常のスキニングよりも、このケースではSplineの方が自然につながるので、基本的にはこちらを使うのがいいです。
一番難しいのは、ボーンを共有しているGroup同士の境界のなじませ方で、ここはウェイトの調整が必要になります。ただ、Dataflow上であとから調整できるので、様子を見ながら直していけば大丈夫です。
まとめると、GroupIDで直接制御するのではなく、Groupごとにウェイトを作って、それをSplineSkinningに使う、という流れになります。
[Attachment Removed]
こちらに関して追加の質問をさせていただけましたら幸いです。
>一番難しいのは、ボーンを共有しているGroup同士の境界のなじませ方で、ここはウェイトの調整が必要になります。ただ、Dataflow上であとから調整できるので、様子を見ながら直していけば大丈夫です。
こちらの点に関しまして、まさにプロジェクトにて問題となっているのですが、
こちらはEditSkinWeightsノードなどを使用した手作業での調整を想定しているという理解で正しいでしょうか?
その場合、髪の毛のウェイト調整は多数のガイドの調整が必要となるため手作業は現実的ではないと考えているのですが、なにか良い方法などはありますでしょうか?
また、問題の具体的な詳細を以下にご共有させていただきます。
Groomの骨制御を行うために、
以下URLを参考に、データフローを用いてウェイト調整を行った場合、
https://dev.epicgames.com/documentation/metahuman/hair\-art\-directability
以下画像の様に、ガイド同士が至近距離に存在する場合、
UnrealのDefaultではウェイトが混在してしまい髪の毛が伸びるような問題が発生していまいます。
[Image Removed]
こちらではこの問題に対応するため、
以下のような形でGroomのGroup IDを用いてのフィルタリングノードを追加し、
[Image Removed]上記画像におけるCustomのように、髪のウェイト転写先を切り分ける実装を行っております。
こちらの要望としては、同様のノードの実装予定があればありがたいのですが、
そのようなご予定、もしくは別の手法にて同様の対応を行うような方法はありますでしょうか?
こちらで作成した拡張ノードプラグインと、サンプルプロジェクトを添付させていただきます。
LV_PigHairsをオープンした後、NewLevelSequenceを開いていただくことで問題をご確認いただけます。
ご確認いただけましたら幸いです。
よろしくお願いいたします。
[Attachment Removed]
お世話になっております。
手動調整について: EditSkinWeightsによるガイドの個別調整は現実的ではありません。より効率的な方法があります。
GroupIDフィルタリングについて: 専用ノードの実装予定は現時点ではありません(5.8以降も含め)。ただし、既存のノードで同様の処理が可能です。GroomのGroupIDはコレクション内のトランスフォームとして表現されているため、名前またはインデックスで選択し、頂点セレクションに変換した上で、Transfer Skin Weightノードに入力することができます。
境界部のブレンドについて: セレクションをfloat属性に変換してブレンドマップとして使用することで、ボーンを共有するグループ間のウェイトをより滑らかにブレンドできる可能性があります。
まとめると、推奨フローは以下の通りです:
- グループのトランスフォームを名前またはインデックスで選択
- 頂点セレクションに変換
- Transfer Skin Weightノードに渡す(必要に応じてfloat属性としてマップに使用)
[Image Removed] [Image Removed]お手数ですが、よろしくお願いします。
[Attachment Removed]
お世話になっております。
TransformよりGroupIDが取得できるとのことでありがとうございます。
ご提案いただいたCollection Select Transform Stringノードにてこちらの望む挙動を達成することができました。
ありがとうございます。
また、もう一点ご提案いただいた以下の情報に関してなのですが、
>境界部のブレンドについて: セレクションをfloat属性に変換してブレンドマップとして使用することで、ボーンを共有するグループ間のウェイトをより滑らかにブレンドできる可能性があります。
こちらに関しては実際にどのようなノードの構成を行うと良いでしょうか?
5.7.4時点ではCollection Selection To Attributeノードが見当たらないようなのですが、こちらは5.8にて実装予定でしょうか?
また、ご共有いただいた画像のノードの下部にて各ノードごとのデバッグ表示がされているかと思うのですが、こちらの表示方法も合わせてご教示いただけましたら非常にありがたく思います。
上記ご確認の方お願いさせていただけましたら幸いです。
よろしくお願いいたします。
[Attachment Removed]
お世話になっております。
解決してよかったです!
Collection Selection To Attributeノードに関しては申し訳ないです。5.7ではなく5.8に入る予定です。
Debugに関しては、ノードに右クリックで、WatchThisValueを選択してください。
[Image Removed]よろしくお願いします。
[Attachment Removed]
お世話になっております。
Collection Selection To Attributeノードに関して承知いたしました。
また、Debugに関してもありがとうございます。OutPinに対して行えばよかったのですね。便利な機能をありがとうございます。
こちらのケースに関してクローズいただいて大丈夫です。
今後とも何卒よろしくお願いいたします。
[Attachment Removed]