LRTKレフィクシア株式会社

点群OBJアップロード時にゼロ面積ポリゴンを除く5つの方法

点群OBJに含まれるゼロ面積ポリゴンとは

点群OBJをアップロードしたときに、読み込みが完了しない、形状の一部が欠ける、表面の陰影が乱れる、断面や体積の処理で警告が出るといった問題が起きることがあります。原因はアップロード先の仕様、ファイル容量、座標系、材質、法線、面の向きなど多岐にわたり、ゼロ面積ポリゴンはその確認対象の一つです。ゼロ面積ポリゴンが含まれているだけで、すべての環境で必ずエラーになるわけではありません。

ゼロ面積ポリゴンとは、ファイル上では面として定義されていても、幾何学的な面積がゼロになる退化面を指します。三角形であれば、2点以上の頂点座標が一致している場合や、3点が同一直線上に並ぶ場合に面積がゼロになります。三角形の面積は2本の辺ベクトルの外積の大きさから求められるため、外積がゼロになる配置では有効な面法線も定まりません。一般的なポリゴンメッシュ処理ライブラリでも、頂点位置が同一直線上にある三角形を退化面として扱います。([CGAL Manual][1])

OBJ形式では、幾何頂点を示すv行、テクスチャ座標を示すvt行、法線を示すvn行、面を示すf行などが別々に記録されます。f行は頂点、テクスチャ座標、法線をそれぞれ別のインデックスで参照でき、負のインデックスはその時点までに定義された要素の末尾からの相対参照として解釈されます。したがって、面の頂点番号だけを見るのではなく、参照先の座標と、必要に応じてUVや法線の対応も確認する必要があります。([Wikipedia][2])

異なる頂点番号が同じ座標を持つこと自体は、直ちに不正とは限りません。別部材や別シェルの境界を分けるため、あるいはUV境界やハードエッジを表現するために、同位置の頂点を意図的に分けている場合があります。問題になるのは、その座標の重複によって1つの面の実効的な頂点数が減り、面積がゼロになる場合です。

頂点だけを記録し、f行を持たないOBJにはポリゴンがないため、ゼロ面積ポリゴンもありません。実務では、点群から生成した三角形メッシュや、点と面を一緒に書き出したデータも点群OBJと呼ばれることがあります。そのため、最初に対象ファイルへ面情報が含まれているかを確認することが重要です。

4頂点以上の面を含むOBJでは、読み込み先が内部で三角形へ分割することがあります。重複頂点、一直線上の頂点、自己交差、強い非平面性を含む多角形は、三角形化の方法によって結果が変わりやすいため、アップロード前に利用環境と同等の方法で三角形化し、その後に退化面を検査すると安全です。

ゼロ面積ポリゴンがアップロードに与える影響

ゼロ面積ポリゴンを含む点群OBJの扱いは、読み込みソフトやクラウド側の実装によって異なります。不正面を無視して読み込む環境もあれば、警告を出す環境、変換処理の途中で失敗する環境もあります。そのため、ゼロ面積ポリゴンとアップロード失敗の因果関係は、修正前後の比較やログによって切り分ける必要があります。

表示時には、該当面が除外されることで小さな欠損が見える場合があります。ただし、退化面はもともと面積を持たないため、削除だけでは外観が変わらない場合もあります。欠損が生じるかどうかは、周辺面の接続関係、重複面の有無、読み込み時の修復処理に左右されます。

陰影計算では、ゼロ面積三角形から安定した面法線を求められません。インポート時に法線を再計算する処理や、頂点法線を周辺面から平均する処理では、退化面が警告や不自然な陰影の一因になることがあります。ただし、陰影異常は面の向き、重複面、スムージング設定、既存のvn情報などでも発生するため、ゼロ面積ポリゴンだけに原因を限定しないことが大切です。

体積計算では、退化面そのものの寄与はゼロでも、修正後に境界が開いたり、非多様体形状が残ったりすると、閉じた立体として処理できないことがあります。断面生成や交差判定でも、ゼロ長の辺や極端に細い三角形が数値的に不安定な入力となる場合があります。

