!

本記事はAI(Claude)との対話をもとに構成・執筆しています。内容の正確性には注意を払っていますが、誤りや不正確な記述が含まれている可能性があります。お気づきの点があれば、コメントでご指摘いただけると助かります。

3D点群データを扱う場面が増えています。文化財のデジタルアーカイブ、都市の3Dスキャン、自動運転のためのLiDAR計測など、応用分野は広がる一方です。しかし、PLY、LAS、ガウシアンスプラッティング、Potreeといった関連する用語が多く、それぞれの位置づけや関係性が掴みにくいと感じる方も多いのではないでしょうか。

本記事では、これらの技術やフォーマットがどのようにつながっているのかを整理してみます。


点群(Point Cloud)とは

点群とは、3D空間中の点の集合によって物体や空間の形状を表現するデータ形式です。各点は最低限の位置情報(x, y, z)を持ち、それに加えて色(r, g, b)、法線ベクトル、反射強度などの属性を付与できます。

点群の取得方法は主に以下のようなものがあります。

  • LiDAR(Light Detection and Ranging) :レーザー光を照射し、反射光の往復時間から距離を計測します。航空測量、自動運転、地形調査などで広く利用され、1回のスキャンで数億〜数十億点のデータが得られることもあります。
  • SfM(Structure from Motion) :複数の写真から3D構造を復元する手法です。カメラ位置の推定と三角測量を組み合わせて密な点群を生成します。比較的安価な機材で実施でき、文化財のデジタル記録などで活用が広がっています。
  • 3Dスキャナ :構造光やレーザーを用いて対象物の表面形状を直接計測します。建築物の現況調査や製造業での品質管理に用いられます。

取得方法によって点群の密度、精度、付随する属性が異なり、それが後段のファイル形式選択にも影響します。


PLY(Polygon File Format)

汎用的な3Dデータの器

PLYはスタンフォード大学で3Dスキャンデータの保存用に開発されたフォーマットです。正式名称は「Polygon File Format」で、もともとはポリゴン(メッシュ)データの保存を主な目的としていました。

PLYの最大の特徴は汎用性 にあります。ヘッダ部に属性の定義を記述し、データ部に頂点ごとの値を格納するシンプルな構造で、ASCII形式とバイナリ形式の両方をサポートしています。そして重要なのは、PLYは点群専用の形式ではない ということです。同じ .ply という拡張子であっても、中身はまったく異なるデータを格納できます。

PLYが格納できる3種類のデータ

PLYファイルは、ヘッダの内容によって大きく3種類のデータを表現します。

① メッシュ(Mesh)

頂点(vertex)に加えて面(face)の情報を持ちます。面は通常、三角形の頂点インデックスのリストとして記述されます。3Dスキャナの出力やCGモデルの保存に用いられます。

pfepppepelolrrrlrnyreoooeodmmpppmp_aeeeeeehtnrrrnrettttttaayyyydsvfecefffalrirlllciitoooeseaaat1xttt1.3u06xyz5c77h87a82r686intvertex_ifnadcieces

このようなファイルは135万以上の三角形で構成されたメッシュデータであり、ビューアで開くと滑らかな表面として描画されます。

② 点群(Point Cloud)

頂点の座標と色などの属性のみを持ち、面の情報がありません。LiDARやSfMの出力として広く使われます。

pfeppppppelolrrrrrrnyreoooooodmmpppppp_aeeeeeeehtnrrrrrretttttttaayyyyyydsvecefffuuurirlllcccitooohhheaaaaaa1xtttrrr.01xyzrgb0erl0deu0ee0n0face

③ ガウシアンスプラッティングデータ

後述するガウシアンスプラッティングの学習結果も、PLYの拡張属性として保存されます。詳細は「ガウシアンスプラッティング」の節で説明します。

PLYの判別方法

同じ .ply ファイルでも中身が異なるため、ヘッダを確認することで判別できます。

  • element face がある → メッシュ
  • scale_0rot_0opacityf_dc_0 などがある → ガウシアンスプラッティング
  • 上記のいずれでもなく element vertex のみ → 点群
