AI

3D Gaussian Splattingの原理|3Dガウシアン・微分可能ラスタライズ・最適化の仕組み

3D Gaussian Splatting(3DGS)は、複数枚の写真からリアルタイムに動かせるフォトリアルな3Dシーンを作り出す技術です。原理を一言でいえば、シーンを「色と大きさと透明度を持つ無数の楕円状のにじみ(3Dガウシアン)」の集まりで表し、それを画面へ塗りつけて描画し、正解写真との差から各ガウシアンを少しずつ調整していく、というものです。ここでは検索意図の中心である「原理・仕組み」を、表現・描画・最適化の3本柱に分けて、数式の意味まで踏み込んで解説します。

まとめ:3D Gaussian Splattingの原理は3本柱で理解する

先に結論を整理します。3DGSの原理は次の3ステップの繰り返しで成り立ちます。

  • 表現:シーンを3Dガウシアン(位置・共分散・不透明度・色を持つ楕円体)の集合で陽に持つ。色は見る方向で変わるよう球面調和関数で表す。
  • 描画:各ガウシアンを2D画面へ投影し、画面を細かいタイルに分けて深度順に半透明合成(アルファブレンディング)する。この描画がすべて微分可能。
  • 最適化:描いた画像と正解写真の差(損失)を勾配で各ガウシアンに逆伝播し、位置・形・色を更新。足りない所は複製・分割し、無駄な所は剪定する。

ニューラルネットの重みにシーンを埋め込むNeRFと違い、3DGSは3Dガウシアンという「目に見える部品」を直接持つ陽的(explicit)な表現です。この違いが、後述するリアルタイム描画(30fps以上)を可能にしています。以下、各柱の中身を順に見ていきます。

3D Gaussian Splattingの定義と登場背景

3D Gaussian Splattingは、2023年にINRIA(フランス国立情報学自動制御研究所)のGraphDecoチームが論文「3D Gaussian Splatting for Real-Time Radiance Field Rendering」で発表した手法です。SIGGRAPH 2023で最優秀論文賞(Best Paper Award)を受賞し、それまでNeRFが中心だった放射輝度場(Radiance Field)レンダリングの新たな主流の一角となりました。

「splat(スプラット)」が指す描画方法

splatは英語で「べちゃっと塗りつける/飛び散る」を意味します。3DGSでは、点群の各点を単なる座標ではなく広がりを持つ楕円状のにじみ(ガウシアン)として扱い、それを画面に塗り重ねて絵にします。ポリゴンの面を貼るのでも、光線を1本ずつ追うのでもなく、「にじみを重ねて塗る」ことがこの技術名の由来であり、描画の本質です。

NeRFとの根本的な違い

NeRF(Neural Radiance Fields)は、空間中のある点の色と密度をニューラルネットワークの重みとして暗黙的(implicit)に保持します。描画時はカメラから光線を飛ばし、線上の多数の点をネットワークに問い合わせて積分するため計算が重く、学習にも数時間かかりました。一方3DGSは、シーンを3Dガウシアンという離散的な部品の集合として陽的に持ちます。部品の座標や形が直接データとして存在するため、GPUのラスタライズ処理に載せやすく、描画時に重いネットワーク推論を走らせない分だけ描画も学習も速くなります。この扱いやすさは、UE5のようなリアルタイム3Dエンジンへの取り込みやすさにも表れています。

原理①:シーンを3Dガウシアンの集合で表す

最初の柱は「シーンをどう持つか」です。3DGSはシーンを数十万〜数百万個の3Dガウシアンで表します。1つのガウシアンが、空間のどこに、どんな形と向きで、どのくらいの濃さと色で存在するかを担います。

1つのガウシアンが持つ4種類のパラメータ

各3Dガウシアンは、次の情報を学習可能なパラメータとして持ちます。

  • 位置(平均 μ):3次元空間での中心座標。
  • 共分散行列 Σ:楕円体の大きさと向き。どの方向にどれだけ広がるかを決める。
  • 不透明度 α:そのガウシアンの濃さ。合成時の重みになる。
  • :後述の球面調和関数の係数として持つ。

この4つを全ガウシアンについて調整するのが学習であり、シーンの見た目はこれらの分布として決まります。

共分散行列をスケールと回転に分解する

楕円体の形を表す共分散行列 Σ は、そのまま最適化すると学習の途中で「共分散として成立しない(半正定値でない)値」に壊れてしまいます。そこで3DGSは Σ をスケールと回転に分解して持ちます。

