3D Gaussian Splatting形式のデータをPythonで変換する
はじめに
今回は3D Gaussian Splatting(3DGS)形式のデータをPythonで変換できるようにしてみました。
※便宜上3DGS形式と呼称していますが、3DGSは手法で、3DGSにより再構築された3Dモデルのデータ形式のことです。
これまでUnreal Engine 5にScaniverseで3Dスキャンしたデータを取り込んで、研究で使っていました。3DGS形式のデータを編集するのにSupersplatも利用していたのですが、GUIでの操作なのでコードで自動化したいと考えていました。
今回はPythonで3DGS形式のデータを変換するためのツールを、AIに協力してもらいながら開発してみました。
▼今回開発したものは、GitHub上で公開しています。99%ぐらいAIに書いてもらいました。
https://github.com/404background/3dgs-edit-tools
▼PyPIにも公開しました。現在はpipでインストールできます。
https://pypi.org/project/3dgs-edit-tools
▼以前の記事はこちら
3D Gaussian Splattingのデータ形式について
▼Unreal Engineで3DGS形式のデータを取り込むプラグインを開発された方の記事が非常に参考になります。
https://zenn.dev/akiya_souken/articles/render-gaussian-splat-with-niagara
拡張子がplyでも、データ形式が異なる場合があります。
PointCloud形式などの点群データのplyファイルには、点の座標と色の情報などが含まれています。ScaniverseのSplatモードでスキャンして出力されるファイルの拡張子もplyですが、点だけではなく楕円体による表現のための項が含まれています。
各ファイルのヘッダ部分を見ると分かります。
▼例えばScaniverseでエクスポートしたplyファイルをメモ帳で開くと、変数名が並んでいます。

▼ヘッダ部分が続いた後、バイナリデータが続きます。メモ帳では文字化けして表示されます。

また色の列が異なると、ソフトウェアで取り込むときに指定する必要があったりします。
▼Unreal Engineで取り込む際に、プラグインによっては指定する必要がありました。
バイナリデータの部分は、そのままでは解読できないので変換する必要があります。こういった情報を踏まえて、ChatGPTにScaniverseでエクスポートしたplyファイルをCSV形式に変換し、もう一度元に戻すコードを作成してもらいました。
デバッグ用のツール
デバッグするときにバイナリデータを表示できないと困るので、セキュリティ系の勉強をしていたときにバイナリエディタとして紹介されていたStirlingで確認しました。
▼こちらからダウンロードできます。
実際にChatGPTが提案したコードで元ファイルと比較すると、間違いがあることをStirlingで確認できました。
▼Null文字がスペースになっていることがありました。2つのファイルの相違点を比較できます。

▼文字コードの変換などは、CyberChefが便利です。
https://gchq.github.io/CyberChef
▼16進数表記から変換すると、00はNull文字で、20はスペースです。

こういったツールも活用しながら開発を進めました。
CSV形式との変換/逆変換
Blenderで3DGS形式のデータを取り込んだ時に、CSV形式のようにしてデータが表示されているのを見たことがありました。同様にして変換できるはずだったので、先述したデータ形式を踏まえて変換を行いました。
▼こちらのハニワをiPhone 15で、Scaniverseを利用して3Dスキャンしたデータで試しました。

コードやサンプルは先述したGitHubのリポジトリに入っているので、そちらをご覧ください。
▼plyファイルは以下からダウンロードできます。
実際にCSV形式との変換/逆変換を試してみました。
▼CSVファイルに変換されて、ヘッダ部分のデータが1行目にあります。

変換前と変換後で、変わりなく取り込むことができました。
▼Supersplatで確認しました。

PointCloud形式との変換/逆変換
PointCloud形式への変換も試してみました。PointCloud形式では点群データの分類などの手法が以前から研究されています。それらの手法を利用するにはPointCloud形式の方が都合がいいです。
▼CloudCompareで確認した状態がこちら。

▼Cloud Compareについてはこちら
もちろん3DGSほどの精細な見た目ではないですが、問題なく変換できているようでした。
メッシュへの変換
3DGS形式やPointCloud形式のように、点群の位置情報を保存できるならメッシュ化もできるだろうということで、試してみました。ゲームエンジンなどに取りこむときは、メッシュ化されている方が環境光の影響などを元々計算できるので便利です。
パラメータを調整する必要があって、実際の物体に近いメッシュにするのは研究で取り組まれているような領域になりそうです。
▼粗い見た目ですが、これ以上滑らかにするのは難しそうでした。

今回のハニワをメッシュ化したときのパラメータで、もっと大きなモデルに対してメッシュ化すると、おかしな繋がり方をしていることがありました。点群同士の距離などが違いすぎる影響だと思われます。
最後に
3DGS形式のデータがバイナリ形式というのもあって扱いづらいことがあったのですが、Pythonで変換できるようになりました。色を変更するなどの処理も、CSV形式なら行えます。
この後メッシュ化については別の手法を試していたので、また別の記事で紹介しようと思います。

						
						
						
