3D Body Scan
1. はじめに
本演習では、人体スキャナ(Raspberry Pi + Pi Camera v2を120台)を利用して撮影した写真データをもとに、RealityCaptureで3Dデータ化する方法を学ぶものである。

2. 作業の流れ

3. 写真データの準備
人体スキャナで撮影した写真データ120を準備する。

4. 写真データの読み込み
1+1Layout、左パネル2Ds、右パネル3Dsで作業する。
WORKFLOW > 1. Add imagery > Folderをクリック。

フォルダを選択してOKを押す。

2Dsパネルにサムネイルが表示される。

2Dsを1Dsに切り替えて、Imagesに120 imagesが登録されていることを確認する。1Dsでは登録画像や生成した3Dメッシュのツリー表示を確認することができる。

Imagesを開いて、特定の画像をダブルクリックすると1+1+1 Layoutに切り替わり、右パネルで画像が表示される。今回は必要としないが、特徴点のマニュアル設定を行う場合もある。今回は1+1 Layoutに戻してもよい。

5. Aligning Image(低密度点群)
今回の人体スキャナシステムは、Raspberry PiのPi Camera v2を利用したものである。撮影した写真データは2464 x 3280となり、iPhone 8(4032 x 3024)と比較しても解像度が低い。そのため、Aligningの処理制度を上げて解析する必要がある。
ALIGNMENT > Registration > Settingsをクリックする。

Alignment SettingsのMax features per image(写真あたりの特徴点)を80,000(初期値40,000)に変更する。

スクロールして、下方にあるPreselector features(特徴点の事前選択)を40,000(初期値10,000)に変更する。

ALIGNMENT > Registration > Align Imagesをクリックする。



1Dsを表示して、Component 0を確認する。 下図では、118/121であり、118画像のみAlignmentに成功したことがわかる。

今回利用している人体スキャナは、調整が未完了であり、全ての画像が成功する確率は低い。ただし、110枚程度成功していれば、人体の三次元化には問題ない。
6. Reconstruction Region / Ground Plane
Reconstruction Regionを設定する。特に、上からの視点に切り替えて回転させることで、人体とReconstruction Regionの直方体を合わせておく。

地面は後から削除するので、靴と地面の境界は少し余裕をもって設定してもよい。
ある程度合わせた段階で、SCENE 3D > TOOLS > Scene Alignment > Set Ground by Reconstruction Regionをクリックする。

グリッドの原点に対してReconstruction Regionが整列される。

上視点から再度確認して、人体がグリッドに対して水平もしくは垂直になっていることを確認する。ズレが大きければ再度微調整する。

本演習では、最終的にmixamoへアップロードする。その際、mixamoでは90度単位でしか調整できないので、ここで正確に調整しておく必要がある。
7. Reconstruction(メッシュ生成)
MESH MODEL > Create Model > Normal Detailをクリックする。



8. 不要なメッシュの削除
SCENE 3D > TOOLS > Mesh Model > Lasso or Rectを利用してメッシュを選択する。
ツールで囲んだ領域の視点の奥まで選択されるので、ビューを回転して確認しながら行う。

- 左ドラッグ:メッシュの選択
- CTRL+左ドラッグ:連続した選択範囲の追加
- SHIFT+左ドラッグ:選択範囲の削減
- 選択範囲の全解除:Deselect
注意点として、この時は視点移動はできない。LassoとRectはトグル方式なので、もう一度クリックして解除してから視点移動する。
カメラプレビューが邪魔な場合は「SCENE 3D > VIEW > Alignment Cameras > Enables」をOFFにしておく。

Filter Selectionでメッシュを削除する。


視点を切り替えながら、不要な部分を削除していく。
下図は正面視点。この時、靴が水平でなければGround Planeを微調整する。


視点を変えて、残りを削除する。


