見出し画像

3DGS実用化への道⑥ Google Earth Studioから3DGSへ|Blenderアドオン『SkySplat』で"江の島"の空撮を3Dガウス化する方法

こんにちは、STUDIO55技術統括の入江です。

「3Dを作る」という行為は、いつの間にか “モデリングする” から “空間をそのまま取り込む” 方向へと変わり始めています。

1年ほど前、
「衛星データとかを 3DGS にできたりしないんですかね?」
といった意見を耳にしたことがありました。

AI マンガ

理論的には不可能ではないように思えましたが、当時はまだ、それを現実的な選択肢として語れる段階ではありませんでした。

ガウシアン・スプラッティング(3DGS)は非常に優れたスキャン生成技術である一方、空撮利用を前提とした SfM/カメラアライメントが本当に成立するのか という点に、率直な違和感があったからです。

しかし今、そうした発想が、いよいよ技術として実現可能なものになりつつあります

本記事では、空撮データからのガウス化に特化した設計思想を持つ 2つの先進的技術を、今週と来週の2回にわたって取り上げます。

今回は、Blender アドオン『SkySplat(スカイスプラット)』 について、実際のワークフローを交えながら詳しく解説していきます。


❓「地上スキャン」と「空撮スキャン」はなぜ別物なのか

まず、通常の「地上スキャン」「空撮スキャン」が、なぜ別物として扱われるのかについて整理しておきます。

地上スキャン と 空撮スキャン は、スケール・視点・光学条件・データ処理方法が異なるため、別物として扱うのが自然です。

以下に、その違いとなる 4つのポイント を箇条書きにします。


1️⃣ 視点・スケールの違い

視点・スケールの違い
  • 地上スキャン

    • 人間の目線〜低高度で撮影

    • 小〜中規模の範囲(建物1棟、室内など)をカバー

    • 細部まで高精細なオブジェクト表現が可能

  • 空撮スキャン

    • 上空数十〜数百メートルの高さから撮影

    • 大規模の範囲(都市、地形、街区など)をカバー

    • 広域俯瞰中心で、細かいオブジェクトはぼやけることがある

ポイント: 視点やスケールの違いにより、必要な解像度やカメラ設定、処理方法が大きく変わります。

2️⃣ カメラ配置と重複の取り扱い

カメラ配置と重複の取り扱い
  • 地上スキャン

    • 物体を中心に、周回または複数角度から撮影

    • 被写体との距離が近く、カメラ間の重複が少ない場合もある

  • 空撮スキャン

    • 高度が高く、俯瞰から広域をカバー

    • 道路・建物・地形などを効率的にスキャンするため、画像間の重複(オーバーラップ)が多くなる

    • 広域のカメラ配置を想定した補正が必要

3️⃣ 光学的・幾何学的課題

光学的・幾何学的課題
  • 地上スキャン

    • 屋内外での陰影や反射の影響を受けやすい

    • 三角測量(SfM)やレーザースキャンでも比較的精度が取りやすい

  • 空撮スキャン

    • 太陽光・影・大気条件の影響が大きい

    • 高低差のある地形では、俯瞰の画像だけだと奥行き情報が不足することがある

4️⃣ データ処理・生成の違い

データ処理・生成の違い
  • 地上スキャン → 3DGS

    • オブジェクト単位での高精細生成に向く

  • 空撮スキャン → SkySplat / 3DGS

    • 広域・俯瞰シーンの生成に最適化されている

    • データ量が多く、大規模シーンを効率的に扱うための圧縮・レンダリングが必要

「地上スキャン」と「空撮スキャン」

「SkySplat」が他の 3DGS 系ツールと明確に異なるのは、こうした違いを踏まえ、最初から 「空から撮る」ことを前提に設計されている点 にあります。

SkySplat の設計に見る特徴

ドローン映像・写真を前提としたカメラ配置
 高高度・斜め視点・広域カバー
 地形・都市・ランドスケープ向き

大規模シーンに強い設計
 建物群、街区、地形など
 局所スキャンではなく「空間全体」を一気に捉える用途

SfM/アライメントの思想が空撮向け
 上空からの視点変化
 高低差のある地形データを想定

具体的にどのようなガウス処理が行われるのかは、実際のチュートリアルを通しながらご紹介します

まずは、「地上スキャン」と「空撮スキャン」では処理の仕組みが異なる という点だけを念頭に置いておいてください。

🐱Github『SkySplat_blender』