#dePfLYchiirldffearts"aus=ernrrileyenf"et(ty\muku"_nerrPp"nninol.tniyj""n(ofMhGthiaedaencsruCa(ehsldh"fsoeePoiuraiLrad_dnYnle"kPirhSLn_dipYelrnl"si:a)n(t:e"ssP)cLaYl"e_0","rot_0","opacity","f_dc_0","f_rest_0")):

その他の主な点群ファイル形式

PLY以外にも、用途や分野に応じた点群ファイル形式が存在します。

LAS / LAZ

LASはアメリカ写真測量学会(ASPRS)が策定した、LiDAR点群データのための標準形式です。GPSタイムスタンプ、反射強度(intensity)、リターン番号(1つのレーザーパルスからの複数反射を区別する)、点の分類コード(地面、建物、植生、水面など)といったLiDAR特有の属性を標準仕様としてサポートしています。

LAZは、Martin Isenburgが開発したLASの可逆圧縮版です。ファイルサイズが元の7〜20%程度に縮小されるため、数十GBに達することもあるLiDARデータの保存・配布で事実上の標準となっています。LAStools、PDAL、CloudCompareなど主要なツールがすべて対応しています。

測量・GIS分野ではPLYよりもLAS/LAZが圧倒的に主流であり、国土交通省のPLATEAUプロジェクトなどでも採用されています。

E57

E57はASTM国際規格として策定された、3Dスキャンデータの交換用フォーマットです。点群データに加えて、2D画像、スキャナのメタデータ(機種、位置、姿勢など)、複数スキャンのセッション情報を1ファイルにまとめて格納できます。

異なるメーカーのスキャナ間でデータをやり取りする際のブリッジ役として設計されており、建設・建築分野のBIM(Building Information Modeling)ワークフローで特に重視されています。

その他の形式

形式概要主な用途
XYZテキストベースで1行1点の座標を記述する最もシンプルな形式軽量なデータ交換
PTSLeicaの3Dスキャナで用いられるテキスト形式Leica製スキャナからのエクスポート
PCDPoint Cloud Library(PCL)の独自形式。ヘッダ付きでバイナリ・ASCIIに対応PCLを用いた点群処理パイプライン
OBJメッシュ形式だが、頂点のみで点群として利用されることもある3Dモデリングソフト間のデータ交換

ガウシアンスプラッティング(3D Gaussian Splatting)

概要

3D Gaussian Splatting(3DGS)は、Kerblら(SIGGRAPH 2023)が発表した、リアルタイムのNovel View Synthesis(新視点画像合成)手法です。シーンを数十万〜数百万の**3Dガウス分布(楕円体)**の集合として表現します。

従来のNeRF(Neural Radiance Fields)がニューラルネットワークによる暗黙的な表現であったのに対し、3DGSは各ガウスが明示的なパラメータを持つ陽的表現 であり、レンダリング速度が大幅に向上している点が特徴です。

メッシュでも点群でもない第三の表現

ガウシアンスプラッティングのデータは、メッシュとも点群とも異なります。

  • メッシュ :頂点+面(ポリゴン)で表面を定義する
  • 点群 :位置(+色など)だけを持つ点の集合
  • ガウシアンスプラッティング :位置・形状・色・不透明度を持つガウス楕円体の集合

PLYファイルとしては element face を持たないため、構造上は点群に近いです。しかし各頂点が単なる「位置と色を持つ点」ではなく、スケール・回転・不透明度・球面調和関数の係数といった数十個のパラメータを持つ3Dガウス楕円体 を表現しています。通常の点群ビューアで開くと、ガウスの中心位置だけが点として表示され、形状や視点依存の色は再現されません。正しく描画するには専用のビューアが必要です。

各ガウスのパラメータ

1つの3Dガウスは以下のパラメータを持ちます。

  • 位置 (x, y, z):ガウスの中心座標(3次元)
  • 共分散 :ガウスの形状と向きを表す。実装上はスケール (3次元)と回転(四元数) (4次元)に分解して保持する
  • :**球面調和関数(Spherical Harmonics, SH)**の係数として表現される。視点依存の色変化を再現するため、通常は0次〜3次までの係数を持ち、RGB各チャンネルにつき16係数、合計48次元になる
  • 不透明度 (opacity):ガウスの透過度を制御するスカラー値(1次元)

