とりあえず始めるフォトグラメトリ(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スキャンの流れ
- 対象を写真撮影する
- 3DF Zephyr に突っ込んで処理
- テクスチャ付きメッシュを出力
- Unity で読み込む
対象を写真撮影する
とりあえず人体じゃなく、石ころとかオススメします。
まずは対象を撮影します。対象を全方位からパシャパシャ撮影しまくってください。
写真に写っていない場所は当然ながら立体化出来ないので、こんな感じで全体をまんべんなく撮影すると良いでしょう。
出来れば撮影前に目を通して欲しい参考資料:
- Photoscan のユーザーマニュアル、「Capturing scenarios」 の項(5-6ページ) http://www.agisoft.com/downloads/user-manuals/
- Unity 社がここで配っている e-Book (2018/04/09 現在 DL 出来ない…) https://unity3d.com/jp/solutions/photogrammetry
3DF Zephyr に突っ込む
写真を PC に取り込んだら、後は 3DF Zephyr が計算してくれます。お金出して買ったのでキリキリ働いてもらいましょう!
- 3DF Zephyr を起動
-
[ワークフロー]から [新規プロジェクト] を選択する
-
プロジェクトウィザードが立ち上がる。 Additional Options の左側全てをチェックして [次へ]
-
使用する写真を選択するします。 [+] を押し、対象の写真を選ぶ
(写真が一つのフォルダにまとまっているなら Ctrl+A で全選択オススメ) - 撮影したたくさんの写真が選択できたことを確認して [次へ]
-
各写真データのレンズ情報などが表示される。特に気にせず [次へ]
-
カメラの位置/方向を計算する際のオプション設定。[近接範囲]の[デフォルト]になっていることを確認し [次へ]
-
カメラの位置/方向が計算し終わった後に行う点群作成のオプション設定。ここも[近接範囲]の[デフォルト]になっていることを確認し [次へ]
-
点群からポリゴンモデルを作成する際のオプション設定。同じように[近接範囲]の[デフォルト]になっていることを確認し [次へ]
-
最後にテクスチャの設定。UE4での作業のために、テクスチャ枚数は1 、テクスチャサイズは8192未満を指定しましょう。[次へ]
- 最終確認画面です。[実行] を押すと処理が開始される
- 処理が開始されます。大体30分~1時間で終わりますのでコーヒーでも飲んで待ちましょう。
テクスチャ付きメッシュを出力
おめでとう!
処理が終わるとこんな感じで3Dモデルが生成されます。文明バンザイ
これを、*.obj として出力すれば、あとは自由…フリーダム…
自由まであと少しなので頑張りましょう。
-
[出力] の [テクスチャ付きメッシュを出力] を選択
-
ファイル出力設定ウィンドウが出てくるので、フォーマットを出力を「Obj/Mtl」に、[ローカル表示基準システム] にチェックして [出力]
※ 出力した FBX が上手い事 Unity で読み込めなかったので、とりあえず Obj にしてます。 - 適当にファイル名を付けて保存
補足: ローカル表示基準システム
3DF Zephyr は大変すばらしいツールなのですが、中心座標から遠く離れた場所にモデルを配置しやがります。世界の中心で愛を叫べないタイプのツールなのです。
これを、モデルの相対位置…ローカル座標系で出力させるのが、「ローカル表示基準システム」オプションみたいです。
(メタセコイアで見た時の位置がこちら)
Unity で読み込む
頂点数が 65536 以上のアセットも扱えるようになった Unity 2017.3 以降でならサクッと、スキャンしたモデルを読み込み、表示させることが可能です。
- 先ほど出力した *.obj、*.mtl、*.png をまとめて一気にプロジェクトにインポートします。
- 3Dアセットをシーンに適当に配置
- おわり
obj ファイルだけを先にインポートすると、テクスチャが正しく貼られていない状態になります。
この場合、新規に Unlit/Texture なマテリアルを用意して、メッシュに適用すればOKです。
おまけ
僕が今回作成したモデルは Sketchfab のアップしてあるので、張り付けておきます。
*1:今回は細かい説明を出来るだけ省略します。次回以降でもうちょい説明します。