電通総研 テックブログ

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

フォトグラメトリ×Mesh to Metahumanで人物そっくりな3Dキャラクターを作成してみた(前編)

みなさんこんにちは! 電通総研 金融ソリューション事業部の松崎です。
前回の記事では、回転台やグリーンバックを用いたフォトグラメトリ手法について紹介しました。
この手法は今回のMetahuman作成の中でも使用しておりますので、まだご覧になっていない方は是非ご一読ください。

今回から、2回に分けてフォトグラメトリを活かしたMetahuman作成のワークフローを紹介していきます。
この記事は前編です、読み終わりましたら是非後編もご覧ください。

はじめに

本記事ではフォトグラメトリにて人物頭部のメッシュ・テクスチャを作成し、それを用いてMetahumanを作成する手法を紹介します。 ※フォトグラメトリに関しては、以前の記事をご参照ください。

MetahumanとはEpic社が提供しているデジタルヒューマン作成用のフレームワークであり、UnrealEngine上で簡単に使用できることが特徴です。
今回はMesh to Metahumanを用いてMetahumanを作成します。Mesh to Metahumanとは、3DメッシュからMetahumanを作成するUnrealEngineの機能です。
Mesh to MetahumanではMetahumanのメッシュ・テクスチャが作成されますが、現段階ではテクスチャのクオリティがそこまで高くない為、そのまま使用するとそっくりと言えるレベルにはなりません。
そこで今回は、フォトグラメトリで作成した頭部テクスチャを使用してクオリティの向上を図ります。
Mesh to Metahumanで作成されたMetahumanテクスチャにフォトグラメトリで作成したテクスチャを合成することで、「人物そっくりな」Metahumanを作成できました。
次章より、以下の目次に沿ってMetahuman作成方法を紹介していきます。