Blender 用アドオン 『SkySplat_blender』 の初期リリース(v0.1.0)は、2025年5月28日です。
その後、v0.2.0、v0.3.0、v0.3.1、v0.4.0、そして 2025年11月29日公開の最新リリース v0.4.1 まで、昨年中に計6回のアップデートが行われています。

画像参考: skysplat.org
SkySplat の公式サイト(ランディングページ)

GitHub ユーザー名「kyjohnso」こと、Kyle Matthew Johnson 氏が提供しているもので、100以上スターが付いている人気リポジトリです。

Kyle Matthew Johnson 氏のページ

GitHub ページ はこちら。

画像参考: github.com

ここでは、リポジトリの構成上の前提条件として Zola 0.17.0 以上 が必要とされています。
この環境が整っていれば、https://skysplat.org のウェブサイトをローカルで開発・プレビューすることができます。
具体的には、Markdown ファイルなどのコンテンツを Zola が自動的に HTML ページに変換する仕組みです。

SkySplat の公式サイトを編集したり、ドキュメントに貢献したりする場合以外は、わざわざローカル環境を構築する必要はありませんので、ここでは Blender で「SkySplat」を使用する方法について解説していきます。

🔩Blender アドオン設定

GitHub のリポジトリページにある最新リリース 「v0.4.1」 から、使用環境に合った Zip ファイルを選んでダウンロードします。

※ダウンロードページへのリンクは、以下に貼っておきます。

画像参考: github.com

ダウンロードができたら、Blender にそのまま Zip インストール。
すると、このようなツールタブが追加されます。

「SkySplat」パネル

🌏Google Earth Studio で空撮をレンダリング

ドローン映像など、手元に空撮素材をお持ちの場合はそちらを使用すると良いですが、ここではお試し用として Google Earth Studio を使い、仮の空撮素材を用意します。

画像参考: earth.google.com/studio/

クィックスタートの「軌道」を使用します。

Google Earth Studio

「江の島」を場所に指定。

Google Earth Studio

江の島のシーキャンドルを中心にぐるりと旋回するカメラアニメーションにします。

Google Earth Studio

mp4 でレンダリング。

Google Earth Studio

~『SkySplat』チュートリアル~

では、Blender で作業していきます。

Blender の「SkySplat」パネルの上から順に構成をおこなっていく形です。

「SkySplat」パネル項目

① SkySplat Video Loader
② SkySplat - Structure from Motion (COLMAP)
③ SkySplat - Gaussian Splatting (Brush)

① SkySplat Video Loader

「Video Instances」の「+」ボタンをクリックして、新規「Video_1」を作ります。

「Video Instances」

「Video & Metadata Files」の「Video File」にあるフォルダアイコンから、動画素材を読み込みます。

画像はすでにビデオを読み込ませた状態

👉 日本語が含まれないフォルダ直下に配置することをおすすめします。

ビデオが読み込まれると、「Frame Extraction(フレーム抽出)」の内容が表示されます。

「Frame Extraction」

今回 GES でレンダリングしたビデオは 1501 フレーム あります。
これを Frame Step 10 で Output Folder に .png として書き出す設定になっています。
(20 ステップ程度でも問題ありません)

「Extract Frames」ボタンをクリックすると、書き出しが開始されます。
書き出された連番画像は、元のビデオがあるフォルダ内に自動生成されたサブフォルダに格納されます。

連番書き出しされた png画像フッテージ

② SkySplat - Structure from Motion (COLMAP)

基となるビデオの読み込み作業が終わったら、次は COLMAP の設定に進みます。

COLMAP は、写真や動画から 3D のカメラ位置や特徴点を自動で再構成してくれるツールです。


📥COLMAP ダウンロード

COLMAP は、以下のサイトからダウンロードします。

画像参考: github.com/colmap/

ページをスクロールして、こちらのデータを選んでください。

画像参考: github.com/colmap/

「COLMAP Setting」にある「COLMAP Executable(COLMAP 実行可能ファイル)」のフォルダアイコンをクリック。

COLMAP\bin\ フォルダ内の「colmap.exe」を選択して Accept します。

colmap.exe

これで、COLMAPの実行可能ファイルが選択されました。
下の「Run COLMAP」ボタンをクリックして、このプロジェクト用に実行します。

👉 COLMAP の実行には少し時間がかかるので、しばらくの間は休憩タイムです(笑)。

👉 Toggle System Console を起動しておくと、万が一エラーが出た場合にログを確認できます。
Window → Toggle System Console

完了の目安はおおよそ 20 分ですが、マシンスペックによって前後します。