具体的には、対角のスケール行列を S、クォータニオンから作る回転行列を R として、Σ = R S S^T R^TS^T は S の転置)と表します。学習では扱いやすい S(各軸の伸び)と R(向き)だけを更新し、Σ はそこから合成するため、常に正しい楕円体が保証されます。回転をクォータニオンで持つのは、3軸の回転を4つの数で滑らかに表せて勾配計算に向くためです。

見る方向で色を変える球面調和関数

実世界の物体は、見る角度によって色や光沢が変わります(ビュー依存性)。3DGSはこれを球面調和関数(Spherical Harmonics, SH)で表現します。各ガウシアンの色を1つの固定値ではなく、視線方向を入力すると色を返す関数の係数として持つのです。公式実装ではSHの次数を l = 3 まで用い、成分ごとに16個の係数(RGBで計48個)で方向ごとの色を近似します。これにより、金属や濡れた面のハイライトのような角度依存の見えを、軽い計算で再現できます。

原理②:微分可能なタイルベースラスタライズで描く

2つ目の柱は「3Dガウシアンから画像を作る描画」です。ここが高速さと学習可能性の両方を支える中核で、すべての工程が微分可能に設計されています。

3Dガウシアンを2D画面へ投影する

まず各3Dガウシアンを、カメラから見た2D画面上のガウシアンへ投影します。中心はピンホールカメラモデルで画面座標へ移し、広がり(共分散)はビュー変換 W と射影変換のヤコビアン J を使って Σ' = J W Σ W^T J^T と2Dへ変換します。射影は本来非線形ですが、ヤコビアンで局所的に線形近似することで、3Dの楕円体を2Dの楕円のにじみへ正しく潰し込みます。

タイル分割・深度ソート・アルファブレンディング

次に画面を16×16ピクセルのタイルに分割します。各タイルにかかるガウシアンだけを集め、カメラからの深度順にソートしてから、手前から奥へ順に半透明合成(アルファブレンディング)します。あるピクセルの色は、そのピクセルを覆うガウシアンの色を、不透明度 α と「手前のガウシアンでどれだけ隠れたか」の重みで足し合わせて決まります。タイル単位に分けることでGPUの並列処理に載せやすくなり、深度ソートを1回で済ませられるため、光線を1本ずつ追うNeRFのようなレイマーチングが不要になり描画コストが下がります。この合成がすべて微分可能なので、出力画像の誤差を各ガウシアンのパラメータまで逆伝播できます。GPU側の実装はCUDA(NVIDIAのGPU並列計算の仕組み)によるカスタムラスタライザで、描画と勾配計算を一体で行います。

原理③:勾配で最適化し密度を自動調整する

3つ目の柱は「どうやって正しいシーンへ近づけるか」です。3DGSは描画が微分可能なので、正解写真との差を勾配降下でそのままパラメータへ反映できます。

損失関数と学習ループ

学習は、あるカメラ位置からガウシアン群を描画し、その画像と実際の撮影画像の差を損失として測り、勾配で全パラメータ(位置・スケール・回転・不透明度・SH係数)を更新する、という流れを繰り返します。損失には画素ごとの差を測る L1 損失と、構造的な見えの近さを測る D-SSIM を組み合わせ、損失 = (1 - λ) L1 + λ L_D-SSIM(公式実装では λ = 0.2)とします。L1だけだと色は合っても質感がぼやけるため、構造を見るD-SSIMを混ぜて両立させています。

Adaptive Density Control(複製・分割・剪定)

初期の点群だけでは、細部を表すガウシアンが足りない領域と、逆に無駄なガウシアンが多い領域が出ます。そこで3DGSは学習の途中で密度を自動調整します。これがAdaptive Density Controlです。

  • 複製(clone):小さいガウシアンで表現が足りない(再構成不足の)領域は、同じガウシアンを複製して密度を増やす。
  • 分割(split):大きすぎるガウシアンが細部をつぶしている(過剰再構成の)領域は、より小さい2つに分割する。
  • 剪定(prune):不透明度がごく小さく描画に寄与しないガウシアンは削除し、計算とメモリを節約する。

この密度制御を一定間隔(およそ100イテレーションごと)で挟むことで、必要な所にだけガウシアンを配分し、少ない部品数で高い解像感を得られます。

SfM(COLMAP)による初期化と学習時間

学習の出発点となるガウシアンは、ランダムではなくSfM(Structure from Motion)のスパース点群から作ります。COLMAPなどのツールで撮影画像群からカメラ位置と疎な3D点を推定し、その各点を初期ガウシアンとして配置してから最適化を始めます。良い初期配置があるため収束が速く、簡易な品質なら数分、Mip-NeRF360やInstant-NGPと同等以上の高品質まで学習する場合でも、GPU性能とシーン規模次第で数分〜数十分規模で済みます(原論文はA100で約26分)。

