HoudiniからUE4へのAlembic Groomインポート

#はじめに
この記事は[Unreal Engine 4 (UE4) その2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/ue4_due)の9日目の記事になります。

UE4は4.24からAlembic Groomのインポートに対応し、毛の一本一本を正確にシミュレート&レンダリングすることによりフォトリアルなHair&Far表現が可能になりました。
最近ではWeta Digitalのショートムービーが話題になりましたね。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">弊社Epic GamesはWeta Digita社と協力して、この短編アニメーションを Unreal Engine 4 で制作しました。この動画では UE4.26 にて全てのユーザに提供される新しいHairとFur機能を使用しています。また、Control Rig や SequencerのAnimation機能、そしてMovie Render Queueが活用されています。 <a href="https://twitter.com/hashtag/UE4?src=hash&amp;ref_src=twsrc%5Etfw">#UE4</a> <a href="https://t.co/RTSju5ODSp">pic.twitter.com/RTSju5ODSp</a></p>&mdash; アンリアルエンジン (@UnrealEngineJP) <a href="https://twitter.com/UnrealEngineJP/status/1326728926681509889?ref_src=twsrc%5Etfw">November 12, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
現在最新の4.26ではProduction Redyとなり、製品での使用も可能になりました！

#概要
UE4へのAlembic Groomインポート、運用に関しては公式ドキュメントに詳しく書いてあります。
[髪のレンダリングとシミュレーション](https://docs.unrealengine.com/ja/WorkingWithContent/Hair/index.html)

UE4向けのGroomアセットの作成、インポートフローについてもドキュメントにまとまっていますが、Mayaベースの解説となってます。
[XGen による毛髪や、体毛、毛皮のレンダリングに関するガイドライン](https://docs.unrealengine.com/ja/WorkingWithContent/Hair/XgenGuidelines/index.html)

なので今回はHoudiniからUE4へのインポート手順やアトリビュートの受け渡しなどについてまとめてみようと思います。

#準備
UE4プロジェクトでHair Groomを有効にするには以下の設定を行っていただく必要があります。
###Project Settingsを開き、Rendering > OptimizationsでSupport Compute Skin Cacheを有効にする。
![2020-12-07_22h38_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/560e2e76-874e-0273-9c7c-678c5872b6dc.png)
###プライグインブラウザを開き、Alembic Groom ImporterとGroomプラグインを有効にする。
![2020-12-07_22h42_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/05327a97-c16b-2af3-919c-c4bc05d290b0.png)
再起動を要求されるので再起動します。これでUE4側の準備は完了です。

#HoudiniからUE4へのAlembic Groom受け渡し
###HoudiniでHairを作成する
まずはいつものブタさんに簡単に毛を生やしてみましょう。
そのまま作るとUE4とスケールが合わないので、事前に100倍スケールしておくといいです。
今回はUE4へのインポートがメインですので、この辺りは省略します。
![2020-12-07_23h06_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/67ccb0e2-3857-7c82-108d-90ac3d5c7a1f.png)
気持ち悪いですね！

###Alembicでエクスポートする
作成したFar(Hair)はジオメトリノードHairgen内でRop Alembicノードを使用してエクスポートします。
![2020-12-07_23h12_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/303b9648-efae-7743-f9f4-556b4a727cd2.png)
![2020-12-07_23h12_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/15aed9fb-e055-d146-54c3-4898c8138c9c.png)
微調整のためにいろいろ繋がってますが、HAIRSピン以下につながっていれば大丈夫です。
特に設定は変更せず、エクスポートしたいパスを入力してエクスポート。
![2020-12-07_23h59_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/408a0612-1e88-2dfa-7f1d-fa132696fa70.png)
###UE4にインポートする
エクスポートしたAlembicはそのままインポートすればGroomとしてインポートされます。
以下のようなウィンドウが出ますが、Houdiniで作成したAlembicをインポートする場合、RotationにX-90、Z180を入れておくと回転が合います。
![2020-12-08_00h03_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/17d266e4-d8d8-afa5-73a1-aed8b0e0b7ee.png)
別途スキンメッシュもインポートし、同じ座標に置けばピッタリ合うはずです。
![2020-12-08_00h07_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/33db47a8-ea3b-20dc-a7b0-89a2a526b03a.png)
これでHoudiniからUE4へのAlembic Groomのインポートが完了しました。

#補足情報
###MeshのUVを受け渡す
せっかくなのでもう少し補足情報を。
UE4のマテリアルノードHair Attributesノードでは、Groomに含まれている各種Attributeを取得できます。
![2020-12-08_02h50_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/10388c2a-71c9-4890-b785-a8086abbf33d.png)

このなかのRoot UVは主に元となるメッシュのUVを格納し、Hairにテクスチャをマッピングする用途で使います。
こちらも[公式ドキュメント](https://docs.unrealengine.com/ja/WorkingWithContent/Hair/XgenGuidelines/index.html)で解説されていますが、やはりMayaベースのものとなってますのでHoudiniでの受け渡し方法も書いておきます。

受け渡すAttributeには命名規則があり、Root UVは"groom_root_uv"という名前でアトリビュートを作成します。
デフォルトでPrimitive AttributeとしてUV情報が転送されているはずなので、ジオメトリノードのhairgen内でAttribute RenameやWrangleを使ってUV情報を持った"groom_root_uv"を作成します。
![2020-12-08_02h31_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/7e9a7ad4-b05b-6093-a611-3ffce7924c33.png)

Rop AlembicノードのGeometryタブ、Additional UV Attributesにgroom_root_uvを入力します。
![2020-12-08_02h41_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/a8858a5d-9edc-09d5-86b3-559fa55f2849.png)
これでgroom_root_uvがRoot UVから取得できるようになります。
試しにRoot UVをBase Colorに直接接続してみると、ちゃんとUVが来ているかどうか確認できます。
(コンソールコマンド"r.HairStrands.StrandsMode 3"でも確認可能です。)
![2020-12-08_00h23_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/b62e3d5e-cbae-624b-49cf-189249d3b09a.png)
![2020-12-08_02h47_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/67c55bd8-7f3f-996b-76c8-db72b591596a.png)
これで好きなテクスチャをマッピングできますね。
ちなみにgroom_root_uvが作成されていない場合は、spherical mappingを使用して自動的にUVが生成されます。

以上です。
皆さんもHoudiniとUE4でたくさんモフモフを作って遊んでみましょう！
明日は福助８.5号さんです！