電通総研 テックブログ

電通総研が運営する技術ブログ

UE5で群衆を作成する 前編 〜MetahumanをPCGで配置〜

こんにちは、電通総研金融ソリューション事業部の岡崎です。

今回はUE5でPCGを使用した群衆を作成します。
作成する群衆は、ライブ会場などに配置するためのアセットとして使用する想定ですので、
後ろから見た姿の、服の色や髪、背丈や性別、動きのアニメーションなどをランダムになるように作成します。
また、今回は後ろ姿のみが映る予定ですので、顔の違いは考慮せずに作成していきます。

本記事は前編後編に分かれており、この記事では手順4の「群衆の服の色をランダムにする」までをご紹介します。

検証環境/ツール

実装手順

  1. 群衆で使用する人型のメッシュの用意
  2. 人型のメッシュにアニメーションを付与する
  3. 群衆のアセットをPCGで配置する
  4. 群衆の服の色をランダムにする
  5. 群衆の髪型をランダムにする
  6. 群衆のアニメーションをランダムにする
  7. 群衆の性別をランダムにする

1. 群衆で使用する人型のメッシュの用意

まずは群衆で使う人型のアセットを用意します。
今回は、EPICが提供しているデジタルヒューマンのMetaHumanを使用します。

別記事ではありますが、写真からMetahumanを生成する方法については松崎さんの記事が参考になるので、ぜひご覧ください。

まずはUnrealEngineのコンテンツ追加タブから「Quixel Bridge」を選択します。

その後出てくるウィンドウからMetaHumanCreatorで作成した任意のMetaHumanを選択し、「Download」ボタンを押下します。

ダウンロードが完了したらMetaHumanをプロジェクトに追加するために「Add」ボタンを押下します。

コンテンツブラウザ内の「コンテンツ>MetaMumans>meta_male(作成したMetaHumanの名前)」にファイルが追加されます。

追加された「BP_meta_male」をアウトライナーに配置する事で、MetaHumanが正常にインポートできた事を確認します。

追加されたMetaHumanはスケルタルメッシュを使用しているのですが、
大量に配置した際のパフォーマンス向上の為スタティックメッシュに変換して使用したいので変換作業を行います。

画面上部のアクタタブから「スタティックメッシュへ変換」を押下します。

追加したい場所を選び、保存を押すとスタティックメッシュが生成されます。

髪の毛は変換元のスケルタルメッシュには含まれていないため、スタティックメッシュに変換した際に消えてしまいますが、
後々追加するので問題はありません。

さらに作成したスタティックメッシュのファイルを右クリックして「アセットアクション」から「エクスポート」を選択してFBXファイルを作成します。

次の工程で、作成したスタティックメッシュのFBXファイルにアニメーションをつけていきます。

2. 人型のメッシュにアニメーションを付与する

ここではMetaHumanを元にしたスタティックメッシュに群衆のアニメーションをつけていきます。

アニメーションを作成するにあたりAdobe社が提供しているMixamoというサービスを利用します。
Mixamoは、二足歩行のアセットに対して、自動でスケルトンを作成して、
用意してある、歩行やダンスなど、さまざまなアニメーションをアセットに付与する事ができるサービスです。

Mixamoを開いたら、まずFBXファイルをアップロードします。
画面右側の「Upload character」を選択し、FBXファイルを選びます。

キャプチャのように、作成したMetaHumanのスタティックメッシュが表示されるので「Next」を押します。

次にアニメーションで使用するためのリグ付けを行っていきます。
キャプチャのように右側のサンプルを参考に、顎や腕、膝などの場所を登録します。

完了して生成されるまで少し待つと、リグのついたMetaHumanが完成します。

次に群衆に使いたいアニメーションを検索します。
私は今回、ライブ会場で盛り上がる人を作りたかったので「Cheering」のアニメーションを使いました。

選択したら、右側の「Download」ボタンを押します。
「Skin」を「With Skin」にしてダウンロードします。

ダウンロードしたファイルをUE上にインポートする事で、アニメーションに対応したスケルタルメッシュを使用する事ができます。

アウトライナーに配置する事でMetaHumanがCheeringのアニメーションをしているのが確認できます。

今回は、アニメーション毎に、それぞれ異なるスケルタルメッシュを用いてアニメーションを作成します。

ちなみにアニメーションを付与する方法として、
共通のスケルタルメッシュに対してアニメーションシーケンスを複数切り替える方法もありますが、
こちらは後日別の記事で紹介する予定です。
(Mixamoからアニメーションをダウンロードして、UE上でスケルタルメッシュにリターゲティングを行い、アニメーションを再現する)

次の手順で、現在作成したアニメ付きのMetaHumanをPCGを利用して複数配置し、群衆にしていきます。

3. 群衆のアセットをPCGで配置する

まずは以前の私のPCGの記事を参考にPCGを作成していきます。
PCG作成の詳しい方法は本記事では割愛するので、PCGの記事を参考にしてください。

「PCGVolume」と「PCGグラフ」を作成します。

「PCGグラフ」を開き、「Input」の「Landscape」から「SurfaceSampler」をつなぎます。