COLMAP実行完了の画面

COLMAP の実行が終わると、output フォルダ が生成され、その中に各種データが格納されています。

colmap_output

「Load COLMAP Model」 をクリックします。

これで、COLMAP によってアライメントされた 3DGS モデルが読み込まれます。

COLMAPでアライメントされたスキャンデータ

回転ツールを使って、モデルをワールド座標に合わせます。

X軸正対で確認した状態
ワールド座標に合わせた状態

「Export Transformed Model」をクリックします。

これは、COLMAP でアライメントされた sparse 点群(特徴点だけの 3DGS 元データ)を ワールド座標などの座標系に合わせて変換(トランスフォーム) するためのエクスポートです。

_colmap_output\transformed\sparse\0 に、座標軸を合わせた sparse データが作成されます。

※この操作によって、次に Brush で Gaussian を配置する段階で、正しい座標・向きの基礎データが準備されます。

transform された sparseデータ

次に、「Create Camera Animation」をクリック。

「Create Camera Animation」
完了した作業内容が→青の状態の箇所です

これで、GES で設定したカメラアニメーションが SfM によって再現されます。

AnimationCamera_COLMAP

COLMAP の設定項目の最後、「Prepare Brush Dataset」 ボタンをクリックします。

「Prepare Brush Dataset」

COLMAP データフォルダ内に 「brush_dataset」 フォルダが作成されます。

COLMAP「brush_dataset」

フォルダの中を開くと、「images」「sparse」 の 2 つのフォルダが入っているのが確認できます。

「images」と「sparse」

これは、Brush用に整備された sparse データです。


💡 ポイント

「Export Transformed Model」の sparse → 準備段階
「Prepare Brush Dataset」の sparse → Brush 用の利用段階

同じ「sparse」という名前でも役割が違う ので、注意が必要です。

COLMAP Output
└─ transformed
   └─ sparse\0   ← 座標変換済み、Brush未使用

Brush Dataset
└─ sparse      ← Brush用に整備済み、Gaussian配置可能
2種類の「sparse」データ

💡補足.「Sparse」について

「sparse(まばら)」は、空撮映像から SfM によって推定された疎な3D特徴点と、各フレームのカメラ位置・姿勢をまとめた再構成データの事です。

これはガウスを配置するための「空間の骨格」として使われます。

つまり、SfM(Structure from Motion)によって再構成された「疎な3D特徴点+カメラ姿勢」の集合データ(空間を理解するための最小構成データ) となるものです。

「sparse」

通常は dense reconstruction(密な3D再構成) を経て depth や mesh、NeRF、3DGS が生成されます。
SkySplat ではこのステップを省き、疎な構造(sparse)を足場に brush で直接ガウスを配置します。

この「dense を作らず、疎な構造+人の判断でガウス化する」という設計が、SkySplat の空撮向け思想の特徴 となっています。

③ SkySplat - Gaussian Splatting (Brush)

最終フェーズは、「Brush」によるガウススプラッティングの構築です。
ここにもっとも SkySplat の空撮専用ガウス生成の特徴が見られます。

「Gaussian Splatting (Brush) 」の 項目を展開すると、これまで何も表示されなかった部分に、先ほど「Prepare Brush Dataset」で準備されたデータの各設定が表示されています。

内容を確認したら、下部の 「Run Brush Training」 ボタンをクリックします。

「Run Brush Training」

すると、「Brush」画面が別起動します。

Brush

🖌 Brush – 空撮専用 3DGS 生成の特徴

SkySplat における「brush」は、空撮スキャン分野に既存する SfM や点群生成の考え方を土台にしながら、3D Gaussian Splatting を空撮用途で扱うために、開発者が独自に設計した生成インターフェースです。

つまり、空間のどこに、どのような密度でガウスを配置するかを指定するための操作で、「brush」という名称 はその操作感から来ています。一点ずつ厳密に自動生成するのではなく、一定の領域・条件に対してまとめてガウスを生成・配置する感覚が、まさに「絵を塗るブラシ」に似ているためです。

空撮スケールでは、対象空間が広大で視点差が大きく、特徴点も疎になるため、従来の自動最適化だけでは正確な 3D 構造を作るのが難しい状況が発生しやすくなります。

空撮からのガウス生成の問題点と解決策

SkySplat では、この問題を回避するために brush による手動生成 を採用。疎な特徴点を足場にしながら、安定してガウスを配置できる設計になっています。

💻 Brush 画面構成について

