LRTKレフィクシア株式会社

点群OBJの面頂点数が多すぎる場合に分割する5つの手順

点群OBJで面頂点数の問題が起きる理由

点群から作成したOBJをアップロードすると、読み込み途中で処理が止まる、形状の一部が欠ける、表示が重くなる、陰影が乱れるといった問題が起きることがあります。その際に確認したい項目の一つが、1つの面を構成する頂点参照の数です。ただし、ここでいう面頂点数の問題は、点群をメッシュ化して面を持たせたOBJに限って発生します。

OBJでは、点、線、面が別の要素として扱われます。座標を示すv行だけが並ぶデータや、点要素を示すp行を使うデータにf行がなければ、面そのものが存在しないため、1面当たりの頂点数を分割する作業は必要ありません。一般に「点群OBJ」と呼ばれていても、実体が純粋な点データなのか、点群から生成した三角形メッシュなのかを最初に区別することが重要です。本記事は、f行を含むメッシュOBJを対象に説明します。

代表的なOBJでは、頂点座標がv、テクスチャ座標がvt、法線がvn、ポリゴン面がfから始まる行で記述されます。f行には、その面が参照する頂点番号が順番に並びます。三角形なら3つ、四角形なら4つの参照が一般的ですが、5頂点以上の多角形も形式上は記述できます。

OBJの基本仕様には、すべての利用環境に共通する「1面は何頂点まで」という数値上限が定められているわけではありません。一方で、アップロード先や変換機能によっては、三角形だけを前提にしていたり、三角形と四角形だけを扱えたり、多角形を内部で三角化したりします。そのため、同じOBJでも、ある環境では読み込め、別の環境では欠損やエラーが起きる可能性があります。

頂点数の多い多角形は、内部でどの対角線を使って三角形へ分けるかが入力データだけでは明確にならない場合があります。特に、凹形状、自己交差、ほぼ重なる辺、同一平面上にない頂点を含む面では、三角化の結果が実装によって変わりやすくなります。問題は単純な頂点数だけでなく、面の輪郭と幾何学的な状態の組み合わせによって発生します。

また、「1面当たりの頂点数が多いこと」と「OBJ全体の頂点数や面数が多いこと」は別の問題です。すべての面が三角形でも、総頂点数、総面数、ファイル容量、関連画像の容量が大きければ、アップロードや表示に時間がかかる場合があります。反対に、ファイル全体が小さくても、1つのf行だけが複雑な多角形であれば、その面の解析で失敗する可能性があります。

面分割の目的は、単にファイル容量を減らすことではありません。むしろ、三角化によってf行や面数が増え、OBJ本体の容量が少し大きくなることもあります。目的は、形状を保ちながら、アップロード先が解釈しやすい面構造へ変換することです。元データを保存し、複製した作業用データで段階的に処理することが基本になります。

手順1 面頂点数とエラー箇所を特定する

最初の手順は、アップロード失敗の原因が本当に面頂点数にあるのかを確認することです。ファイル容量、文字コード、改行、関連ファイルの不足、存在しない頂点の参照、座標値の扱い、通信切断、処理時間の超過などでも似た症状が起こります。原因を面構造に限定できないまま全体を三角化すると、面数だけが増え、根本原因が残ることがあります。

OBJをテキストとして確認できる場合は、まずfから始まる面要素を探します。1つの面要素に並ぶ参照の個数が、その面の頂点数です。たとえば12/8/4は、位置頂点12、テクスチャ座標8、法線4を組み合わせた1頂点分の参照です。スラッシュで区切られた数値を3頂点と数えないよう注意します。

長い面要素は、1行が非常に長くなる場合があります。また、OBJでは行末の継続記号を用いて長い記述を複数行へ続ける形式もあるため、独自の検査スクリプトを使う場合は、物理的な行数だけで面数を数えないようにします。単純な文字検索で調査する場合でも、継続行や空白の扱いを確認する必要があります。