これにより、1つのガウスあたり数十個のパラメータが必要になります。

学習パイプライン

3DGSの処理の流れは以下の通りです。

SP3fLDAMYGdSaCpPOtLLiYMvAePDensityControl

初期点群はSfMの出力をそのまま利用します。つまり、各点の位置と色が初期値となります。ここから最適化を通じて、各点が「サイズ・形状・不透明度・視点依存の色」を持つガウス楕円体へと進化します。

保存形式:PLYとその先

3DGSの元論文(INRIA実装)では、学習結果の保存形式としてPLYが採用されました。PLYの柔軟な属性定義を活用し、各ガウスのパラメータをカスタムプロパティとして格納します。

**入力PLY(初期点群)**のヘッダ例:

pfeppppppelolrrrrrrnyreoooooodmmpppppp_aeeeeeeehtnrrrrrretttttttabyyyyyydivenefffuuurarlllcccrtooohhhyeaaaaaa_xtttrrrli1xyzrgbt0erlt0deul0eee0n_0endian1.0

**出力PLY(学習済みガウス)**のヘッダ例:

pfepppppppppppppppppelolrrrrrrrrrrrrrrrrrnyreooooooooooooooooodmmppppppppppppppppp_aeeeeeeeeeeeeeeeeeehtnrrrrrrrrrrrrrrrrrettttttttttttttttttabyyyyyyyyyyyyyyyyydivenefffffffffffffffffrarlllllllllllllllllrtoooooooooooooooooyeaaaaaaaaaaaaaaaaa_xtttttttttttttttttli5xyzffffffosssrrrrt0______pcccoooot0dddrrraaaattttl0ccceeeclll____e0___sssieee0123_0012tttt___e___y012n014d4ian1.0

ファイルサイズは初期点群に比べて大幅に増大し、PLYでは1点あたり236バイトを消費するため、数百万ガウスのシーンでは数百MB〜1GB超になることもあります。

Web配信向けの軽量形式

PLYはアーカイブや編集には適していますが、非圧縮のままではWeb配信には向きません。そこで、ガウシアンスプラッティング専用の軽量形式がいくつか登場しています。

**SPZ(Splat Zip)**は、Niantic(Scaniverse)がオープンソースで公開した形式です。量子化やスケーリング、カラム指向のデータ配置を組み合わせることで、PLYの236バイト/点を64バイト/点にまで圧縮します。「JPGが写真に対してやったことを、スプラットに対してやる」というコンセプトで設計されており、MITライセンスで公開されています。

SPLAT は、antimatter15のWebGLビューアで使われるシンプルなバイナリ形式です。球面調和関数の高次係数を省略し、各ガウスの基本パラメータだけを固定長で並べたもので、軽量さと実装の簡便さが特徴です。

KSplat は、Three.jsベースのGaussianSplats3Dビューア向けに作られた圧縮形式です。PLYやSPLATからの変換に対応し、複数の圧縮レベルを選択できます。

SOG は、PlayCanvasのSuperSplatエディタが採用する圧縮形式で、テクスチャベースの圧縮技術を使用します。

Compressed PLY は、PLYの構造を維持しつつデータを圧縮したもので、PlayCanvasのsplat-transformツールなどで生成できます。

これらの形式間の関係を整理すると以下のようになります。

PLYSSKSCPPSOoZLpGmAlpTartesseTPdhlraPeyLeCY.ajnPNsvLiaYasna/tnSitucipmeartStpelra1t5

現時点でのベストプラクティスは、アーカイブ・編集用途ではオリジナルのPLYを保持し、Web配信にはSPZ・KSplat・SOGなどの圧縮形式を使う というものです。3dgsconverterのようなツールを使えば、これらの形式間を相互変換することもできます。


Potree:大規模点群のWeb可視化

Potreeの役割

PLYやLAS/LAZに格納された点群データは、数千万〜数十億点に達することがあります。このような大規模データをWebブラウザでインタラクティブに表示するために開発されたのがPotreeです。