COLMAP によって SfM(Structure from Motion)で再構成された疎な特徴点群とカメラ位置を足場に、Brush が 3D Gaussian を配置していきます。
配置の進捗やガウスの密度などは Stats(ステータス) で可視化されるため、現在の状況を直感的に確認することができます。

「Stats」

Splats: 133,674個の Gaussian Splatが生成中
Train step: 165
Training time: 15秒経過

完了の目安は、Train step の最大値(通常は 30,000ステップ)に到達するまでです。

以下が、完了した Stats 画面です。

完了した状態

Train step: 30000 完了!
✅Splats: 1,059,384個
✅Training time: 29分22秒


💡補足.「Train step」について

Train step(トレーニングステップ)は、Gaussian Splatting の最適化処理の回数を表します。

1ステップごとに、以下の処理が行われています。

  • カメラ視点からのレンダリング

  • 実際の画像との比較

  • 誤差の計算

  • Gaussian のパラメータ(位置・色・サイズ・回転など)の微調整

100万個以上の Gaussian を最適化するには、少しずつパラメータを調整して徐々に画像に近づける必要があります。

進行のイメージは以下の通りです。

  • Step 1,000 → まだぼやけている

  • Step 5,000 → 形が見えてきた

  • Step 10,000 → かなり鮮明

  • Step 20,000 → ほぼ完成

  • Step 30,000 → 最終調整完了 ✅


🖱 Brush でのガウス生成操作

上下に分かれた画面表示では、
下の画面が Dataset(データセット)、つまりトレーニングに使用された元の写真やフレームです。
上の画面は 3DGS の表示で、Gaussian Splat の生成状況が確認できます。

上(3DGS)下(Dataset)を見比べることで、トレーニングの品質や元画像との再現度を直感的にチェックできます。

上(3DGS)
下(Dataset)

また、カメラアニメーションでコマ送りにして確認したり、画面を自由に操作して生成状態を360°確認することも可能です。

元画像と連動して 3DGS を確認できる仕様は、非常に便利で工夫の光るポイントです。

画面は、以下の操作で自由にカメラを動かすことができます。

Controls

・左クリック + ドラッグ : オービット(視点を回して周囲を確認)
右クリック + ドラッグ : 回転
中ボタンクリック + ドラッグ : パン(平行移動)
中ボタンスクロール : ズームイン/ズームアウト
W/A/S/D : フライモードで前後左右に移動
Q / E : 上下移動
Z / C : 回転、X : 回転リセット
Shift : 移動速度を高速化

画面操作

生成が完了したら、3DGS 画面の 「Export」 ボタンからデータを取り出すことができます。
出力されるデータ形式は .ply です。

Export

🎨SuperSplat で編集

エクスポートした .plyファイルを Super Splatで編集します。

Super Splat

不要な範囲を選択して 削除 していきます。

Super Splat

この状態まで編集できたら、再度 .ply ファイル としてエクスポートします。

Super Splat

✨Blenderで3DGSを利用した表現

編集した .ply を Blenderに読み込んで表現していきます。

Blender に plyインポート

簡単に水面を設定して、レンダリングします。

Blender 水面用シェーダーの設定 : Wireframe
Viewport Shading : Material Preview

Cyclesの レンダリング ビューポートです。

Viewport Shading : Rendered

このように、Google Earth Studio(GES)の映像をもとに、空撮映像からモデルアセットを抽出し、それらを Blender の CGワークフローで扱えることが確認できました。

⚠️ 利用に関する注意点

Google Earth / Google Earth Studio の映像や画像は、Google の利用規約に基づく制限 があります。
基本的に、個人利用や教育目的での使用は認められていますが、商用利用や再配布には制限がある 点には注意が必要です。

実務で 3DGS を活用する場合は、
自作の空撮映像ライセンスフリー素材 など、権利をクリアした素材に置き換えて運用すること が、安全かつ現実的な選択となります。

🚀ゼロから作らない3D制作──SkySplatが実現する新しいワークフロー

空撮映像から直接 3DGS を生成できる技術が実用化されることで、建築や都市計画、映像制作など、さまざまな分野で新しい活用アイデアが次々と生まれる可能性があります。

こうした技術の進化により、もはや 3D モデルを「ゼロから作る」時代は終わりつつあります。
空間をそのまま取り込み、短時間で高精度な 3D データを生成する──SkySplat が示すのは、まさにこの新しい制作フローの可能性です。

今後は、このようなワークフローを活かした具体的なプロジェクトや実務活用がますます広がっていくでしょう。