確認する数値としては、最大面頂点数、5頂点以上の面数、三角形数、四角形数、面を持たない頂点数、無効な参照数などが考えられます。大規模なOBJを目視だけで調べるのは現実的ではないため、メッシュ検査機能や検証スクリプトを使い、頂点数の多い面を抽出します。抽出した面について、位置、面積、周囲との接続、材質、法線、テクスチャ座標の有無を確認します。

最大面頂点数だけでなく、その面が単純な輪郭かも確認します。外周辺が交差していないか、同じ頂点参照が繰り返されていないか、隣接する頂点がほぼ同じ位置にないか、輪郭が凹形状になっていないかを見ます。見かけ上は穴がある領域でも、一般的なポリゴン面のf行一つで内周境界を安全に表現できるとは限りません。穴の周囲は複数の面で構成されているか、変換元で適切なトポロジーになっているかを確認します。

アップロード先に処理ログがある場合は、停止した段階も記録します。「面解析」「ポリゴン変換」「三角化」「インデックス作成」などで停止していれば、面構造が関係している可能性があります。一方、圧縮ファイルの展開、認証、通信開始、関連ファイル探索の段階で止まっている場合は、面分割以外の原因を先に調べます。

原因を切り分けるには、問題面を含む小さな範囲だけを書き出す方法が有効です。小さなOBJでも同じ位置で失敗すれば、面構造や参照関係を疑いやすくなります。小さなOBJでは成功し、全体だけが失敗する場合は、総頂点数、総面数、メモリ、ファイル容量、処理時間などの影響も考えます。検証用データには問題面を残し、他の要素を段階的に減らすと原因を追いやすくなります。

手順2 重複頂点と不正な面を整理する

問題箇所を特定したら、すぐにすべての多角形を細かく分けるのではなく、先に重複頂点や不正な面を整理します。壊れた接続や不要な参照が残った状態で三角化すると、異常な面が増えたり、修正箇所が広がったりするためです。前処理では、形状と属性を保てる範囲だけを対象にします。

点群からメッシュを作る過程では、同じ位置または非常に近い位置に複数の位置頂点が生成されることがあります。近接頂点の統合は境界の亀裂を減らせる場合がありますが、距離を大きくしすぎると、段差、角、薄い部材、細い溝まで一体化する可能性があります。統合距離は、座標単位、点間隔、計測精度、対象物の最小形状、成果物に必要な精度を踏まえて決めます。

位置が同じ頂点でも、必ず統合してよいとは限りません。OBJの面参照では、位置頂点、テクスチャ座標、法線を別々の番号で組み合わせられます。そのため、同じ位置にある頂点がテクスチャの継ぎ目、材質境界、鋭い稜線の法線分離に使われている場合があります。位置だけを基準に一律統合すると、模様のずれや不自然な陰影につながることがあるため、vだけでなくvtとvnの対応も確認します。

次に、同じ頂点を複数回参照する面、3つ未満の有効な頂点しか持たない面、頂点がほぼ一直線に並ぶ面、面積が実質的にゼロの面、外周辺が自己交差する面を調べます。数値上のゼロ判定は座標単位や精度によって変わるため、固定値だけで機械的に削除せず、許容値と用途を明確にします。

重複面も確認します。同じ位置に同じ向きの面が重なっている場合や、表裏が反対の面が重なっている場合は、表示時のちらつきや表裏判定の混乱につながることがあります。ただし、意図的な二重構造や材質表現まで削除しないよう、周辺の構成を見て判断します。

面が参照する番号の妥当性も重要です。正の参照番号は、対応するv、vt、vnの範囲内でなければなりません。負の参照番号もOBJでは有効な相対参照ですが、参照位置は記述された時点を基準に決まるため、行の並べ替えやファイル分割を行うと意味が変わる可能性があります。独自処理で番号を書き換える場合は、位置、テクスチャ、法線の三つを別々に再計算します。

不要な面を削除した後は、穴、開放境界、非多様体の接続が増えていないかを検査します。削除した面が地表や構造物の外周を構成していた場合、アップロードは通っても形状が欠けます。前処理の目的は問題要素を隠すことではなく、三角化できる健全な面構造に整えることです。