メッシュ削除が完了したら、LassoもしくはRectをもう一度クリックして解除しておく。
9. Clean Model
※Close Holesでは複数穴は塞がらない場合があり。(まだ理解しきれていない)
下図のように、足裏のメッシュがない状態から行う。

Clean Modelを行う前に、現在のメッシュの状態を検査する。
MESH MODEL > Analyze > Check Topologyをクリックする。

Hole countが3であり、足の裏以外にも、穴もしくはメッシュが存在していることがわかる。小さなメッシュでも浮遊している可能性があり、探して削除しておく。

MESH MODEL > Analyze > Clean Modelをクリックする。

両足裏にメッシュが作成された。

もう一度、MESH MODEL > Analyze > Check Topologyをクリックする。

Holes(穴)が塞がれたことがわかる。
10. Simplify(メッシュ削減)
1Dsパネルで、現在のメッシュ(ポリゴン)数を確認する。 Component 0の中にModelが複数ある場合、一番下が最新のModel。 右側の3.4 M trisがメッシュ数。 さらに内部に入ると2つに別れているのがわかる。ここでは関係ない。

メッシュ削減は一度に行うと表面のディティールが著しく損なわれる。 3.4 M tris = 3,400,000 trisなので、3,400,000→1,000,000→500,000→250,000のように、徐々に減らしていく。
メッシュ削減にはSimplyfy Toolを利用する(トグルボタン)。 SCENE 3D > TOOL > Mesh Model > Simplify Tool

下図のTarget triangle count(初期値1,000,000)を変更しながら、simplifyボタンを押す。

最終的に250,000 trisまで削減する。mixamoにアップした際に重くないようにしておく。
※mixamoからDLしてBlenderでプレビュー再生する場合は、10,000 tris程度まで削減しておいたほうがよい。もしくはリトポロジーするほうがベスト。
下図はメッシュ数の違いによる比較。

終了後は、Simplify Toolをもう一度クリックして、解除しておく。
11. Texturing(テクスチャ生成)
MESH MODE > Mesh Color & Texture > Textureをクリックする。

Texturing処理が始まる。

今回着ていた服がストライプ柄だったので、モアレが発生していますね。

12. 書き出し
MESH MODEL > Export > Mesh and PointCloud
4つのファイルができるので、保存先には前もって新規にフォルダを作成しておく。

下図のSettingが表示されるが、今回は何も変更せずにOKを押す。

以下の4つのファイルができる。 rcinfoはログファイルなので、RealityCapture以外では不要。

13. 紹介のみ)Blenderでポーズ調整
必要に応じてBlenderのSculptツールなどを利用して、ポーズを調整する。
授業内で紹介。
14. 応用)mixamoへアップロード(課題)
以下、授業内で指示する。
- OBJ、MTL、PNGの3つのファイルをZIP圧縮 ※rcinfoは含まない
- mixamoのUPLOAD CHARACTERからアップロード
- オブジェクトを正面に向ける
- Auto Rigging設定(Fingerあり、Symmetry解除)
- キャラクターにアニメーション設定を行う
課題提出は、mixamo上のアニメーション状態を画面共有することで提出完了
15. 紹介のみ)mixamoからダウンロードしてBlenderへ
授業内で紹介する。
※今回は別のmixamo標準キャラクターで実験する
- (今回扱わない)RealityCaptureの1DsでModelを確認して、1つ前のModel(Textureつき)を削除。10,000 trisまでメッシュ削減してTexturing、書き出しを行う。
- (今回扱わない)mixamoへアップして、同様の作業を行い、FBX7.4でダウンロードする。
- BlenderでFile > Import > FBX(mixamoでFBX7.4DL)
- Shading表示
- OverlaysからBonesを非表示
- Collection > Armature > defaultを選択して、Material PropertiesのShow Backfaceを非表示
- オブジェクトを移動して複数回FBXを読み込む
- アニメーションループ再生(mixamoのアニメーションフレーム数に合わせる)