簡略化、法線再計算、再メッシュ化などの後工程では、完全な退化面だけでなく、面積が非常に小さい細長い三角形も問題になり得ます。CGALなどのメッシュ処理系でも、退化面とは別に、最長辺と最短辺の比が極端な三角形や、角度が180度に近い三角形を「ほぼ退化した面」として扱う機能があります。([CGAL Manual][3])

したがって、点群OBJが表示できたかどうかだけで判断せず、実際に利用する断面、面積、体積、編集、共有などの処理まで確認する必要があります。

ゼロ面積ポリゴンが発生する主な原因

代表的な原因は、1つの面を構成する頂点座標の重複です。異なる頂点番号を参照していても、2つの参照先が同じ座標なら三角形の一辺はゼロになり、面積もゼロになります。同じ頂点番号をf行の中で複数回参照している場合も、三角形として成立しません。

座標値の丸めも原因になります。編集環境ではわずかに離れていた頂点が、OBJ書き出し時に小数桁を減らしたことで同じ座標へ丸められると、書き出し後に退化面へ変わる場合があります。大きな原点座標のまま非常に小さな形状を扱うときは、使用する数値型や変換処理の精度にも注意が必要です。

点群からメッシュを生成する工程では、点の不足、外れ値、位置合わせのずれ、境界付近の不規則な点配置、異なる表面の誤接続などによって、細長い三角形や退化面が生じることがあります。単に点が密であることや計測範囲が重なること自体が直ちに原因になるわけではありません。複数計測の重複部分が適切に位置合わせされず、二重面や近接した別表面として残ったときに問題が起こりやすくなります。

簡略化処理では、短い辺を縮約した結果、三角形の複数頂点が同一点へ集約されることがあります。多くのソフトは退化面を同時に整理しますが、処理条件や書き出し経路によっては残る可能性があります。

複数メッシュの結合、範囲切り取り、穴埋め、頂点移動、座標系変換、単位変換、再三角形化などでも退化面は発生します。特に、結合前後で重複面と重複頂点を区別せず、一括して近接頂点を統合すると、本来別々の面まで潰れるおそれがあります。

完成したOBJだけを修正しても、発生工程が変わらなければ再発します。計測、位置合わせ、メッシュ生成、編集、簡略化、書き出しのどこで面が退化したかを記録し、元工程の条件も見直すことが重要です。

修正前に確認しておきたいデータの状態

最初に、元ファイルを変更せず保存し、作業用の複製を作ります。原本、修正作業用、アップロード確認用を分け、処理条件と作成日時をファイル名や管理表へ残します。しきい値の設定を誤ると、正常な微小面や細い部材まで消す可能性があるため、元へ戻せる状態が必要です。

次に、OBJ内にf行があるかを確認します。頂点だけのデータならゼロ面積ポリゴン検査は不要です。面がある場合は、三角形だけか、4頂点以上の面を含むか、線要素や点要素も混在するかを確認します。

4頂点以上の面を検査する場合は、面積の定義や三角形化方法がソフトによって異なる可能性があります。アップロード先が三角形メッシュを前提とするなら、作業コピーを三角形化した後に、重複頂点、退化面、面の向き、自己交差を確認します。

座標単位も確認します。OBJの座標値自体には一般に固定単位が埋め込まれていないため、メートル、センチメートル、ミリメートルなどの解釈は作成側と読み込み側で合わせる必要があります。面積しきい値は長さ単位の二乗で効くため、同じ数値を別単位のデータへそのまま適用できません。

頂点数、面数、連結成分数、境界辺数、ファイル容量を処理前に記録します。材質やテクスチャを使う場合は、MTL、画像、UV、法線、グループ名、オブジェクト名も保存します。修正後に形状だけでなく、見た目やグループ構造が維持されているかを比較するためです。

問題面の数と分布も確認します。数面だけなら局所修正が適していますが、広範囲に大量発生しているなら、元点群からのメッシュ再生成や、結合・簡略化条件の見直しが安全な場合があります。

方法1 重複頂点を統合して退化した面を削除する

1つ目は、同じ位置にある頂点を必要な範囲だけ統合し、その結果として退化した面を削除または溶解する方法です。