手順3 分割基準と境界位置を決める

前処理が終わったら、どの面をどの単位へ分けるかを決めます。目的は最小の面を作ることではなく、形状を保ちつつ、対象のアップロード先が安定して処理できる構造へ整えることです。仕様が公開されている場合は、対応する面形式、1ファイル当たりの容量、関連ファイルの扱いを優先します。

互換性を重視する場合は、5頂点以上の面を三角形へ変換する方法が分かりやすい選択肢です。三角形は3点で平面が定まり、四角形や多角形のように内部の対角線選択を読み込み側へ委ねずに済みます。ただし、三角化は面数を増やします。単純なn頂点の多角形を既存頂点だけで分ける場合は通常n-2枚の三角形になりますが、輪郭が不正な面や追加頂点を必要とする処理では、この関係をそのまま使えません。

四角形を残す場合は、4頂点がほぼ同一平面にあり、内部の対角線がどちらになっても形状差が小さい範囲に限定すると安全です。同一平面上にない四角形は、表示側が選ぶ対角線によって二つの三角形の形が変わります。点群由来の不規則な地表では、対象環境の仕様が不明なら三角形中心の出力を検討します。

分割境界は、法肩、法尻、道路端部、壁面の角、段差、開口部、構造物の継ぎ目など、形状が変化する線に合わせます。重要な稜線を横切る分割線を作ると、輪郭が丸まったり、断面が変わったりする可能性があります。平坦部は比較的大きな三角形、曲率が大きい部分や細部は小さな三角形にするなど、形状に応じて密度を変える方法もあります。

分割前には、保持する属性を決めます。位置だけでよいのか、法線、テクスチャ座標、材質割り当て、オブジェクト名、グループ名、スムージング設定まで維持するのかで処理方法が変わります。辺の途中へ新しい頂点を追加する場合は、位置だけでなく、必要なテクスチャ座標や法線を適切に補間または再計算できる処理を選びます。

正の参照番号を使うか負の参照番号を使うかも、対象環境の互換性に関係します。負の番号はOBJとして不正ではありませんが、読み込み側によっては対応が限定される場合があります。互換性確認の結果として正の番号へ変換する場合は、単純に符号を変えるのではなく、各f行が参照するv、vt、vnを正しい絶対番号へ再構成します。

仕様が不明な場合は、三角形中心、自己交差のない面、有効範囲内の参照、過度に複雑なオブジェクト構造を避けるといった、解釈差が出にくい構成を優先します。ただし、これはOBJ形式の絶対条件ではなく、相互運用性を高めるための運用上の判断です。社内基準と形式仕様を混同しないよう記録します。

手順4 多角形面を小さな面へ分割する

分割基準を決めたら、頂点数の多い多角形を三角形または少数頂点の面へ変換します。基本は、元の外周、稜線、穴の境界、属性の継ぎ目を保ちながら分けることです。自動三角化機能を使える場合でも、結果を確認せずにそのまま本番出力へ進めないようにします。

凸形状で、外周が自己交差せず、ほぼ平面の面は比較的三角化しやすい範囲です。凹形状では、凹部を横切る不適切な対角線が選ばれると、元の輪郭外へ面が張られたように見える場合があります。自動処理後は、表側だけでなく裏側や斜め方向からも確認し、余計な面、反転面、外周の欠損がないかを調べます。

同一平面上にない多角形は、分割前後で表面形状が変わる可能性があります。多角形のままでは内部形状が一意に定まらず、表示や変換の段階で何らかの三角化が行われます。分割側で対角線を明示すれば結果を固定しやすくなりますが、その選び方が元点群や基準断面に合っているかを検証する必要があります。

穴のある領域は、内周をまたぐ面を作らないよう注意します。一般的なポリゴンメッシュでは、穴の周囲を複数の三角形でつなぎ、穴部分には面を作らない構成にします。穴を囲む外周と内周の頂点を一つの単純なf行として並べても、読み込み側が意図どおりに解釈するとは限りません。変換元で穴の境界を明示し、単純な面の集合として出力します。

