最近フォトグラメトリーにハマり、その成果として3DF Zephyrを使って神社まるごと3D化しました。
このときのノウハウを共有しておこうと思います。
被写体の選定
フォトグラメトリーはわりと被写体に得意不得意があります。
以下のようなものは苦手なので、そもそも被写体にしないか、何らかの対策をするべきです。
- 表面がベタ塗りであるもの
- ペンキ一色の壁(模様が遠目から確認できない壁紙も含む)や模様の少ないフィギュアなど。特徴点が取れないので不向きです。壁ならカラフルな付箋紙を貼るなどの対策を。
- 透明なもの
- 言わずもがな、フォトグラメトリーは透明なものに向きません。諦めましょう。しかし世の中にはガラス壁や水など割と透明なものがあふれています。諦めましょう。
- 細いもの
- 特徴点は取れてもメッシュ化する際に消えてなくなりがちです。細いものが主役でなければ、消えることを許容したほうが良いです。
- 繰り返し構造のあるもの
- 表裏が同じ見た目をしている看板や、見た目が変わらない階段など。別の面を撮影した写真が混同されがちです。特に歩道橋はペンキ塗りだし階段の区別がつかないし厳しい…。
- 明確に影の線が出ているもの
- 3D化自体はできますが、生成物に影が残ります。カラーバランス調整はありますが線は消しづらいです。ライトを用意して影が出ないようにするか、屋外なら曇天を狙うか、被写体全体が影に入っていると良いです。
撮影の方法
被写体によって大きく2種類に分かれると思います。
- 小物や彫刻などのモノを撮る場合
- 部屋や市街地などの風景を撮る場合
モノを撮る場合
とにかく数を撮ること。全周ぐるっと回り込んで、可能なら5~10度ごとの写真がほしいです。
「これ同じ写真でしょ」って思うぐらい近接して何枚も撮るとディテールが上がります。
真上から・下からなどの写真も必要ですが、その際も「真上だけ撮る」ではなく「撮影済みの場所から真上まで角度を変えて何枚も撮る」ようにしないと、真上の写真の位置を見失います。
風景を撮る場合
なんといっても撮り漏らしがないことが一番ですが、そのために可能であれば「動画を撮影しながら写真を撮る」というスタイルが良い気がします。
あと幾つかポイントがあります。総じて、「撮りたいものを撮るだけでなく、位置推定のために要らないものを撮る」という意識が大事です。
- 全周囲を撮影する際は写真が重なるようにする
- 風景の撮影はとりあえず全周囲撮るところから始まりますが、写真が重ならないと意味がないです。
- いろんな位置から全周囲を撮影する
- 全周囲の撮影は位置推定のために重要です。何度やっても助かります。「もう撮ったし」と思ったが最後、写真の位置を見失います。
- 詳細を撮る時も、最初は全周囲を撮る
- たとえば風景の中にある像を詳細に3D化したいとき、その像に寄って撮りますが、寄った写真だけではやはり位置を見失います。やはり全周囲撮りましょう。
- 床と天井を撮り忘れない
- 横方向はたくさん撮っていても上下方向が漏れがちです。必ず撮りましょう。それと遠くの床は点が取れなくなるので気をつけましょう。また、天井は白一色だと
- 低い位置・高い位置からの写真を忘れない
- 机の下、棚の上などを撮影しておかないと、ディテールが不足するか、最悪穴が空きます。当然ですが複数枚撮影しないといけません。
- 撮りたいものの前に邪魔なものを入れない
- 例えば木の枝や観光客などが前側に写り込まないようにしましょう。どうしても映り込む場合、点群の作成には使って良いですが、テクスチャ作成からは除外しましょう。
3DF Zephyrの操作
公式チュートリアル
とにかく公式チュートリアルを読みましょう。英語ですが、自動翻訳でなんとなく読めます。
おすすめは各工程のパラメータのチューニング方法を教えてくれるページと、点群やメッシュに対するフィルターの説明をしてくれるページです。
おすすめ手順
3DF ZephyrはFree版で50枚、Lite版で500枚の制限があります。
この制限内かどうかで手順が変わります。
ちなみに、よほど高精細な3Dモデルを作るつもりでなければ、設定はデフォルトで良いです。
写真が制限枚数以下の場合
- 写真を全部読み込ませて、低密度点群を作成する
- 写真の位置が適切か、全てチェックする
- 位置が適切でない写真がある場合、一旦除外する
- 他の写真のなかで位置が近いものを使って、再度位置を推定させる
- 正しい位置に入ればOK、入らなければ再度除外して、あきらめる
- (以降の手順を高速化したい場合、)3D化したい対象物が収まるようにバウンディングボックスを設定する。この際やや広めに設定する
- 高密度点群を作成する
- メッシュを作成する
- 対象物以外のメッシュ・明らかに誤っているメッシュを削除する
- 「選択的穴埋め」フィルタを使い、サイズ順に適切な範囲まで穴を埋める
- 塞がらない穴がある場合は後述の手順で補修する
- ポリゴン数が多すぎるので、「リトポロジー」と「間引き」で目標ポリゴン数まで落とす
- テクスチャメッシュを作成して完成
写真が制限枚数を超える場合
メッシュ化する単位を分割し、パーツごとのメッシュを作ることを目標にします。
パーツを1つずつ成形しつつ、順番に写真を入れ替えて、全体の位置関係を記憶したまま複数のテクスチャメッシュを作成します。
- おおまかな分割単位を決めて、パーツごとに写真を分類する。ここで可能であれば「パーツ2つ分の写真が一度に入力できる」枚数に収めるようにする。最低でも、「パーツ1つ分+隣接パーツとの結合部の写真が一度に入力できる」枚数にする
- 上記分類に従って、「パーツ2つ分の写真」あるいは「パーツ1つ分+隣接パーツとの結合部の写真」を入力する
- 制限枚数以下の場合と同様の手順で、テクスチャメッシュ作成の直前まで行う
- 分割面を決めるために、オブジェクト全体を回転・平行移動し、X/Y/Z軸に綺麗に沿わせる
- 「面でカット」フィルターを使い、今回のパーツと他のパーツの分割面でメッシュを切断する。このとき、切断時の面の「平行移動」「回転」「スケール」の値をメモしておく
- 要らない側のメッシュを捨てる
- テクスチャメッシュを作成する
- 今回のパーツに使った写真を3DF Zephyr上から捨てる。このとき、次の入力との結合に使う写真は残す必要がある
- 次のパーツの写真を入力する
- 全てのパーツ分、手順3,5~9を繰り返す
あとはパーツを分けて出力しても良いですし、3DF Zephyr上でパーツすべてをマージすることもできます。
メッシュに開いた穴の補修方法
Lite版以上限定で、塞がらない穴があるとき、以下の手順で補修を試すことができます。
仮補修
- 事前にBlenderなどで板ポリやボックスの3Dモデルを補修用モデルとして準備しておく。数万ポリゴン程度までポリゴンを水増ししておくと良い。穴ときれいに一致しなくて良い。なお3DF Zephyr上はポリゴンの裏面が表示されるが、表裏で扱いが異なるようなので、板ポリは表裏2面張り合わせた構造が良い
- 「入力→モデルを入力」から補修用モデルを読み込む。非構造化のテクスチャメッシュになる
- 補修用モデルをテクスチャメッシュからメッシュに変換する
- 「オブジェクトのスケール/回転/平行移動』を使って補修用モデルを移動させ、穴に当てる。このとき、選択オブジェクト以外非表示になるが、手動でチェックを入れると表示できるので綺麗に位置を合わせる
- 補修用モデルのはみ出したメッシュを選択して削除する。見えない部分ならムリに消さなくても良い
- 補修用モデルを構造化する。すると色が付く
- 仮補修完了
- 穴がたくさんある場合は、2~7を繰り返す
この状態だと明らかに雰囲気の違うポリゴンが混ざるので、気になる場合は次の手順へ。
なじませる
仮補修の続きです。
- 補修用モデルのメッシュを高密度点群に変換する
- 元の高密度点群と、変換した高密度点群を「アドバンスをマージ」でマージする
- マージした高密度点群からメッシュを作成する
- おそらく穴が完全にふさがってはいないので、再度穴埋めする
- これでもまだ十分に補修できない場合、諦めて仮補修の状態で終える
おわり
今回、Lite版を試用して大型のフォトグラメトリー作成にチャレンジしました。
Lite版は出来ることが多くて良いですが、それ以上に全ての工程で長時間の待ちが発生して、これは相当にマシンスペックがないとつらい作業だと痛感しました。
最初の熊野神社も撮影は数十分でしたがモデル作成は2日がかりで延々計算しました。
写真の枚数が増えるほど処理が重くなり、個人の趣味で済ませられるのは数百枚が限度なんだろうと思います。