最初は座標が完全に一致する頂点を抽出します。ただし、同位置の頂点がすべて不要とは限りません。UV境界、ハードエッジ、別シェル、別部材、材質境界を維持するために意図的に分けられていることがあります。OBJでは位置、UV、法線を別インデックスで参照できるため、位置だけを基準に全データを一括統合すると、見た目やトポロジーが変わる可能性があります。([NVIDIA Docs][4])

安全に進めるには、同じ連結成分の中で、同一面または隣接面を退化させている重複頂点を優先して処理します。別部材間の近接点や、薄い部材の表裏は統合対象から外します。ソフトに「距離でマージ」機能がある場合も、対象範囲を選択し、最小の許容距離から試します。

頂点を統合すると、面が同じ頂点を複数回参照する状態になることがあります。その面は削除、溶解、または周辺を再接続します。単純削除で穴が生じる場合は、周囲の辺を保ちながら退化部分を溶解できる機能や、局所的な再三角形化を検討します。

完全一致だけで解決しない場合は、点間隔、必要精度、最小部材厚、座標単位を基準に統合距離を少しずつ広げます。統合距離を見た目だけで決めると、段差、角、薄板、隙間を失うおそれがあります。

処理後は、統合頂点数、削除面数、境界辺数、連結成分数を比較します。想定より多数の頂点が統合された場合は、設定が大きすぎるか、二重面や位置合わせずれが広範囲にある可能性があります。

面から参照されなくなった孤立頂点も確認します。ただし、点群として意図的に残している頂点や、線要素から参照される頂点まで自動削除しないようにします。

方法2 同じ頂点を参照する面を検出して除去する

2つ目は、1つの面の中で同じ幾何頂点を複数回参照していないかを調べる方法です。

三角形のf行が同じ頂点インデックスを2回以上含む場合、その面は2点以下で構成され、面積を持ちません。三角形化済みデータなら、各面の3つの幾何頂点インデックスがすべて異なるかを確認することで、明確な構文上の退化面を抽出できます。

4頂点以上の面では、同じインデックスの重複だけでなく、連続する頂点が同じ位置にある場合、最初と最後の頂点を重複記載している場合、自己交差している場合も確認します。OBJのf行は、閉じるために先頭頂点を末尾へ再記載する必要はありません。

負のインデックスを使うOBJでは、単純な文字列比較ではなく、そのf行が現れた時点までに定義された頂点数から実参照先を解決します。存在しない頂点、範囲外の頂点、解釈不能な参照は、ゼロ面積とは別の構文不整合として修正します。

該当面を取り除いた後は、周辺に穴や非多様体辺が生じていないかを確認します。退化面が重複的に存在していただけなら外観は変わらない場合がありますが、周辺トポロジーの一部として残っていた場合は再接続が必要です。

この方法だけでは、異なる頂点番号が同じ座標を持つ面や、3点が一直線上にある面を検出できません。方法1、方法3、方法4と組み合わせます。

方法3 一直線上の頂点で構成された面を整理する

3つ目は、三角形を構成する3点が同一直線上にあるかを判定し、退化面を整理する方法です。

3つの頂点番号が異なり、座標も互いに異なっていても、3点が一直線上に並べば面積はゼロです。道路縁、壁上端、構造物角部、切り取り境界など、直線状に点が並ぶ場所で、誤った接続によって発生することがあります。

数学的には、2本の辺ベクトルの外積がゼロかどうかで判定できます。ただし、浮動小数点で扱う実データでは、完全なゼロだけでなく、計算精度に対して十分小さい値をどう扱うかを決める必要があります。判定許容値は、座標単位、モデル寸法、点間隔、使用する数値型に合わせます。

最初は完全な退化面、またはソフトが退化面として明示的に判定した面だけを対象にします。その後も問題が残る場合に、角度が180度に近い面や、極端に細い面を別の条件で抽出します。完全なゼロ面積と、品質の低い微小面を同じ条件で一括削除しないことが重要です。

該当面が周辺面と重複しているだけなら削除で済むことがあります。境界を構成している場合は、周辺頂点の接続を見直し、必要に応じて正常な三角形へ作り直します。