分割線は、極端に細長い三角形を必要以上に増やさないよう配置します。細長い三角形が直ちに読み込みエラーを起こすとは限りませんが、法線補間、品質評価、簡略化、衝突判定などの後工程で不利になる場合があります。ただし、均等な形へ整えるために重要な地物境界を横切ってはいけません。形状保持を優先し、その範囲で面品質を整えます。

既存頂点だけを使って多角形を三角化する場合、位置頂点数は通常増えません。しかし、書き出し処理によっては、テクスチャの継ぎ目、材質境界、法線の分離を表現するために頂点データが複製されることがあります。三角化後に頂点数が増えた場合は、単なる異常と決めつけず、どの属性境界で増えたかを確認します。

面分割後は、頂点順と法線を確認します。多くの表示環境では、面の頂点順や法線方向を基に表裏を扱います。分割時に一部の面だけ順序が逆になると、片面表示で欠けたように見えたり、陰影が反転したりする場合があります。地表面では意図する上側、閉じた構造物では外側へ向いているかを確認します。

作業は段階ごとに別名で保存します。元データ、前処理後、三角化後、属性確認後、アップロード用出力のように分けると、問題が発生した工程を特定しやすくなります。最初から全体へ一括適用せず、代表範囲で条件を確定してから同じ処理を広げます。

手順5 オブジェクト単位とファイル単位で再分割する

1面当たりの頂点数を減らしても、OBJ全体の頂点数、面数、ファイル容量が大きいと、アップロード時の負荷は残ります。最後の手順として、必要に応じてオブジェクト単位またはファイル単位でデータを分けます。ここでの分割は、1枚の多角形を三角形へする処理ではなく、大規模なメッシュを管理可能な範囲へ区切る処理です。

空間的な分割では、現場を格子、工区、構造物、階層、測区などの単位に分けます。境界位置は、明確な座標、管理線、構造物の継ぎ目などに合わせます。目視だけで不規則に切ると、欠落範囲や重複範囲が生じやすく、更新時の再現も難しくなります。

境界上の頂点を複数ファイルへ同じ座標で持たせること自体は、直ちに重複面を意味しません。注意すべきなのは、境界をまたぐ面の切り方と、同じ面を両方のファイルへ重ねて出力することです。境界面を重複させると表示のちらつきが起きる場合があり、反対に両方から除くと隙間が生じます。境界頂点の共有方針と、境界面をどちら側へ所属させるかを分けて決めます。

ファイルを分けた後は、それぞれのファイル内で参照関係が完結している必要があります。各f行が参照するv、vt、vnをそのファイルへ含め、番号を正しく付け直します。元ファイルの行を単純に切り出すだけでは、存在しない番号を参照したり、負の相対参照の意味が変わったりする可能性があります。通常の書き出し機能を使う場合でも、出力後に参照範囲を検査します。

オブジェクト名やグループ名は、分割後の識別に使えるよう統一します。工区、区画、座標範囲、版番号、処理段階などを一定の順序で付けると追跡しやすくなります。使用できる文字や長さはアップロード先によって異なるため、名称が原因で失敗する場合は対象環境の仕様を確認し、互換性の高い命名へ調整します。

ファイル数を増やしすぎると、アップロード順序、関連ファイル、版管理が複雑になります。1ファイル当たりの頂点数、面数、容量、処理時間を記録し、安定して処理できる範囲を探ります。絶対的な最小単位を目指すのではなく、再処理しやすく、現場単位で理解しやすく、アップロード先でも扱いやすい大きさにそろえます。

座標値が非常に大きいデータでは、対象環境によって表示精度や処理精度の問題が起きる場合があります。その際にローカル座標化を検討することはありますが、面頂点数の分割とは別の処理です。座標を移動する場合は、元の座標系、単位、平行移動量、回転、縮尺の有無を記録し、他の測量成果や基準点との対応を保ちます。位置情報が必要な業務では、アップロード先の座標仕様を確認してから実施します。

