トップ 問題解決の記録

メッシュ簡略化OOM問題

目的

COLMAPが出力した高ポリゴンメッシュ(1500万トライアングル超)を、Open3Dのquadric_decimationで削減し、扱いやすいサイズにする。

問題

Open3Dのquadric_decimationが1500万トライアングルを超えるメッシュでOOM(メモリ不足)により失敗。アルゴリズムが全エッジをメモリ上に保持するため、大規模メッシュでメモリ消費が爆発する。

対策

恒久対策

quadric_decimationの代わりに simplify_vertex_clustering(voxelベースの簡略化)を使用。voxelグリッド単位で統合するため、メモリ使用量が安定。

両方式の比較

voxelvolume(体積) + pixel(画素)の合成語。2Dのピクセルを3Dに拡張した概念で、3D空間を格子状の立方体(voxelグリッド)に分割した最小単位。voxel方式の簡略化では、各voxel内の全頂点を1点に統合することでポリゴン数を削減する。voxelサイズが小さいほど元の形状を保つが削減効果は低下する。

quadric_decimationquadric error metric(2次誤差指標、QEM)に基づくメッシュ簡略化アルゴリズム。各頂点に「その頂点から元の面までの距離の2乗和」を近似する4×4行列(quadric)を持たせ、あるエッジを収縮(edge collapse)したときの誤差増分を計算する。全エッジを誤差増分の小さい順に並べた優先度キューを使い、最小のものから順に収縮していく。これにより、指定したトライアングル数に削減するまで品質低下を最小限に抑えられる。ただし、1500万トライアングル級のメッシュでは全エッジのキューがメモリに乗らずOOMする。

項目quadric_decimationsimplify_vertex_clustering(voxel方式)
アルゴリズムエッジ収縮+誤差最小化各voxel内の頂点を1点に統合
メモリ消費全エッジを保持 → 大規模で爆発voxelグリッドのみ保持 → 安定
出力品質高(エッジ局所的に最適化)やや低(voxel解像度依存、階段状劣化あり)
ターゲットポリゴン数指定可(収縮数を制御)間接的(voxelサイズで調整)
処理速度低速(大規模ではOOMで完了不能)高速(OOMなし)
最大動作サイズ〜500万トライアングル程度制限なし(1500万超でも安定動作)
Open3D APImesh.simplify_quadric_decimationmesh.simplify_vertex_clustering

voxel方式は品質面でやや劣るが、1500万トライアングル超の大規模メッシュでも確実に動作するため現行パイプラインで採用。品質差は後段のテクスチャベイクで吸収可能な範囲。

影響

ステータス

恒久対策済み