直線上の中間頂点を削除する場合は、その頂点を参照するすべての面、線、UV、法線の対応を更新します。頂点だけを削除して参照番号を更新しなければ、範囲外参照や別頂点への誤参照が生じます。

処理後は上面だけでなく、側面、斜視、断面で確認します。見た目では直線に見える場所でも、施工管理や出来形確認に必要なわずかな高低差を持つことがあるため、座標変化を伴う平滑化は慎重に行います。

方法4 面積のしきい値で微小な不正面を抽出する

4つ目は、三角形ごとの面積を計算し、ゼロまたは設定した許容値以下の面を抽出する方法です。

面積判定を使うと、同一座標の頂点、一直線上の頂点、数値上ほとんど潰れた三角形をまとめて抽出できます。ただし、完全な退化面と、面積は小さいが正常な面を区別する必要があります。

面積の単位は座標単位の二乗です。座標をメートルとして扱うデータとミリメートルとして扱うデータでは、同じ数値のしきい値が示す現実寸法は大きく異なります。モデル全体の大きさが異なる場合も、固定値だけでなく、代表辺長、点間隔、バウンディングボックス寸法などに対する相対値を検討します。

安全な進め方は、最初に厳密な退化面を抽出し、その次に「ほぼ退化した面」を別グループとして可視化することです。近似判定では、面積だけでなく、最短辺、最長辺と最短辺の比、最大角、法線の安定性、周辺面との接続も確認します。

抽出面が切り取り境界へ集中しているなら範囲編集、結合部へ集中しているなら位置合わせや二重面、簡略化箇所へ集中しているなら辺縮約条件が原因候補です。分布を見ることで、単なる一括削除ではなく元工程の改善につなげられます。

一括削除前には、細い部材、鋭い角、段差、配管、手すり、縁石、曲面などに必要な微小面が含まれていないか確認します。面積が小さくても、3辺が有限の長さを持ち、周辺と整合している面は正常な可能性があります。

しきい値は段階的に変更し、各段階で削除面数、境界辺数、断面、体積、代表点の座標差を比較します。大きなしきい値を一度に適用しないことが過剰修正を防ぐ基本です。

方法5 問題範囲を再三角形化して面を作り直す

5つ目は、退化面が集中する範囲を局所的に整理し、周囲の頂点から正常な三角形を作り直す方法です。

退化面を削除しただけで穴や不連続が残る場合、面の連続性が必要な用途では再構成が必要です。小さな穴だけを無理に埋めると、別の細長い三角形を作ることがあるため、周辺の品質が低い面も含めて修正範囲を決めます。

地表面では、可能な限り既存頂点の座標を維持し、接続関係を修正します。平滑化や頂点移動を同時に行うと、標高、勾配、断面、土量が変化する可能性があります。座標を動かす場合は、許容差と変更量を記録します。

構造物を含む場合は、空間的に近いだけの別表面を接続しないようにします。地面と壁、薄板の表裏、隣接部材、狭い隙間の両側などを自動的に結ぶと、実在しない面が生成されます。連結成分、材質、法線方向、境界線などを使って対象を分けます。

再三角形化後は、面の向き、重複面、自己交差、非多様体辺、開いた境界、孤立小片、再発した退化面を検査します。周辺と逆向きの面が混ざると、片面表示で欠けたり、法線再計算後に陰影が乱れたりすることがあります。

退化面が全体へ大量に分布する場合は、局所修正を繰り返すより、元点群からメッシュ生成をやり直す方が再現性と品質を確保しやすいことがあります。発生数、分布、修正時間、必要精度を基準に判断します。

ゼロ面積ポリゴンを削除した後の確認項目

修正後は、編集画面で見える状態だけで完了とせず、新しいOBJへ書き出して再読み込みします。書き出し時の座標丸め、三角形化、法線生成、グループ統合によって、問題が再発したり別の差異が生じたりするためです。

頂点数、面数、連結成分数、境界辺数、ファイル容量を処理前後で比較します。数面の修正を想定していたのに大幅に減少している場合は、統合距離や面積しきい値が大きすぎる可能性があります。