分割後に点群OBJアップロードを検証する

面分割とファイル分割が終わったら、アップロード成功だけで判定せず、形状、属性、位置、処理負荷を分けて確認します。エラーが表示されなくても、一部の面が読み飛ばされたり、関連ファイルが欠けたり、縮尺が変わったりしている可能性があります。

最初に、分割前後の位置頂点数、テクスチャ座標数、法線数、面数、オブジェクト数、ファイル容量を記録します。三角化によって面数は増えますが、既存頂点だけを使う処理なら位置頂点数が必ず増えるわけではありません。頂点数が増えた場合は、属性境界での複製、新規頂点の追加、面ごとの非共有化など、増加理由を確認します。

次に、外形、境界、穴、段差、薄い部材、急傾斜部、構造物の角を比較します。全体表示だけでは小さな欠損を見落としやすいため、代表的な検査地点を決め、同じ視点、同じ断面、同じ座標範囲で確認します。点群から作成したメッシュでは、元点群と重ね、メッシュ表面との差を確認する方法も有効です。

法線の確認では、面が裏返っていないか、境界で陰影が急変していないか、鋭い角が不自然に丸く見えないかを見ます。頂点法線を保持したのか、面分割後に再計算したのかを記録し、処理方法に合った結果かを判断します。形状が同じでも法線だけが変わると、見た目が大きく変わることがあります。

テクスチャや材質を使用する場合は、分割線に沿ったずれ、引き伸ばし、欠落、別材質への置換を確認します。OBJ本体だけでなく、材質情報と画像ファイルの参照関係が保たれている必要があります。複数ファイルへ分けた場合は、各OBJが必要な材質情報を参照できるか、同名ファイルの上書きが起きないかも確認します。

アップロード検証は代表区画から始めます。解析時間、表示開始までの時間、拡大縮小や回転時の安定性、再読み込み時の再現性を記録します。小さい範囲では成功しても全体で失敗する場合は、1ファイル当たりの規模や同時アップロード数を見直します。反対に、代表区画でも失敗する場合は、面構造や参照関係の修正へ戻ります。

最後に、座標と縮尺を数値で確認します。既知点間の距離、代表点の座標、標高差、境界位置を元データと比較します。単位変換やローカル座標化を行った場合は、記録した変換量で元の位置へ戻せることも確認します。見た目だけでなく、業務上必要な許容誤差を定めて判定します。

面分割で形状や属性を壊さないための注意点

面分割では、処理速度を優先しすぎると形状や属性を損なうことがあります。点群由来のメッシュには、平坦な地表、急な法面、構造物の角、設備の薄い部材などが混在します。全体へ同じ条件を適用すると、ある範囲には適切でも、別の範囲には過剰な処理になる可能性があります。

面分割とメッシュ簡略化は別の操作です。面分割は、基本的に既存の輪郭を保ちながら多角形を小さな面へ分けます。簡略化は頂点や面を減らすため、形状が変わる可能性があります。原因が1面当たりの頂点数であれば、まず形状を保つ三角化を行い、全体規模の問題が残る場合に簡略化を別工程として検討します。

簡略化を行う場合は、許容誤差と保護範囲を決めます。平坦部では頂点を減らしやすい一方、角、境界、急勾配、狭い溝、段差では少ない削減でも形状が変わります。出来形確認、断面作成、数量計算などに使う範囲は、用途に必要な精度を基準に検証します。

境界の亀裂にも注意します。区画ごとに別々の条件で三角化すると、同じ境界線上でも頂点位置や分割位置が一致せず、並べたときに隙間が生じることがあります。可能であれば、全体で三角化して境界を確定した後にファイルを分けます。先に区画分割する場合は、境界頂点の座標と所属面のルールを固定します。

法線を再計算する場合は、滑らかに見せる範囲と鋭い稜線として残す範囲を分けます。すべてを滑らかにつなぐと構造物の角が丸く見え、すべてを分離すると連続した地表に面ごとの筋が見える場合があります。地表、壁、設備などの種類に応じて条件を変え、元の意図と比較します。

