見出し画像

大容量のポイントクラウドをソートする

2020年5月9日編集

noteに似つかわしくない技術的な内容だが、さりとてqiitaに書くようなプログラムも一切書かない内容なのでnoteに書いておく。

今月、フォトグラメトリを行う機会があった。

で、フォトグラメトったは良いがめちゃめちゃ広範囲を取ってしまい、1億頂点越え、バイナリのplyファイルで400MB越えの大物ファイルになってしまった。

ポイントクラウドをソートする意味

ところでポイントクラウドデータは通常、テクスチャの貼り方を考えた頂点の並びでplyファイル化される。

しかしこのポイントクラウドデータは頂点データをうまくソートしておくと色々と演出の幅が広がる。

特にXYZ軸などの絶対軸でソートしておくと良い感じにモーフィングに使えたりする

では、どうやればソートできるのか。

まずはツールを見てみたがCapture Reality、MeshLabあたりのポイントクラウドツールはポイントクラウド同士の並べ替え、整列には強いが、1つのポイントクラウド内の一個一個の頂点の配列は制御できなかった。

まぁ、頂点の制御なんて分野はどちらかというとプリレンダ系の得意分野かもしれない。が、知り合いのCGアーティストに聴いたらCinema4D(通称C4D)は対応していないらしい。無料で使えるBlenderはありそうだが、やり方が良く判らなかった。

方法1. TouchDesignerのSort SOPを使う(失敗)

SNSで誰ともなく質問したところ『TouchDesignerのSort SOP使えばよいのでは』と言う答えが。確かにソート自体はこれだけでばっちりだ・・・。

しかしplyファイルはTouchDesignerだとTOP扱いだ。TOPからはSOPに持っていけない(全くできないということではないが・・・)。しかもTouchDesignerはSOPのファイル保存もplyに対応していない。まぁしかしplyへの変換をやってくれるソフトはいくらでもありそうではある。

つまりこんな感じのデータフローになる。

plyデータフロー@2x (1)

で、さっそく実行した・・・が駄目であった。TouchDesignerが1億点の頂点をfbxで保存できなかった。フリーズして帰ってこなくなってしまった・・・。もしかしたらfbxそのものがこんなでかい頂点を扱うことができないのかもしれない。

方法2. HoudiniのSort SOPを使う(成功)

プリレンダ系もTouchDesignerもポイントクラウド系のソフトも駄目・・・と絶望していたら『Houdiniならいけるのでは』と言われる。

確かにプリレンダ系のファイル読み込み/書き出し能力とTouchDesignerのソート能力の両方をHoudiniなら持ってそう・・・!

とりあえずIndie版を課金して使ってみたらいけた・・・!

FileノードとSortノードを繋ぎ、Sortノードを右クリックしてsave >> geometryを選ぶと保存ができました。Fileの保存でもExportでもできなくて一瞬積んだかと思ったが・・・。

画像2

スクリプトで自動化するやり方もありそうでしたが40個ぐらいだったので手動でやってしまいました。書き出しパターンは4つあったので160個ぐらい。

そしてやったあとに『この処理は無料版でもできる』ことが判明。おおお・・・269ドル・・・損しないように勉強しよう・・・。

補足. plyファイルのasciiからバイナリへの変換


そして無事plyファイルができました。・・・と思ったらなんかやたらとでかい。3倍ぐらいある。

原因はHoudiniのply書き出しがascii一択なためでした。バイナリに変換したい・・・が、もう手作業でやりたくない・・・。

と、ググっていると昔誰かからMeshLabはコマンドラインから叩ける、と聞いたのを思い出した。調べてみるとやはり叩けるらしい。

しかも普通にascii形式もバイナリ形式もどちらのplyも読み書きできるっぽい。これだ。

meshlabserver -i inputFile.ply -o outputFile.ply

↑のコードで処理で切るのを確認。Meshlabはデフォルトでバイナリ保存なのでオプションの指定は必要なかった・・・と思ったら違いました。これだけだとVertexのみのplyファイルが作成されてしまいます。今回は頂点カラーもあったので、

meshlabserver -i inputFile.ply -o outputFile.ply -m vc

とオプションを入力しました。

ということでめちゃくちゃ久しぶりにバッチファイルを書いてフォルダ内のascii形式のplyファイルからバイナリ形式のplyファイルを作る処理を書きいた。

書き方もすっかり忘れていたのでググりながら。

結局こんな感じのバッチファイルで実行した。

@echo off
set PATH=C:\Program Files\VCG\MeshLab
for /f "usebackq tokens=*" %%i in (`dir /s /b a\*.ply`) do (
	meshlabserver -i %%i -o %%~dpi%%~ni_b%%~xi -m vc
)

これでソートしたバイナリ形式のplyファイルを作ることができた。やったー。


データフローはこんな感じ。1日と269ドルというリソースをかけましたがやり方が判れば無料で、しかも1時間でできる内容

plyデータフロー@2x (2)

非常にニッチなノウハウですが何か役に立てば・・・。

この記事が気に入ったらサポートをしてみませんか?