電通総研 テックブログ

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

UE5で群衆を作成する 後編 〜アセットのバリエーションを設定〜

こんにちは、電通総研金融ソリューション事業部の岡崎です。
前回の記事では群衆の服の色をランダムにする手順まで説明しました。

この記事は前回の続きからになりますので、まだご覧になっていない方は、前編も是非ご一読ください!

検証環境/ツール

実装手順

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

5. 群衆の髪型をランダムにする

後編では初めにMetaHumanのアセットに髪を生やしていきます。

「BP_Cheering_metamale」を開き、コンポーネント追加ボタンから「StaticMesh」を追加して「hair1」と命名します。

MetaHumanCreatorからダウンロードした際に、髪の毛のメッシュも入っているのでそれを使っていきます。
群衆という事で負荷を考えて、できるだけ軽いLOD7で使うための髪型を使いました。

「hair1」のスタティックメッシュのセレクトボックスで
「コンテンツ>Crowd>Character>Male>m_001>Hair>Helmets」の中にある「Hair_S_AfroFade_Helmet_LOD7」を選択します。

このままでは追加した髪の毛と、人間の本体が連動していないので、ソケットというものを使って連動していきます。
「hair1」を選択した状態で、詳細タブにあるソケットの欄から親ソケットを「HeadTop_End」に変更します。

これはスケルタルメッシュのボーンの名前で、頭の頂点にある点と髪の毛を連動させるために変更しました。

次に髪の毛の位置を変更して頭にの位置に合わせます。

コンパイルと保存をする事で、ビューポート上のMetaHumanに髪の毛を生やす事が出来ました。

ここから髪型をランダムにするために、他の髪型も追加していきます。

「BP_Cheering_metamale」を開きます。
一旦「hair1」の「Visible」のチェックを外し、レンダリングされない様に変更します。

次に「hair1」の時と同じ要領で「hair2」、「hair3」を作成します。

髪型は「コンテンツ>Crowd>Character>Male」内に入っているスタティックメッシュを自由に使います。

「hair2」、「hair3」も同様に「Visible」のチェックを外し、レンダリングされない様に変更しておきます。

イベントグラフに移動し、ランダムに髪型をレンダリングする処理を作っていきます。

先ほどまで作っていたノードに追加して、「整数型でスイッチ」ノードを追加します。
「Selection」のピンには0から2までの整数がランダムで生成される「RandomIntegerInRange」ノードをつなげます。

「0」のピンに「SetVisibility」ノードをつなぎ、ターゲットを「Hair1」とします。

同様に「hair2」、「hair3」をレンダリングする用のノードも作成します。

これにより、髪型もランダムに生成される様になりました。

現段階では、アニメーションが全て同じものを使用しており、再生のタイミングも一緒なので
次の工程ではアニメーションを複数用意して、タイミングもずらす処理を行っていきます。

6. 群衆のアニメーションをランダムにする

まずはアニメーションの開始タイミングをずらす処理を作成します。

先ほど「BP_Cheering_metamale」に作成したノードにつづけて「Delay」のノードをつなぎます。
「Duration」ピンには「RandomFloatInRange」のノードをつなげて、0~3の間でランダムにFloat型の数値の秒数待機させます。

これにつなげて「PlayAnimation」ノードを作成して、ターゲットを「SkeletalMesh」にして、「NewAnimToPlay」のセレクトボックスで「Cheering1Anim_mixamo_com」を選択します。

これによりアニメーションの開始タイミングをずらす事ができます。

今作成したノードの一覧がこちらになります。

次に違うアニメーションを複数用意していきます。
Mixamoに移動して、使用したいアニメーションを検索します。

ダウンロードが完了したら、今まで行ってきたことと同じ手順で新規のブループリントアクターを作成します。
今回私は「HipHop」というアニメーションを使って「BP_hiphop_metamale」を作成しました。

まだこの新規アクターはPCGグラフ上では使用していないので、もちろんビューポートには出てきません。
PCGグラフを編集していきます。

先ほど作成した「SpawnActor」の接続を一度解除して、代わりに「TransformPoints」ノードをつなぎます。

ここでは作成するPCGコンテンツの大きさや向きなどを調整できます。
私は「ScaleMin/Max」で90%~110%の大きさにランダム性を持たせて生成させています。
また、向きに関しても前方に対して70~120度のランダム性を持たせています。

次に「DensityFilter」ノードを追加します。

「Lower/Upper Bound」の値を編集することで、PCGコンテンツをフィルターする事ができます。
具体的には「LowerBound」と「UpperBound」に「0」と「0.25」と入力すると、
PCGコンテンツ内のBound値が0~0.25までの間のコンテンツにのみ干渉する事ができます。

デバッグモードで見るとボックスの色の濃い黒いものだけをフィルターする事ができます。


(Bound値でフィルターする前)


(Bound値でフィルターした後)

「DensityFilter」から「SpawnActor」に接続する事で、デバッグボックスの黒い位置だけに人間を生成できます。

次に、同様に「Lower/Upper Bound」の値を「0.26」と「0.5」に設定した「DensityFilter」ノードを追加します。

デバッグモードで見ると濃いグレーのボックスに干渉できる事が確認できます。

この「DensityFilter」にも「SpawnActor」を接続し、新規で作成した「BP_hiphop_metamale」をセットします。

これにより、PCGの黒いボックスが表示された場所は「BP_Cheering_metamale」を表示して
濃いグレーのボックスが表示された場所には「BP_hiphop_metamale」が表示できる様になります。

同様に他のアニメーションのブループリントアクターを作成する事で、3つのアニメーションがランダムで配置されたPCGを作成する事ができます。

7. 群衆の性別をランダムにする

最後に群衆の性別をランダムにするために女性のアセットを追加していきます。
とはいえ、ここでは今まで紹介してきた内容を繰り返し行うだけの内容になるので、詳細な説明は割愛いたします。

まず「MetaHumanCreator」を使用して女性を作成し、「Quixel Bridge」からプロジェクトへ追加します。

MetaHumanをスタティックメッシュ化してMixamoを使いアニメーションを追加する事で、
任意のブループリントアクターを作成し、PCGに追加する事ができます。

「DensityFilter」の数を増やすことによってアクターを好きな種類だけ増やすことができます。

おわりに

今回はPCGを使ってアニメーションのあるキャラクターをランダムに生成する方法をご紹介しました。
スケルタルメッシュにルールを作成して、いろいろなアニメーションをつける事ができるので、いろいろな場面で応用できそうな技術です。
しかし、木などのスタティックメッシュを配置するよりも、アクターを配置する方がCPU,GPUともに負荷がかかるので
大量に配置する際は負荷対策もしっかりと学ばないといけないと感じました。

記事をご覧いただきまして、ありがとうございました!

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

参考

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