Potreeは、TU Wien(ウィーン工科大学)のMarkus Schützが中心となって開発したオープンソースプロジェクトで、WebGLベースの点群ビューアと、前処理のためのデータ変換ツールから構成されています。

空間インデックスとLOD

Potreeの中核にあるのは**八分木(Octree)による空間分割と LOD(Level of Detail)**の仕組みです。

元の点群データを八分木に分割し、各ノードに含まれる点群をサブサンプリングして階層構造を作ります。ルートノードには全体を粗くサンプリングした点群が、末端のリーフノードには最も密な点群が格納されます。

ビューア側では、カメラの位置と向きに応じて必要なノードだけを動的にロードします。カメラに近い領域は深い階層(高解像度)のノードを表示し、遠い領域は浅い階層(低解像度)で済ませます。これにより、数十億点のデータであっても、一度にGPUに送る点数を制御してスムーズな描画を実現できます。

PotreeConverterによる変換

元データからPotreeの形式に変換するには、PotreeConverter を使用します。

#P#PooPtLtorArteZereeeCCeooCnnovvneevrrettreetrreriinn2pp.uuxtt..pllayzoouuttppuutt__ppoottrreeee

変換後のディレクトリ構成は以下のようになります。

outpumhoteic_tetparrodaetarertc.eahbe.yij.nsboinn###

PotreeConverter 2.x では、これらが少数のファイルにまとめられています(旧バージョンではノードごとに個別ファイルが生成されていました)。

対応する入力形式はLAS、LAZ、PLY、E57、XYZ、PTS など主要な点群フォーマットを網羅しており、異なるソースからの点群を統一的にWeb公開できます。

ビューアの実装

Potree ViewerはThree.js をベースとしたWebGLアプリケーションで、点群の表示に加えて距離計測、断面表示、アノテーション、座標系の切り替えなどの機能を提供します。HTMLファイル1つとJSライブラリで動作するため、静的なWebサーバでの配信が可能です。


全体像:データの流れを俯瞰する

ここまでの内容を、データの流れとして整理します。

LS3PPPPWWifDLLooeeDMYYttbbArrReeGeeSCo/nEvCLP5LeOlPAL7ArcooSSYSttutu//3erdrpLD/reCeeAPeoerZLGLmSYaAp/puZalsr3as/eDtiWaEe/T/n5bio7MlGrSeeapssulhsaLstaitbainnSgplats3PDLYSPZ/SPLAT/KSplatWeb

重要なポイントは、PLYが汎用的な器 として機能していることです。メッシュ、点群、ガウシアンスプラッティングという性質の異なる3種類のデータを、同じ形式で格納できます。取得段階ではSfMや3Dスキャナの出力として、処理段階ではガウシアンスプラッティングの入出力として、そしてWeb公開のためのPotree変換やガウシアン軽量化の起点としても使われます。一方、LiDARデータを扱う場合はLAS/LAZが起点になることが多いです。


まとめ

本記事で扱った技術の関係を改めて整理します。

PLY は、シンプルかつ拡張性の高い汎用3Dデータ形式であり、メッシュ・点群・ガウシアンスプラッティングデータのいずれも格納できるハブ的存在です。ファイルのヘッダを確認することで、中身がどの種類のデータかを判別できます。

LAS/LAZ は、LiDAR点群に特化した標準形式で、測量・GIS分野のデファクトスタンダードとなっています。

ガウシアンスプラッティング は、点群を出発点としてメッシュとも点群とも異なる「ガウス楕円体の集合」という新しい表現を生成する手法です。学習結果はPLYで保存されますが、Web配信にはSPZ・KSplat・SOGといった専用の軽量形式も利用できます。

Potree は、大規模な点群データをOctreeとLODによってWebブラウザ上でインタラクティブに表示するためのソリューションであり、PLY・LAS/LAZなど複数の形式を入力として受け付けます。

これらの技術を組み合わせることで、「現実世界の3Dデータを取得し、処理し、Web上で公開する」という一連のワークフローが構築されます。今後、文化財のデジタルアーカイブやデジタルツイン、XRコンテンツなどの分野で、これらの技術の連携はますます重要になるでしょう。