テクスチャ座標を保持する場合は、位置頂点の統合とUVの統合を同じ操作として扱わないようにします。同じ位置でも異なるUVを持つ頂点は、画像の継ぎ目を表現している可能性があります。材質境界や法線境界も同様です。処理前後でv、vt、vn、fの対応を確認します。

作業履歴も残します。統合距離、三角化方式、対象面の条件、簡略化の許容誤差、ファイル分割範囲、座標変換、検証結果を記録します。同じ現場の更新データを後日処理する際、条件が残っていれば比較可能な成果を作りやすくなります。

大規模データを安定運用するための管理方法

点群OBJアップロードを継続的に行う業務では、元データ確認、前処理、面分割、ファイル分割、検証、アップロードという流れを標準化すると、担当者による結果の差を減らせます。各段階で、処理前後の数値と判定結果を残します。

管理項目としては、元点数、OBJの位置頂点数、テクスチャ座標数、法線数、面数、最大面頂点数、5頂点以上の面数、無効参照数、退化面数、ファイル容量、区画数、アップロード結果、処理時間などが考えられます。アップロードに成功しても処理時間が極端に長い場合は、次回の分割基準を見直す材料になります。

命名規則も統一します。元データ、作業中データ、検証済みデータ、アップロード用データを名前で区別し、日付だけでなく版番号や処理段階を付けます。元データを上書きせず、どの版からどの条件で作成したかを追跡できる状態にします。

アップロード先の仕様が明確でない場合は、検証結果を基に社内の推奨条件を決めます。たとえば、5頂点以上の面を残さない、代表区画で事前検証する、一定規模を超えたら空間分割を検討する、といった運用基準です。これはOBJ形式の絶対上限ではなく、特定の環境とデータで確認した推奨値として管理します。

元の点群や初期メッシュを保管しておくことも重要です。加工済みOBJへ三角化、統合、簡略化を何度も重ねると、属性や形状の変化を追いにくくなります。再処理が必要になった場合は、可能な限り元点群または初期メッシュへ戻り、確定した条件で作り直します。

計測段階のデータ量も後工程に影響します。必要以上の重複計測や、用途に対して過剰な密度が多いと、メッシュ化後の頂点数と面数も増えます。ただし、取得時に情報を減らしすぎると後から復元できません。必要精度、対象物の細かさ、利用目的を整理し、取得と加工の両方で適切なデータ量を設計します。

LRTK Phoneなどで取得した点群をOBJへ変換して利用する場合も、点のまま扱う工程と、メッシュ化して面を持たせる工程を区別します。面頂点数の確認はメッシュ化後のOBJに対して行い、取得元の点群は再処理用として保持しておくと、分割条件を見直しやすくなります。

まとめ

点群OBJの面頂点数が多すぎる場合は、最初にそのOBJが純粋な点データなのか、f行を含むメッシュなのかを確認します。面を持たない点群OBJには、1面当たりの頂点数という問題はありません。メッシュOBJであることを確認したら、1面当たりの頂点数とOBJ全体の規模を分けて調べます。

次に、重複頂点、不正な参照、退化面、自己交差などを整理し、形状と属性を保てる分割基準を決めます。そのうえで、多角形を三角形または少数頂点の面へ分け、必要に応じてオブジェクトやファイルも区画単位へ分割します。負の参照番号は形式上有効ですが、ファイル分割や番号変換では意味が変わり得るため、正しい再番号付けが必要です。

分割後は、アップロードできるかだけでなく、形状、法線、テクスチャ、材質、座標、縮尺、境界の連続性を確認します。面分割と簡略化を混同せず、元データを保存しながら段階的に検証することで、点群OBJアップロードの再現性と安全性を高められます。

現場を3Dで残して、あとから測る。
実際の画面と動画で使い方を確認できます。

LRTK Phoneの使い方・実例を見る
資料請求導入相談
現場をスマホで3DスキャンLRTK Phone実例を見る