写真から寿司を生成するためのメモ

フォトグラメトリはやべぇ技術だと思うんだけど、なんか気軽に使うには敷居が高いように見えるので、出来る範囲で Tips とか書きます。

とりあえず始めるフォトグラメトリ(1) とりあえずスキャンして Unity 上で表示する

こういう記事をあまり書いたことがないので、何書いたら良いのかわからんという気持ちでいっぱいですが、Twitter に書きなぐった情報をまとめておくのに一定の価値はありそうなのでまとめてみることに。

 

序文

たくさんの写真から 3D 形状を推測する「フォトグラメトリ(写真測量)」という3Dスキャニング技術がゲーム分野で話題になったのは、2014年に話題になった「Get Even (The Farm 51)」とか、「The Vanishing of Ethan Carter(The Astronauts)」だったと記憶してます。両方ともいわゆるインディーデベロッパーの作品。

当時 AAA スタジオじゃなくてもリアルなグラフィックスを作る手法が登場したと興奮した (中略) ので、その後の2018年なら 3DCG がよくわからんオッサンでもフォトグラメトリ―出来るんじゃねーかと思い始めてみました。

オッサンでもリアルなアセットが簡単に作れちゃうので、みんなやろう!

 使用するソフト

本稿では 3DFlow 社の「3DF Zephyr LITE」を使用します。理由は 俺が持ってるのがコレ だから。(一応 Reality Capture と比較検討はした結果、これ使ってます)

フォトグラメトリによる3Dスキャンの流れ

  1. 対象を写真撮影する
  2. 3DF Zephyr に突っ込んで処理
  3. テクスチャ付きメッシュを出力
  4. Unity で読み込む

対象を写真撮影する

とりあえず人体じゃなく、石ころとかオススメします。

まずは対象を撮影します。対象を全方位からパシャパシャ撮影しまくってください。

写真に写っていない場所は当然ながら立体化出来ないので、こんな感じで全体をまんべんなく撮影すると良いでしょう。f:id:manabuokajima:20180409153409p:plain

出来れば撮影前に目を通して欲しい参考資料:

3DF Zephyr に突っ込む

写真を PC に取り込んだら、後は 3DF Zephyr が計算してくれます。お金出して買ったのでキリキリ働いてもらいましょう!

*1

  1. 3DF Zephyr を起動
    f:id:manabuokajima:20180409153358p:plain
  2. [ワークフロー]から [新規プロジェクト] を選択する
    f:id:manabuokajima:20180409153944p:plain

  3. プロジェクトウィザードが立ち上がる。 Additional Options の左側全てをチェックして [次へ]
    f:id:manabuokajima:20180409154336p:plain

  4. 使用する写真を選択するします。 [+] を押し、対象の写真を選ぶ
    (写真が一つのフォルダにまとまっているなら Ctrl+A で全選択オススメ)
    f:id:manabuokajima:20180409154600p:plain

  5. 撮影したたくさんの写真が選択できたことを確認して [次へ]
    f:id:manabuokajima:20180409155011p:plain
  6. 各写真データのレンズ情報などが表示される。特に気にせず [次へ]
    f:id:manabuokajima:20180409155228p:plain

  7.  カメラの位置/方向を計算する際のオプション設定。[近接範囲]の[デフォルト]になっていることを確認し [次へ]
    f:id:manabuokajima:20180409155400p:plain

  8.  カメラの位置/方向が計算し終わった後に行う点群作成のオプション設定。ここも[近接範囲]の[デフォルト]になっていることを確認し [次へ]

    f:id:manabuokajima:20180409160152p:plain

  9.  点群からポリゴンモデルを作成する際のオプション設定。同じように[近接範囲]の[デフォルト]になっていることを確認し [次へ]

    f:id:manabuokajima:20180409160321p:plain

  10.  最後にテクスチャの設定。UE4での作業のために、テクスチャ枚数は1 、テクスチャサイズは8192未満を指定しましょう。[次へ]

    f:id:manabuokajima:20180409160501p:plain

  11. 最終確認画面です。[実行] を押すと処理が開始される
    f:id:manabuokajima:20180409160722p:plain
  12. 処理が開始されます。大体30分~1時間で終わりますのでコーヒーでも飲んで待ちましょう。

    f:id:manabuokajima:20180409161931p:plain

テクスチャ付きメッシュを出力

おめでとう!
処理が終わるとこんな感じで3Dモデルが生成されます。文明バンザイ

f:id:manabuokajima:20180409161558p:plain

これを、*.obj として出力すれば、あとは自由…フリーダム…
自由まであと少しなので頑張りましょう。

  1. [出力] の [テクスチャ付きメッシュを出力] を選択
    f:id:manabuokajima:20180409163025p:plain

  2. ファイル出力設定ウィンドウが出てくるので、フォーマットを出力を「Obj/Mtl」に、[ローカル表示基準システム] にチェックして [出力] 

    f:id:manabuokajima:20180409193135p:plain
    ※ 出力した FBX が上手い事 Unity で読み込めなかったので、とりあえず Obj にしてます。 

  3. 適当にファイル名を付けて保存
補足: ローカル表示基準システム

3DF Zephyr は大変すばらしいツールなのですが、中心座標から遠く離れた場所にモデルを配置しやがります。世界の中心で愛を叫べないタイプのツールなのです。
これを、モデルの相対位置…ローカル座標系で出力させるのが、「ローカル表示基準システム」オプションみたいです。

f:id:manabuokajima:20180409165215p:plain

(メタセコイアで見た時の位置がこちら)

Unity で読み込む

頂点数が 65536 以上のアセットも扱えるようになった Unity 2017.3 以降でならサクッと、スキャンしたモデルを読み込み、表示させることが可能です。

  1. 先ほど出力した *.obj、*.mtl、*.png をまとめて一気にプロジェクトにインポートします。

    f:id:manabuokajima:20180409194410p:plain

  2. 3Dアセットをシーンに適当に配置
    f:id:manabuokajima:20180409194949p:plain
  3. おわり

obj ファイルだけを先にインポートすると、テクスチャが正しく貼られていない状態になります。
この場合、新規に Unlit/Texture なマテリアルを用意して、メッシュに適用すればOKです。

おまけ

僕が今回作成したモデルは Sketchfab のアップしてあるので、張り付けておきます。

sketchfab.com

*1:今回は細かい説明を出来るだけ省略します。次回以降でもうちょい説明します。