目次

  • 使用機材紹介
  • 撮影方法
  • 1.頭部メッシュ&テクスチャ作成(フォトグラメトリ)
  • 2.頭部メッシュのリトポロジー(3Dメッシュ編集)
  • 3.Metahumanの作成と編集(Mesh to Metahuman)
  • 4.Metahumanにフォトグラメトリテクスチャを合成(3Dテクスチャマッピング

前編では2章までご紹介します。

使用機材

PC

PCはスペックの高いものを使用しております。これは、フォトグラメトリにおける処理時間を短縮させる為です。
PCの具体的なスペック、並びにフォトグラメトリを行う際に必要なスペックを記載します。

使用PCスペック

フォトグラメトリの必要スペック

  • OS:64bit Microsoft Windows version 7 / 8 / 8.1 / 10 / 11 または Windows Server version 2008+
  • CPU:SSE4.2(Streaming SIMD Extensions 4.2)以降
  • RAM(メモリ):8GB以上
  • GPUNVIDIA graphics card with CUDA 3.0+ capabilities で 、VRAMが1GB以上
  • DRIVER:CUDA Toolkit 10.2, minimal driver version 441.22.

カメラ(2台)

カメラは人物の頭部を撮影する用途で、2台使用しました。1台は人物の頭部を正面から撮影し、もう1台は斜め下から撮影しています。
人物を撮影する場合、撮影時間が長くなると動いてしまうリスクが高まりますので、カメラは2台用いて一気に撮影することが望ましいです。(予算が許す場合はカメラを何十台も用意して360度に配置し、1回の撮影で終えられると理想的です)
本来であれば2台とも同じ機種であることが望ましいですが、今回はそろえることができなかった為、以下の機種を1台ずつ使用しました。

  • Sony α7R IV (Lens:Sony Vario-Tessar T* FE 16-35mm F4 ZA OSS(SEL1635Z))

  • Sony α7C (Lens:SIGMA 28-70mm F2.8 DG DN | Contemporary )



三脚(2台)

手振れ防止目的にて三脚を使用しています。
フォトグラメトリでは手振れが天敵となりますので、可能な限り三脚を用いることが推奨されます。


照明(2台)

照明2台を用いて、人物の頭部を照らしました。
照明を当てると人物の輪郭が強調されますので、フォトグラメトリで作成されるテクスチャがより本人らしくなります。
また、定常光による意図しない影を作らない為にも照明を用いています。


回転台

人物本人やカメラを動かさずに360度撮影できるよう、回転台を使用しました。
撮影対象人物を回転台に乗せることで、人物本人に同じ姿勢をキープさせたまま回転させることができます。


ヘアネット

髪の毛を仕舞い込む用途にて使用しました。
Mesh to MetahumanでMetahumanを作成する際に髪の毛は邪魔になりますので、ヘアネットで1ヵ所に纏めます。


撮影方法

人物頭部の撮影風景は以下のようになります。
(画像では正面カメラの位置が低いですが、実際の撮影時は顔の正面に来るよう高さを調整しています)

白い壁を背景にして回転台を置き、撮影対象の人物が乗ります。
カメラは人物頭部の「正面」「斜め下」に1台ずつ配置し、照明は正面から斜め45度の位置に1台ずつ設置しました。
撮影時、撮影対象人物にはなるべく同じ表情・姿勢で静止してもらい、回転台を少しずつ回しながら撮影を進めていきます。
撮影枚数に関して、今回は1周でカメラ1台あたり36枚ほど撮影しました。(回転台は約10度ずつ回す)
回転台を回す度にカメラ2台分のシャッターを切る必要がありますので、撮影側には最低2人用意しておくことが望ましいです。

1.頭部メッシュ&テクスチャ作成(フォトグラメトリ)

人物の頭部を撮影し、フォトグラメトリにてメッシュとテクスチャを作成します。

まず初めに写真撮影です。
上記の撮影方法にて人物頭部の撮影を行い、以下のようになりました。
(今回は先輩社員にモデルをお願いしました)

  • 正面

  • 斜め下

次に、フォトグラメトリにてメッシュとテクスチャを作成します。
詳細な手順は以前の記事で紹介しておりますので、そちらをご参照ください。(記事同様、今回もRealityCaptureを用いてフォトグラメトリを行いました)
フォトグラメトリによって完成したメッシュとテクスチャが以下になります。

頭頂部が崩れていますが、この部分は次章で行うリトポロジーにて解消されるため問題ありません。(詳細は後述します)

完成したメッシュ/テクスチャをOBJ形式/PNG形式にて出力します。
※出力ファイルサイズ メッシュ(OBJ):約6GB テクスチャ(PNG):約200MB



2.頭部メッシュのリトポロジー(3Dメッシュ編集)

1.にて作成した頭部メッシュのリトポロジーを行います。
トポロジーとは、ポリゴンの流れ(トポロジー)を再構築して整える作業のことです。
今回はMetahumanで使うための頭部メッシュを作成しているので、以下の点を意識してリトポロジーを行う必要があります。

  • ポリゴン数を減らし、軽くて操作しやすいメッシュにする
  • 自然な表情変化ができるよう、人間本来の表情筋の流れに沿ったトポロジーを構築する

上記の1点目だけであればRealityCapture上でも行うことができますが、2点目は不可能です。
そこで今回は、Wrapという3Dモデリングソフトウェアを使用してリトポロジーを行いました。
Wrapとは、その名の通り自分の3DメッシュをWrap側のベースメッシュに被せられるソフトウェアです。Wrap側で用意されているデフォルト顔のベースメッシュに自分でスキャンしたメッシュを被せることで、簡単にリトポロジーを行うことができました。
Wrapのインストールはこちらから行うことができます。有料ソフトウェアですが、初回30日は無料で試用できるので是非お試しください。

それでは、実際にWrapを使ってリトポロジーを行っていきます。

Wrapを立ち上げ、画面左上の「File → New Project」で新規プロジェクトを作成します。

「Gallary」タブを押下し、Basemeshsから「Head」を選択します。
こちらが、今回のリトポロジーでベースに使うメッシュです。

Graphエリアに「Head」のノードが追加されました。また、Viewport3Dエリアでは追加した「Head」のメッシュ本体を見ることができます。

次に、フォトグラメトリで作成した頭部メッシュを読み込みます。
Graphエリアで右クリックし、「LoadGeom」を選択します。

Graphエリアに追加された「LoadGeom」ノードを選択すると、Editorエリアに設定項目が表示されます。
File Nameの右にある「...」を押下し、フォトグラメトリで作成したOBJ形式のメッシュを読み込みます。
※画像のように、ファイルパスに日本語が混ざっていると正常に読み込まれません。パスは英数字のみで指定するようにしましょう。
「Reload」を押下し、読み込みを開始します。

読み込みが完了すると、以下のように真っ黒なメッシュが現れます。

Editorエリアの「Wireframe」のチェックを外すと、メッシュが見やすくなります。

「Head」メッシュと「LoadGeom」で読み込んだメッシュの位置合わせを行います。
今回は「LoadGeom」メッシュの位置と角度を変化させます。
「LoadGeom」を選択し、Editorエリア「Rotation」の値を変えて向きをそろえます。

向きがそろったら、Viewport3Dエリアのギズモ(赤青緑の移動・回転・拡大縮小ツール)を使用して位置合わせを行います。
必要に応じ、ギズモを使って向きの微調整も行いましょう。
下記図のように位置がおおよそ重なっていれば問題ありません。

次に、フォトグラメトリで作成したテクスチャを読み込みます。
対象のテクスチャファイルをGraphエリアにドラッグ&ドロップします。

テクスチャのノードが作成されますので、「LoadGeom」ノードと結合します。
これにより、「LoadGeom」で読み込んだメッシュにテクスチャが反映されます。

Graphエリアで右クリックし、「RigidAlignment」ノードを追加します。
このノードを使い、さきほど大まかに位置合わせした2つのメッシュを正確に合わせていきます。

下図のように、各ノードを結合します。(結合する位置を間違えないように注意しましょう)

Graphエリアを右クリックして「Selectpointpairs」ノードを追加します。
このノードは、「RigidAlignment」ノードで位置合わせを行う際の基準点を指定するために使用します。

下図のように、各ノードを結合します。

「Selectpointpairs」ノードを選択した状態でVisualEditorエリアを表示させます。
Editorエリアの「Sync Views」にチェックを入れます。これにより、VisualEditorエリアの2つのメッシュが連動して動くようになります。
VisualEditorエリアにて、位置合わせの基準点を設定します。基準点には目や口・鼻・顎先など、顔の特徴的な部分を設定することが望ましいです。今回は下図のように目と顎先の3点を設定しました。

基準点の設定が完了したら、Viewport3Dエリアを表示します。
「RigidAlignment」ノードを選択し、「Fit Scale」にチェックを入れます。これにより、メッシュのサイズを変えながら基準点をより正確に合わせてくれます。

「RigidAlignment」ノードの名前を分かりやすい名前に変更します。
ノードを選択してF2を押すと名前が変更できます。今回は参考にさせていただいたブログに習い、「RC_Aligned」としました。

次に「Wrapping」ノードを追加します。名前の通り、このノードではラッピング処理を行います。
下図のように「Head」ノードと「RC_Aligned」ノードを結合し、Editorエリアの「Compute」を押下します。

ラッピング処理完了後のメッシュと、フォトグラメトリで作成したメッシュ(+テクスチャ)の比較画像になります。
顔全体の形はかなり近いものになっている一方、目や鼻・口の形には少し差異が確認できます。

ラッピング処理の精度を上げるために、「Selectpointpairs」ノードを追加します。
新規で「Selectpointpairs1」ノードを追加し、下図のように各ノードと結合します。

先の「Selectpointpairs」ノードと同様に、VisualEditorエリアにて位置合わせの基準点を設定します。
目・鼻・口・耳に対して下図のように基準点を設定しました。

「Selectpointpairs1」ノードを「Wrapping」ノードに結合し、再度「Wrapping」ノードの「Compute」を押下します。

「Selectpointpairs1」ノード追加前と追加後、およびフォトグラメトリで作成したメッシュの比較画像です。
微妙な差ではありますが、目や鼻・口の大きさが元の形に近づいていることが確認できます。

ラッピング処理が満足いく形まで完了したら、最終調整に入ります。
最終調整では「Brush」ノードを使用します。このノードは、各種ブラシを使う要領でメッシュの微調整ができるツールです。
右クリックでノードを追加したら、下図のように結合します。

「Brush」ノードを選択した状態でVisualEditorエリアを表示すると、各種ブラシが選択できます。
今回は頭の形をベースメッシュに寄せていくので、「Clone」ブラシを使います。
「Clone」ブラシは、Geometry Sourceにつないだメッシュ(今回の場合は「Head」ノードのメッシュ)を基準としてメッシュ形状が変化するブラシです。
(対して、「RelaxProj」ブラシはReferenceに繋いだメッシュ(今回の場合は「RC_Aligned」ノードのメッシュ)を基準として変化します)
Editorエリアの「Radius」ではブラシの半径、「Strength」ではブラシのかかる強度を設定できます。

「Clone」ブラシを用いて、頭部の出っ張りを修正しました。
「Clone」ブラシを使っていると、想定よりベースメッシュに寄ってしまうことがあります。そのような時は、適宜「RelaxProj」ブラシで戻し修正しながら、弱めの「Clone」ブラシで調整しましょう。
修正が完了したら、「Accept」を押下して反映させます。

Brush処理の実施前、実施後、並びにフォトグラメトリで作成したメッシュの比較画像です。
頭部の出っ張りも解消し、最終調整が完了しました。

メッシュが完成しましたので、テクスチャを貼り付けます。
「TransferTexture」ノードを追加し、下図のように結合します。これにより、完成したメッシュにフォトグラメトリで作成したテクスチャを貼ることができました。
「Resolution」は4096×4096にしていますが、ここはお好みで設定して問題ありません。

「TransferTexture」ノードを選択した状態でViewport2Dエリアを表示すると、貼り付けられているテクスチャを見ることができます。

「SaveGeom」ノードを追加し、メッシュを保存します。
File Nameの右にある「...」から保存先とファイル名を選択し、「Compute Current Frame」で保存実行します。
出力されたメッシュ(OBJ)のファイルサイズを確認すると約500KBでした。RealityCaptureで出力したメッシュ(OBJ)は約6GBでしたので、リトポロジーによりファイルが大きく軽量化されていることを確認できます。

同様に、「SaveImage」ノードを追加し、テクスチャを保存します。
File Nameの右にある「...」から保存先とファイル名を選択し、「Compute Current Frame」で保存実行します。
今回はPNG形式で、Qualityは劣化なしの100で出力しました。
出力されたテクスチャ(PNG)のファイルサイズは約15MBでした。

これにてリトポロジー完了です。

おわりに

前編では、機材紹介や人物頭部をフォトグラメトリするにあたっての撮影方法に加え、フォトグラメトリ後の3Dメッシュモデリング方法を紹介しました。私自身もWrapは初めて使うソフトウェアだったのですが、ノードベースで直感的に操作ができて使いやすかったです。また、ラッピング処理の優秀さには驚かされました。
後編では、Mesh to MetahumanやPhotoshopを用いて人物そっくりなMetahumanを作成していきます。
是非こちらもご覧ください!

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

参考文献

回転台とグリーンバックによる本格フォトグラメトリ撮影(Adobe Photoshop × RealityCapture)
フォトグラメトリによる3Dモデル作成ワークフロー(前編)
フォトグラメトリによる3Dモデル作成ワークフロー(後編)
初歩からのフォトグラメトリ~人物フォトグラメトリを活用してUnreal EngineでMetahumanを作成する方法〜【写真からゲームで使える3Dキャラを作ってみよう! vol.11】
初歩からのフォトグラメトリ~Wrapの使いかた(初級編)RealityCaptureで作ったモデルを綺麗にリトポロジーしよう!~【写真からゲームで使える3Dキャラを作ってみよう! vol.8】
Pushing the MetaHuman Likeness Limits via Scan-based Textures | Unreal Fest 2022(YouTube)
Easy Trick To Match SKIN TONES in Photoshop Fast!(YouTube)
UNREAL ENGINE download
RealityCapture
Wrap
MetaHuman Creator
顔の周りのテクスチャを馴染ませる(YouTube)
目のまわりを調整(YouTube)

執筆:@matsuzaki.shota、レビュー:@wakamoto.ryosuke
Shodoで執筆されました