リアルタイム描画を可能にする2つの仕組み

原理を押さえると、3DGSがリアルタイム(1080pで30fps以上、条件次第で100fps超)で動く理由がはっきりします。NeRFは1ピクセルにつき光線上の多数の点をニューラルネットで評価する「レイマーチング」を行うため計算が重いのに対し、3DGSは陽的なガウシアンをGPUのラスタライズで一括して塗るだけです。重いネットワーク推論を描画時に走らせないこと、タイル単位で並列化できること、この2点が速さの源です。学習済みシーンの描画はGPU特化のクラウド(ネオクラウド)のようなGPUインフラ上でも軽く回せます。

3D Gaussian Splattingが不得意な場面

速くて高品質な一方、原理上の弱点もあります。採用を見送るべきなのは次のような場合です。反射や透明・屈折が強い被写体(鏡・ガラス・水面)は、ビュー依存を球面調和関数で近似する仕組みでは表現しきれず破綻しやすくなります。撮影枚数が極端に少ない・視点が偏っているとガウシアンが正しく配置されず、見ていない角度でノイズ(floater)が出ます。また高精細シーンではガウシアン数が増え、ファイルサイズが数百MB規模に膨らむため、Webやモバイル配信では圧縮・剪定前提で設計する必要があります。用途がCADのような厳密なメッシュ・寸法を要するなら、3DGSではなくメッシュ再構成を選ぶべきです。

3D Gaussian Splattingの実行手段と派生技術

原理を理解したら、実際に触れてみると定着します。ここでは試し方と、2024〜2026年の広がりを整理します。

公式実装とノーコードで試せるツール

本格的に原理を確かめるなら、INRIA公式のリファレンス実装(COLMAPでの前処理+CUDA対応GPUでの学習)を動かすのが近道です。手元にNVIDIAのGPUがない場合や、まず結果を見たい場合は、スマートフォンで撮影した写真・動画からクラウド側で3DGSを生成するアプリ型サービスも増えており、コードを書かずに「写真からリアルタイム3D」を体験できます。生成したシーンはブラウザ向けビューアやゲームエンジン用プラグインで表示でき、VRChatなどメタバース空間へ持ち込む事例も出ています。

主要な派生手法と対応の広がり

2023年の発表以降、原理を拡張した派生が数多く発表されています。拡大縮小時のエイリアスを抑えるMip-Splatting、面としての形状を精度良く取り出す2D Gaussian Splatting、動く被写体を扱う4D/Deformable Gaussian Splatting、配信向けにデータ量を削減する圧縮・剪定手法などです。ゲームエンジンやCADツール側の読み込み対応も広がり、点群・NeRFに続く3D表現の選択肢になっています。基礎となる原理(表現・描画・最適化の3本柱)はこれらの派生でも共通なので、本記事の理解がそのまま応用の土台になります。

よくある質問

3D Gaussian Splattingの原理を数式なしで一言でいうと?

「色と大きさと透明度を持つ無数のにじみ(3Dガウシアン)を空間に置き、それを画面に塗り重ねて絵にし、正解写真との差でにじみを少しずつ直していく」技術です。塗る・比べる・直すの繰り返しが原理の核です。

NeRFと3D Gaussian Splattingはどちらを使うべき?

リアルタイムで動かしたい・学習を速く回したい・ゲームエンジンに載せたいなら3DGSが有利です。ネットワークの重みとしてコンパクトに保持したい、反射や透明の表現を重視するなど、用途によってはNeRF系が向く場面も残ります。目的が「速い描画」か「表現の柔軟さ」かで選び分けます。

動かすにはどんなGPUが必要?

公式実装での学習にはCUDA対応のNVIDIA製GPUが実質必須で、VRAMは扱うシーン規模に依存します。学習済みシーンの描画(ビューア表示)は要求が軽く、より広い環境で動きます。GPUを用意できない場合はクラウド生成型のサービスを使う選択肢があります。

スマホで撮った写真からでも作れる?

作れます。原理上はカメラ位置が推定できる複数視点の画像があれば十分で、SfMでカメラ位置と初期点群を求めてから最適化します。被写体の周囲をまんべんなく、ピンボケや動体を避けて撮ると品質が上がります。

「splat」とはどういう意味?

splatは「べちゃっと塗りつける・飛び散る」という意味の英語です。点を面や線ではなく広がったにじみとして画面に塗り重ねる描画方法を指し、この塗り方がそのまま技術名になっています。

関連記事

資料請求

RELATED POSTS 関連記事