浜松城 3Dデジタルアーカイブ メイキング

静岡県の指定文化財『浜松城』を3Dデジタルアーカイブしてみました。

広域な3D Gaussian Splatting × フォトグラメトリ。

それぞれの得意分野を活かしミックスした3D空間を構築。

  • 地面、銅像、看板等 → フォトグラメトリ
  • 植栽、空等 → 3D Gaussian Splatting

以下簡単なメイキングです。

機材と使用ソフト

出張で浜松へ行ったついでの撮影だったので、機材は最低限。

撮影時間と足運び

炎天下しんどかったので10分ごとに休憩を挟みつつ、そして人が来た時も待機しつつで、1時間半ほどで撮影。
撮影枚数は1367枚。

フォトグラメトリ足運びはこんな感じ。

いつも通りループクローズを意識。

カメラの高さは普通に手で構える位置。
アライメント精度を高めたい場合はロッドを使って頭上から微俯瞰で撮影したりもするが、今回は機材も持っていってなかったのと猛暑でそんな気力もなかったので普通に手持ちの高さで撮影。

絞り:11
シャッタースピード:1/200
ISO:100

フォトグラメトリ処理

メッシュ化やテクスチャ生成はいつもどおりの流れ

3D Gaussian Splatting処理

フォトグラメトリのメッシュと3DGSのSplatを統合したかったのと、規模が大きくなると3DGSのCOLMAP等では写真位置推定がうまくいかない場合が多いので、RealityCaptureでアライメントした結果を書き出し3DGS処理を行った。

これによってフォトグラメトリと3DGSのそれぞれのデータも同じ座標になるので綺麗に統合出来る。

ワークフローは以下の通り。

  1. RealityCaptureからbundle.outファイルと歪み補正画像を書き出す
  2. RealityCapture-to-Postshotを使いbundle.outをCOLMAP形式に変換する
  3. 変換したCOLMAPデータを使って公式3DGSで処理する
なぜGUI操作可能で便利なPostshotを使っていないの?

現状ではPostshotでは広域、規模の大きなシーンの処理を行うと細部の再現精度が大きく落ちてしまうため。
細部の再現精度を上げるにはSplatの密度も上げる必要があるか現時点ではここのコントロールがうまく行えず、公式3DGSの方で各種パラメーターを最適化して生成した方が良好な結果をなったため。

以下その比較。

・Postshot (ADC)

・Postshot (MCMC)

・公式3DGS

フォトグラメトリと3DGSの統合処理

まずそれぞれのデータの状態を確認。

フォトグラメトリのデータ

フォトグラメトリは動く物体や形状の細かな物体の生成は得意ではなく、かつ地上からのみ撮影を行っていた場合はこのように樹木周りに品質の低いバリ状のメッシュが生成されてしまう。

3D Gaussian Splattingのデータ

こちらは植栽の表現がとても綺麗。

しかし一方で地面の砂利は十分な解像度が得られておらず、3DGS特有の複数の楕円体の重なりで構成されている様子がわかる状態になってしまっている。
※Splatの密度を上げることで再現可能ではあるがデータ容量や処理コスト的にあまり現実的ではない

フォトグラメトリと3DGSの2つのデータをそのまま合体

そのまま合体させるとフォトグラメトリのメッシュに3DGSの暗めのモヤが乗った状態となり、あまり見栄えの良いものにならない。

なので「フォトグラメトリで使いたい部分のみのデータ」と「3DGSで使いたい部分のみのデータ」をそれぞれ用意する。

フォトグラメトリを採用するエリアのみのデータに調整

地面と銅像のみのメッシュにした。

3D Gaussian Splaatingを採用するエリアのみのデータに調整

地面と銅像部分のSplatを削除した。

今回はレンダリングにはUnityGaussianSplattingを使用したのでこの機能で不要な部分のSplatを非表示に編集した。

編集した2つのデータを統合

フォトグラメトリと3DGSのそれぞれの利点を活かした、いいとこ取りのデータに出来た。

Unityでブラッシュアップ

看板の文字はフォトグラメトリや3DGSで表現するのはデータが重くなってします、現地で別撮りしておいた写真を板ポリにはりつけて表現した。

3DGSだと細部の再現精度が低い状態。

ここにフォトグラメトリのモデルを配置すると、

メッシュとSplatが重なって汚い状態になってしまう。
なのでこの部分のSplatを削除する。
(前項目で解説したのと同様の手順)

そしてこの部分にフォトグラメトリのメッシュモデルを配置。

しかしこれでもまだぼやけていて文字を読むには解像度が足りないので、別撮りしておいた写真を板ポリに貼り付けたものを配置。

これで寄りでも見れるものにできた。

お好みでコンテンツ化

今回はThirdPersonのアセットを入れて歩けるようにしたり、
UnityRecorderで4k動画60fpsレンダリングを行った。

キャラクターが歩き回るためにはコライダーが必要だが、これはフォトグラメトリのメッシュを大幅にリダクションしたものを使用。

以上!

フォトグラメトリも3D Gaussian SplattingもまずはRealityCaptureで写真位置推定するワークフローは共通なので、今後はこのいいとこ取りハイブリッド版を活用したコンテンツも色々作ってみたいな。