修正箇所を拡大し、小さな穴、細長い突起、面の裏返り、二重面、意図しない接続を確認します。ワイヤーフレーム表示、法線表示、境界辺表示を併用すると見つけやすくなります。

断面が利用目的に含まれる場合は、修正範囲を通る複数方向の断面を比較します。体積計算に使う場合は、閉じた形状、面の向き、自己交差、非多様体部分も確認します。削除面がゼロ面積でも、周辺修復によって体積が変わる可能性があるため、修正前後の差を記録します。

材質やテクスチャを使う場合は、MTL参照、画像パス、usemtl、UV、法線、グループ、オブジェクト名が維持されているか確認します。位置頂点の統合や再三角形化で、UV境界やハードエッジが変わることがあります。

最後に実際のアップロード先で検証します。読み込み完了だけでなく、表示、拡大縮小、断面、距離、面積、体積、共有、再ダウンロードなど、運用で使う機能まで確認します。アップロード先が独自変換を行う場合は、変換後データで最終判定します。

必要な微小ポリゴンを消さないための注意点

面積が小さいポリゴンは、必ずしも不正ではありません。高密度点群から生成した曲面、細い部材、鋭い角、段差、配管、手すり、構造物端部などには、正常な微小面が含まれます。

不正面の判定では、面積だけでなく、頂点座標の一致、同一頂点参照、3点の共線性、最短辺、縦横比、最大角、周辺面との接続、法線方向、材質境界を確認します。

正常な微小面は、曲面や細部に沿って連続的に分布し、周辺の法線や辺長も段階的に変化することがあります。不正面は、切断境界、結合部、簡略化箇所、外れ値周辺へ局所的に集中する場合があります。ただし、分布だけで確定せず、形状と用途を合わせて判断します。

測量や施工管理に使うデータでは、見た目の滑らかさより、位置、標高、境界、体積の維持が優先されることがあります。自動クリーンアップの結果をそのまま採用せず、代表断面や基準点との差を確認します。

処理前後の差分を保存し、削除面の数と場所、統合頂点数、設定値を記録すれば、過剰削除が判明したときに原因を戻しやすくなります。

点群OBJアップロード前の標準確認手順

点群OBJアップロード前の確認を標準化すると、担当者ごとの判断差を減らせます。

最初に原本を保存し、作業コピーを作ります。次に、f行の有無、面の頂点数、座標単位の解釈、材質やテクスチャの関連ファイルを確認します。

三角形化が必要な場合は作業コピーで実施し、存在しない頂点参照、同一頂点の重複参照、同一座標による退化辺、共線な三角形を検査します。

重複頂点は、意図的なUV境界、ハードエッジ、別部材を除外したうえで、完全一致から限定的に統合します。統合後に退化した面を削除または溶解し、境界が開いていないか確認します。

次に、完全なゼロ面積面を除去し、ほぼ退化した面を別条件で抽出します。微小面を一括削除せず、必要な形状が含まれていないか目視と断面で確認します。

穴や不連続が生じた場所は、用途に応じて局所的に再三角形化します。体積計算や閉じた立体判定に使う場合は、開いた境界、自己交差、非多様体辺、面の向きを追加確認します。

修正後は別名OBJへ書き出し、再読み込みして同じ検査を繰り返します。頂点数、面数、境界辺数、座標差、材質、UV、法線を処理前と比較します。

最後にアップロード先で実運用の機能を確認し、検査結果と処理条件を確認済みデータへひも付けます。この流れを手順書にすれば、エラー発生時にどの工程から確認すべきか判断しやすくなります。

ゼロ面積ポリゴンの再発を防ぐデータ管理

再発防止には、完成OBJのクリーンアップだけでなく、点群取得から書き出しまでの条件管理が必要です。

計測時は、対象面を必要な密度と角度で取得し、欠測、外れ値、動体、反射の乱れを確認します。複数回の計測を結合する場合は、重複範囲の位置合わせ精度を確認し、二重面やずれた表面を残さないようにします。重複計測そのものではなく、重複部分の不整合が後工程の問題になりやすい点を区別します。

