検証環境
今回の撮影・検証は以下の環境で行っています。設定内容(特にグラフィックAPIやパフォーマンス)は環境によって変わる可能性があるので、参考情報として記載しておきます。
| 項目 | 内容 |
|---|---|
| ゲームエンジン | Unity 6(URP) |
| CPU | 11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz |
| メモリ | 64.0 GB |
| グラフィックスカード | 8 GB(複数GPU搭載構成) |
| ストレージ | 1.84 TB |
準備:UnityでGaussian Splattingを表示できるようにする
今回はXGRIDSのLCC形式のデータを使うことを前提とします。LCCデータをUnity上に表示するには、XGRIDS公式のUnity用SDKを事前に導入しておく必要があります。詳しいダウンロード手順からunityの設定、LCCデータの読み込みまでの詳しい手順は、XGRIDSの公式ドキュメントにまとまっているので、そちらを参照してください。
XGRIDS Developer Documentation
ここまで完了し、再生させるとSceneビューやGameビューにGaussian Splattingが表示される状態になれば準備は完了です。以降は、その表示されたスプラットに対してカメラを動かし、撮影していく手順を説明します。
なぜUnityで撮影するのか
RealityScanのようなフォトグラメトリソフトは、本来「実際にカメラで撮った写真」を使って3D形状を計算するソフトです。今回はその入力として、実写の代わりにUnity上でレンダリングしたGaussian Splattingの静止画を使います。このとき問題になるのが「カメラをどう動かして、どこを撮るか」です。よくある方法は、3ds MaxなどのDCCツールでカメラの通り道(スプライン)を手描きし、それに沿ってカメラを動かす方法ですが、これをやろうとするとGSデータそのもの、あるいは位置決め用の仮メッシュ(アタリ)をDCC側にも用意する必要が出てきます。
今回は、この手間を省き、Unity上だけでカメラの動きを自動計算するスクリプトを使います。
撮影準備
今回使用するスクリプトは「中心座標から半径〇mの球面をカメラがぐるぐる回る」といった計算なので、撮影したい中心座標とその半径をあらかじめ出しておく必要があります。
今回撮影する部屋はデコボコした形状なので、「table、shelf、room」の3エリアに分け、各中心点に球体を設置しました。わかりやすいように球体自体にもエリア名に変更しておきました。
各球体のInspectorのTransformの数値を撮影スクリプトに参照します。
この球体に沿ってカメラが走るイメージなので、スプラットと被らないようにサイズと配置に注意してください。

撮影スクリプト
以下のスクリプトを空のGameObjectにアタッチして使います。部屋をリストで登録し、まとめて自動撮影できます。
[gist id="22e7114316859d86d936331673298079"]
スクリプトのパラメータ一覧です。
| パラメータ | 役割 | 目安・補足 |
|---|---|---|
| Center / Radius | 撮影の中心・大きさ | 計測用オブジェクトで割り出す |
| Elevation Rings | 高さ方向の段数 | 多いほど死角が減るが枚数も増える |
| Min / Max Elevation | 仰角の範囲 | 天井が低い部屋は狭めに |
| Azimuth Steps | 水平方向の分割数 | 内観は無地の壁が多いので多めが目安 |
| Radius Shells | 半径の倍率(複数指定可) | 倍率ごとに撮影することで異なる距離で重ね撮りが可能 |
| Reverse Direction | 回転方向(時計/反時計) | 部屋ごとに切り替え可 |
| Interleave Shells | 奇数番目のシェルを半歩ずらす | 同じ枚数で角度密度を上げる |
| Warmup Frames | 撮影前の待機フレーム数 | 靄っぽい場合は増やす(今回は20) |
今回のオフィスの設定の数値です。こちらを目安に設定を調整してみてください。
| Room Name | Center (X, Y, Z) | Radius | Elevation Rings | Min / Max Elevation | Azimuth Steps | Radius Shells |
|---|---|---|---|---|---|---|
| room | 1.746, 1.117, -1.027 | 2 | 3 | -10 / 40 | 48 | 0.6, 0.9 |
| table | -1.966, 1.926, -1.018 | 0.5 | 3 | -10 / 40 | 48 | 0.6, 0.9 |
| shelf | 5.319, 0.869, -0.001 | 1 | 3 | -10 / 40 | 48 | 0.6, 0.9 |
スクリプト導入から書き出しまで
1.空のGameObjectを作り、このスクリプトをアタッチする
2.Capture Cameraに、撮影用のカメラ(LCCのスプラットが正しく映るカメラ。基本的にはLCCViewerのMain Camera)を指定する
3.Roomsに、撮りたい部屋を1つずつ追加し、任意の名前に変更します。この名前で各部屋リストごとに保存フォルダが生成されます。前項の方法で調べたCenter(中心座標)・Radius(半径)と、仰角範囲などを設定する。
4.必ずPlayモードに入ってから、インスペクタでスクリプト名を右クリックし「Capture All Rooms」を選ぶ。その際、計測で作成した各球体はオフの状態にしておきましょう。
5.指定したOutput Root Folderの中に、部屋名ごとのサブフォルダが作られ、連番のPNG画像が保存される
撮影のコツ
- 仰角の範囲を天井高に合わせて狭める:天井が低い部屋では上下の角度幅を控えめに。
- 戸口・開口部はカメラが通り抜けないよう注意:撮影後にプレビューして、壁の反対側から撮れていないか確認します。
-
死角になりやすい場所は個別に追加撮影する:部屋の隅や家具の裏などは、
Centerを移動してRadius Shellsを小さくした追加撮影で補完します。
- 重なり(オーバーラップ)はむしろ多めに:内観は特徴の少ない壁面が多く、アライメントに失敗しやすい傾向があります。
- 部屋同士のつなぎ目も撮っておく:後編でRealityScanに一括で読み込んで1つのメッシュにまとめたい場合、部屋の境界を跨ぐ撮影ポイントも加えておくと安全です。