群衆を作成するにあたり、大体の人数のあたりをここでつけておきます。

次に群衆を配置するために「SpawnActor」ノードを作成します。

前回のこちらの記事では「StaticMeshSpawner」を使用しましたが、
アニメーションをさせるために必要なスケルタルメッシュアセットは、「StaticMeshSpawner」では配置できないので、「SpawnActor」ノードを使用します。

本来はスケルタルメッシュスポナーのようなものを使いたいですが、そのようなノードはないので「SpawnActor」を使用します。まずは「SpawnActor」で使用するブループリントアクターを作成します。

Mixamoで出力されたアセットはスケルタルメッシュのアセットなのでまずはこれをブループリントアクター上に配置します。

コンテンツブラウザ上でブループリントアクターを「BP_Cheering_metamale」という名前で生成します。
コンポーネント追加ボタンから「SkeletalMesh」を選択して追加します。

追加したら右側の詳細パネルの「メッシュ>SkeletalMeshAsset」のセレクトボックスから、先ほどMixamoで作成したUE上にインポートしてきたスケルタルメッシュのファイル「Cheering_1」を選択します。

さらに詳細パネルの「Animation>AnimationMode」の項目を「アニメーションアセット」にセットします。

アニメーションアセットを選択するタブが出てくるので同時にインポートしてきた「Cheering_1_Anim_mixamo_com」を選択します。

これにより、MetaHumanが手を挙げているアニメが再生されているブループリントアクターが出来ました。

PCGグラフに戻り、「SpawnActor」の「TemplateActorClass」から現在作成したブループリントアクター「BP_Cheering_metamale」を選択します。

また「Option」を「MergePCGOnly」を選びます。
この設定は後述する「ConstructionScript」を使用する際の条件になります。

これでアウトライナー上にPCGで作成した群衆が配置できます。

それでは次の工程で、配置した群衆の服の色をランダムにしていきます。

4. 群衆の服の色をランダムにする

まずは服の色をランダムにするためのマテリアルを作成します。
コンテンツブラウザでマテリアルを作成します。

私は「M_RandomColor」と命名しました。

作成したらベースカラーのピンに「VectorParameter」を追加して「basecolor」と命名します。
パラメーターは全てゼロで黒のままで大丈夫です。

私の場合は服の素材を表すために「ラフネス」のピンに「10」の値を接続して反射をなくしています。

次にMixamoから持ってきたスケルタルメッシュのファイル「Cheering__1」を選択します。
編集画面上で服のマテリアルが入っているエレメント2の「M_Lights_Shorts」のマテリアルを
今作成した「M_RandomColor」に変更します。

ツヤの消えた黒い服を着ていることを確認します。

次に「BP_Cheering_metamale」を開き、「Construction Script」タブを開きます。
「CreateDynamicMaterialInstance」ノードを作成してターゲットを「SkeletalMesh」にします。

「Construction Script」に書いた処理は、ゲーム中には実行されずに、レベルにそのブループリントを配置、変更した時点で処理が実行されます。

また「Element index」の値を「2」にします。
(これは「M_Lights_Shorts」のマテリアルがエレメント2に格納されているため)

次に「ReturnValue」を変数に昇格させ、変数名を「DMI_random」とします。

「BP_Cheering_metamale」の「イベントグラフ」に戻ります。

「BeginPlay」の時にシャツのマテリアルの値を変更するために「SetVectorParameterValue」ノードをつなぎます。
ターゲットは先ほど作成した「DMI_random」にして、「ParameterName」は、マテリアル作成時に命名した「basecolor」と書きます。

次に「MakeColor」ノードを作成し、「RGB」にそれぞれ「RandomFloat」の値を接続します。
(「A」はデフォルトのまま「1.0」にしておきます)

これでイベントが起こるたびに服の色のマテリアルの「RGB」の値が変わり、服の色がランダムに変更される様になります。

ビューポートに戻ると服の色がランダムになっているのが確認できます。

おわりに

前編では、MetaHumanをPCGで配置する方法や、mixamoの使用方法、マテリアルの変更方法などを紹介しました。
今回は要件的にmixamoから出力したスケルタルメッシュとアニメーションをそのまま使いましたが、
アニメーションだけを書き出して既存のキャラクターの動きを上書きするためのリターゲティング処理などもあります。
そちらも今後使う機会がたくさんありそうなので勉強をしてみたいと思います。

後編では、髪型や性別、アニメーションをランダムに振り分ける方法などもご紹介しています。
近日中に公開するので、ぜひそちらもご覧ください!

現在、電通総研はweb3領域のグループ横断組織を立ち上げ、Web3およびメタバース領域のR&Dを行っております(カテゴリー「3DCG」の記事はこちら)。 もし本領域にご興味のある方や、一緒にチャレンジしていきたい方は、ぜひお気軽にご連絡ください!
私たちと同じチームで働いてくれる仲間を、是非お待ちしております!
電通総研採用ページ

参考

執筆:@okazaki.wataru、レビュー:@handa.kenta
Shodoで執筆されました