メッシュ生成時は、対象形状、点間隔、ノイズ量に合った接続距離、穴埋め、平滑化、外れ値除去条件を設定します。地表面、壁面、薄い部材など、性質の異なる表面を無条件に一括接続しないことが重要です。

簡略化後は、退化面、ほぼ退化した面、面の向き、自己交差を再検査します。辺縮約による形状差を確認し、必要精度を超える変化がある場合は簡略化率を下げます。

OBJ書き出し時は、座標の有効桁、三角形化、法線、UV、材質、グループ、オブジェクト名の設定を記録します。容量削減を目的に座標桁を過度に減らすと、近接頂点が同じ値へ丸められる可能性があります。

頂点統合距離、面積許容値、簡略化率、削除面数、再三角形化範囲、書き出し桁数、使用ソフトと版を管理すれば、同じ現場の更新データを再現性のある条件で処理できます。

すべての点群OBJへ同じ数値を適用するのではなく、座標単位、モデル寸法、点間隔、最小形状、必要精度、利用目的に応じて設定し、その根拠を共有できる状態にします。

現場計測から点群OBJアップロードまでを効率化する考え方

点群OBJアップロード時の不具合を減らすには、完成OBJだけを修正するのではなく、現場計測、点群確認、位置合わせ、メッシュ生成、書き出し、アップロードを一つの工程として管理します。

現場で取得範囲や点群の状態を確認できれば、欠測部分の追加計測や、外れ値・位置ずれの早期発見につながります。利用目的を現況確認、断面作成、面積計算、体積計算、構造物記録などに分けると、必要な点密度とメッシュ品質を決めやすくなります。

LRTK PhoneとLRTKの関連ソフトウェアは、公式情報上、点群の取得、閲覧、編集、共有などの運用に対応しています。これらを現場確認やデータ整理に利用することは、計測不足を早期に見つける選択肢になります。ただし、OBJへの変換、三角形化、退化面除去、アップロード先との互換性は、使用する書き出し機能や後段ソフトの対応形式を個別に確認する必要があります。LRTK Phoneだけで本記事のOBJ修復工程がすべて完結すると断定しないことが安全です。([Lefixea Irtk][5])

元の計測データ、位置合わせ後の点群、メッシュ生成後、修正後OBJ、アップロード確認済みデータを分けて管理すれば、問題が発生した工程を追跡しやすくなります。

ゼロ面積ポリゴンが見つかったときは、完成OBJを繰り返し削るだけでなく、発生数と分布に応じて元点群から再生成できる状態を維持します。修正条件と検証結果を蓄積することで、同種現場の作業時間を短縮しやすくなります。

まとめ

点群OBJアップロード時に読み込みエラー、表示不良、断面や体積処理の不具合が起きた場合、ゼロ面積ポリゴンは確認対象の一つです。ただし、ゼロ面積ポリゴンが存在するだけで必ずアップロードが失敗するとは限らず、座標系、面の向き、自己交差、材質、法線、ファイル容量、アップロード先の仕様も合わせて切り分けます。

ゼロ面積ポリゴンは、同一座標の頂点、同じ頂点の重複参照、一直線上の3点、座標丸め、辺縮約、誤った結合や三角形化などで発生します。

除去方法は、重複頂点を限定的に統合する方法、同じ頂点を参照する面を除去する方法、一直線上の頂点で構成された面を整理する方法、面積しきい値で抽出する方法、問題範囲を再三角形化する方法の5つです。

同位置の頂点はUV境界、ハードエッジ、別部材のために意図的に分離されている場合があるため、位置だけを基準に全体を一括統合しないことが重要です。完全な退化面と、正常な微小面やほぼ退化した面も分けて扱います。

修正後は別名OBJへ書き出して再読み込みし、頂点数、面数、境界、法線、UV、材質、断面、体積を確認します。最終判定は実際のアップロード先で使用する機能まで試して行います。

計測、位置合わせ、メッシュ生成、簡略化、書き出しの条件を記録し、問題が発生した工程へ戻れる管理方法を整えることが再発防止につながります。LRTK Phoneを利用する場合も、点群取得・確認の範囲と、OBJ修復・変換を行う後段工程の役割を分けて運用することが安全です。

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

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