点群から生成したOBJファイルをアップロードしたときに、処理が途中で止まる、形状の一部が表示されない、読み込みエラーになるといった問題が起きることがあります。その原因の一つとして、メッシュの開いた境界や、穴の周囲に残った自己交差面、重複面、面積がほとんどない面などが考えられます。
OBJは頂点だけを記録することもできますが、表面形状を扱う場合は、頂点を参照して面を定義します。点群からメッシュを生成する工程で面が欠落したり、境界が複雑になったり、編集後の接続関係が崩れたりすると、アップロード先の解析処理が面を安定して三角形化できないことがあります。
ただし、画面上で穴が見えるからといって、必ずしもOBJファイルが壊れているとは限りません。計測対象にもともと開口部がある場合、スキャンできていない範囲がある場合、不要部分を意図的に削除した場合にも穴は生じます。また、OBJの読み込み失敗は、穴そのものではなく、存在しない頂点の参照、数値として解釈できない座標、過度に複雑な面、材質参照の不整合などによって起きることもあります。
重要なのは、その穴が形状として意図されたものなのか、計測不足による欠損なのか、編集やメッシュ生成によって生じた不正な接続なのかを切り分けることです。
この記事では、「点群 OBJ アップロード」で読み込みに失敗した実務担当者に向けて、多角形メッシュの穴を確認し、安全に修復してから再アップロードするまでの流れを6つの手順に分けて解説します。
点群OBJで多角形に穴がある状態とは
OBJファイルには、頂点座標、テクスチャ座標、頂点法線、面を構成する参照番号などをテキスト形式で記録できます。頂点だけを保存したOBJもありますが、多角形の穴が問題になるのは、主に点群から表面メッシュを生成し、面情報を含めて出力したOBJです。
OBJの一般的な多角形面は、fから始まる一行に、面を構成する頂点の参照番号を順番に並べて定義します。単純な四角形であれば、次のように表現できます。
text f 1 2 3 4
この記述は、一つの頂点列で一枚の面の輪郭を表します。一般的なOBJの多角形面には、外周とは別に内周を指定し、その内側を一枚の面の穴として扱うための専用記法がありません。そのため、窓や出入口のような開口を残したい場合は、開口の周囲を複数の面で構成し、各面を穴のない単純な多角形または三角形として出力する方法が安全です。
編集ソフトの内部形式では開口を含む面として表示できていても、OBJへ書き出す段階で適切に分割されなければ、自己交差した多角形、凹形状が複雑な多角形、ねじれた多角形などが残ることがあります。出力元では表示できても、別の読み込み環境では三角形化の結果が異なり、面の欠落やエラーにつながる可能性があります。
また、見た目では単なる穴に見えても、内部データでは別の問題が起きている場合があります。穴の周囲にある頂点が重複している、境界の辺が途中で分岐している、同じ位置に複数の面が重なっている、面の頂点順序が交差している、面が存在しない頂点番号を参照しているといった状態です。
単純な穴であれば、境界となる辺が一つの閉じた輪を形成します。穴の周囲をたどったときに、一周して出発点へ戻れる状態です。これに対して接続が崩れた境界では、途中で途切れたり、一つの頂点から複数の境界が分岐したり、複数の輪が交差したりします。この違いを確認せずに自動穴埋めを実行すると、面の重なり、ねじれ、意図しない橋渡しが発生する可能性があります。
点群OBJを扱う際には、画面上の空白部分だけを見るのではなく、頂点、辺、面の接続関係と、OBJへ保存された参照情報を確認する必要があります。
多角形の穴が読込失敗につながる理由
OBJは比較的単純なテキスト形式ですが、読み込み側では、面を表示や計算に利用できる形へ変換する処理が行われます。四角形以上の多角形は、多くの環境で内部的に三角形へ分割されます。
単純で平面に近い凸多角形であれば、三角形化は比較的安定します。一方、輪郭が大きく凹んでいる面、頂点列が自己交差している面、同一平面から大きく外れた頂点を含む面、頂点数が非常に多い面では、読み込み環境によって分割結果が変わることがあります。
特に注意したいのは、実物の開口を一枚の面の内部へ残そうとして、外周と内周を一つの頂点列へ無理に連結した状態です。OBJの通常のf行は一つの頂点列を面として扱うため、内周を表現するためのつなぎ方によっては輪郭が自己交差したり、同じ辺を往復したりします。このような面は、読み込み側で有効な多角形として解釈できない場合があります。
読込失敗につながりやすい状態の一つは、面を構成する頂点の並びが自己交差していることです。指定順に頂点を結んだ線が途中で交差すると、面の内側と外側が曖昧になります。画面上では折れた面や穴のように見えることがありますが、実際には三角形化が不安定な面です。
次に、同じ辺を三つ以上の面が共有している非多様体の状態があります。OBJ形式自体がこの接続を必ず拒否するわけではありませんが、閉じた表面や体積を前提とする変換、断面、体積計算などでは処理できないことがあります。読み込み環境によっては表示できても、後続処理で失敗する可能性があります。
面積がほとんどない面も注意が必要です。同じ位置または極端に近い位置にある頂点で作られた三角形や、三頂点がほぼ一直線に並ぶ三角形は、有効な表面として安定して扱えないことがあります。このような面が穴の境界付近に多数残ると、修復や簡略化の処理が不安定になります。
面が参照している番号の不整合は、穴の有無に関係なく重大な問題です。存在しない頂点、テクスチャ座標、頂点法線を参照している場合は、読み込み側がその面を無視したり、ファイル全体の解析を停止したりすることがあります。
極端に複雑な一枚の多角形も互換性を下げます。数百、数千の頂点を一つの面として定義すると、穴がなくても三角形化に時間がかかったり、分割に失敗したりする可能性があります。点群から生成した境界では細かな凹凸が残りやすいため、一つの面に過剰な頂点が含まれることがあります。
したがって、穴の修復では、空白を面でふさぐだけでは不十分です。穴の周囲にある不正な接続を整理し、読み込み側が解釈しやすい単純な面へ作り直すことが重要です。
修復手順1:元データを保存して穴の種類を切り分ける
最初の手順は、修復作業を始める前に元のOBJファイルを複製し、問題のある穴がどの種類に当たるかを確認することです。元ファイルへ直接上書きすると、修復結果が悪化したときに計測直後や最初の出力状態へ戻せなくなります。
OBJ本体だけでなく、関連するMTLファイルやテクスチャ画像がある場合は、それらも同じ単位で複製します。OBJのファイル名だけを変更し、関連ファイルを置き忘れると、形状修復とは別に材質参照やテクスチャ参照の問題が発生するため注意が必要です。
次に、読み込みに失敗したOBJをメッシュ確認環境で開き、頂点表示、辺表示、面表示を切り替えて穴を確認します。通常の陰影表示だけでは、穴なのか、裏向きの面なのか、同じ位置に重なった面なのかを判別しにくいことがあります。可能であれば、面の表裏を区別する表示や、境界辺を強調する表示を使用します。
確認する穴は、大きく三つに分けられます。
一つ目は、点群の不足によって表面が作られていない欠損です。遮蔽物の裏側、反射しにくい面、遠距離部分、対象面へ浅い角度で計測した部分などでは、元の点が不足し、メッシュに穴が生じることがあります。この場合はファイル破損とは限らず、表面を復元するための情報が不足している状態です。
二つ目は、面の削除や編集によって生じた開口部です。不要物の除去後や範囲切り出し後に、周囲だけが残って穴になることがあります。境界が単純な閉ループになっていれば、比較的修復しやすい状態です。
三つ目は、不正な多角形や接続によって穴のように見えている状態です。自己交差、重複面、重複頂点、面の向きの不統一、参照番号の不整合などが原因で、一部の面が表示されていない可能性があります。この場合は、穴埋めより先に面と参照情報を整理します。
穴の位置だけでなく、読込失敗が発生する段階も記録します。ファイルを選択した直後に失敗するのか、アップロード完了後の変換中に失敗するのか、表示開始時に問題が出るのかによって、疑うべき箇所が変わります。
ファイルの解析開始直後に失敗する場合は、数値の書式、行構造、参照番号、未対応の記述などを確認します。変換中に失敗する場合は、複雑な面、自己交差、非多様体、面数やメモリ負荷などが影響している可能性があります。表示時だけ問題が起きる場合は、面の頂点順序、頂点法線、材質、座標値の大きさなども確認対象になります。
この段階では、すぐに穴を埋めず、問題の範囲を特定することを優先します。巨大な点群OBJ全体へ一括修復をかけるよりも、問題がある部分を複製して小さなテストモデルで確認したほうが、意図しない形状変化を抑えやすくなります。
修復手順2:開いた辺と不正な頂点を検出する
穴の種類を確認したら、次は境界となっている開いた辺を検出します。二多様体の表面内部にある通常の辺は二つの面で共有されますが、穴の輪郭やメッシュの外周にある辺は一つの面にだけ接続されます。
一つの面にだけ接続されている辺を抽出すると、穴の境界を見つけやすくなります。ただし、対象物の外周、切り出した地表の端部、意図的な開口部も同じ条件で抽出されるため、検出された辺をすべて自動的に埋めるのは避けます。
境界辺を選択したら、連続して一周できるかを確認します。単純な穴であれば、隣り合う辺を順にたどることで閉じた輪になります。途中で行き止まりになる場合は、辺や面の欠落、未接続の頂点などが考えられます。途中で複数方向へ分岐する場合は、重複面、非多様体頂点、複数の境界が一つの頂点へ集まっている状態などを疑います。
次に、同じ位置または極めて近い位置にある頂点を調べます。点群からメッシュを生成したデータや、複数のメッシュを結合したデータでは、見た目が同じ位置でも内部では別の頂点として保存されていることがあります。頂点が統合されていないと、面同士が接して見えていても、接続情報上は別々の表面として扱われます。
近接頂点を統合するときは、許容距離を大きくしすぎないことが重要です。許容距離が大きすぎると、本来は別の角、薄い部材の表裏、近接する配管などまで一つに結合される可能性があります。まずはモデルの単位と計測精度に対して十分に小さい値から試し、統合前後の頂点数と形状を比較します。
穴の周囲に面積がほとんどない面がないかも確認します。三つの頂点がほぼ一直線に並んでいる三角形、同じ頂点番号を重複して参照している面、二辺の長さが極端に小さい面などは、正常な表面として扱えないことがあります。これらは穴を埋める前に削除または再構成します。
重複面も確認します。同じ頂点の組み合わせで作られた面が二重に存在すると、表面のちらつき、陰影の競合、境界判定の混乱につながります。構成頂点が同じで頂点順序だけが逆になった面も重複として扱う必要があります。
自己交差している面や境界も修復対象です。境界を適切な方向から見たときに輪郭が交差している場合、そのままでは安定した穴埋め面を生成できません。交差部分で輪郭を分割するか、破損部分の面を削除して単純な境界を作り直します。
この手順の目的は、穴を埋められる状態へ境界を整えることです。修復対象の開いた辺が一つの閉じた輪となり、分岐や重複がなく、境界頂点が意図した順序で並ぶ状態を目指します。
修復手順3:破損した面を削除して境界を整理する
穴の周囲に自己交差、重複面、極端に細長い面、非多様体接続がある場合は、問題の面を部分的に変形するより、一度削除して境界を作り直したほうが安全なことがあります。
破損面を残したまま穴埋めを実行すると、新しく作られた面が既存面と重なり、見た目では閉じていても内部に二重面や交差面が残ることがあります。これらはアップロード後の陰影異常だけでなく、断面作成、体積計算、衝突判定、簡略化などに影響する可能性があります。
削除範囲は、明らかに壊れている面だけに限定するのが基本です。ただし、穴の縁に非常に細長い三角形が連続している場合や、境界が細かく蛇行している場合は、周囲を少し広めに削除し、単純な輪郭へ整えたほうが安定します。
境界の形状を整理するときは、頂点数を減らしすぎないようにします。曲面上の穴を数個の頂点だけで閉じると、元の曲率が失われ、平らなふたのような形になることがあります。一方で、意味のない細かな頂点をすべて残すと、穴埋め後に極端に細長い三角形が生成されやすくなります。
境界頂点の間隔は、周囲のメッシュ密度に近づけるのが目安です。穴の周囲だけ頂点間隔が極端に細かい場合は、輪郭を簡略化します。反対に、周囲の曲率変化が大きいのに頂点数が少ない場合は、必要に応じて辺を分割します。
境界が一つの平面に近い場合は、比較的単純な輪郭へ整理できます。しかし、配管、法面、曲面部材、凹凸のある地表などでは、境界頂点が同一平面上に並びません。その場合は、一方向から見た輪郭だけで判断すると、新しい面がねじれたり、周囲の面から外れたりする可能性があります。
境界を整理した後は、隣接する面の頂点順序も確認します。一般的なポリゴンメッシュでは、頂点の並び順から面の幾何学的な向きが決まります。穴の周囲で頂点順序が不統一になっていると、新しい面の向きをそろえにくくなります。
また、対象が閉じた立体である場合は、外側の表面と内側の表面を誤ってつながないよう注意します。薄い壁や板状の部材では、表面と裏面が近接しているため、近接頂点の統合や自動穴埋めによって両面が接続されることがあります。
形状の一部を削除した後は、一時的に穴が大きくなりますが、これは異常ではありません。不正な小面を残したままふさぐよりも、接続関係が明確な境界を作ってから新しい面を生成するほうが、読み込み互換性を確保しやすくなります。
修復手順4:周囲の形状に合わせて穴を埋める
境界が整理できたら、新しい面を生成して穴を埋めます。ただし、すべての穴を一枚の多角形で閉じるのではなく、穴の大きさ、輪郭、周囲の曲率、利用目的に応じて方法を選びます。
小さく、境界頂点がほぼ同一平面上にある穴であれば、境界から複数の三角形または単純な多角形を作ることで修復できることがあります。境界頂点数が多い場合や、輪郭が凹んでいる場合は、一枚の多角形にまとめるより、書き出し前に三角形化しておくほうが結果を確認しやすくなります。
曲面上の穴では、周囲の面の流れを意識して新しい頂点と面を配置します。穴の中心へ一つの頂点を追加し、放射状に三角形を作る方法は単純ですが、中心付近へ細長い面が集中しやすくなります。穴が大きい場合は、複数の輪を追加しながら段階的に埋めるほうが、周囲に近い面密度を保ちやすくなります。
地表面のような緩やかな形状であれば、穴の周囲にある高さや傾斜から補間して面を作成できます。ただし、穴の内部に本来存在していた凹凸は、周囲の情報だけでは正確に復元できません。修復面は実測面ではなく、周辺形状から推定した面として扱う必要があります。
構造物の角部に穴がある場合は、一枚の滑らかな面で閉じると角が丸まることがあります。壁面と床面、柱面と梁面など、異なる面が交わる位置では、境界を面ごとに分け、稜線を維持したまま穴を埋めます。
穴の輪郭が細長い場合も注意が必要です。細長い穴を一度に閉じると、幅に対して長さが大きい三角形が生成されることがあります。このような面は陰影が不自然になったり、後工程の簡略化で形状が崩れたりする可能性があります。長手方向に複数区間へ分割し、周囲の面に近い大きさと形状の面を作ります。
穴を埋めた後は、追加された面だけを表示して確認します。面同士が交差していないか、既存面の裏側へ入り込んでいないか、穴の外側へ張り出していないかを複数方向から確認します。
特に凹形状の境界では、正面からは正常に見えても、側面から見ると面が折り返していることがあります。透過表示や断面表示を利用できる場合は、内部に不要な面ができていないかも確認します。
穴埋め後の面密度が周囲と大きく異なる場合は、必要に応じて面を再分割します。周囲が細かなメッシュなのに、穴だけ数枚の大きな面で閉じられていると、陰影や簡略化で境界が目立つことがあります。反対に、穴の部分だけ過剰に細かな面を作ると、ファイル容量や処理負荷が増えます。
修復の目的は、見た目だけを滑らかにすることではありません。アップロード先が安定して解釈できる、自己交差や重複のない単純な面構成へ整えることが重要です。
修復手順5:複雑な多角形を単純な面へ分割する
穴を埋めた後は、四角形以上の複雑な多角形を、読み込み側が解釈しやすい形へ分割します。特に点群から生成したメッシュでは、境界頂点が多い巨大な多角形や、凹形状を含む多角形が残りやすいため、出力前の三角形化が有効なことがあります。
三角形は、三つの頂点によって面の形が決まります。そのため、四角形以上の面に比べて、読み込み側で追加の分割判断が必要になりにくくなります。出力元で正常に表示できるOBJが、アップロード先で形状崩れを起こす場合は、出力前に三角形化することで改善する可能性があります。
ただし、三角形化を実行すれば必ず直るわけではありません。元の多角形が自己交差している場合、重複頂点を含む場合、極端にねじれている場合は、分割後にも不正な三角形が残ることがあります。先に境界整理、重複除去、破損面の削除を行う必要があります。
三角形化後は、細長すぎる三角形が大量に生成されていないかを確認します。極端に細長い三角形は、陰影や後続計算が不安定になる要因の一つです。穴の境界が細かく蛇行している場合は、三角形化前に輪郭を適度に簡略化したほうが安定します。
凹形状の多角形では、三角形の辺が輪郭の外側へ飛び出していないかを確認します。適切に分割されていない場合、見た目では穴が埋まっていても、重なった面や向きの異なる面が生成されることがあります。
実物の開口を残す場合は、外周と内周を持つ一枚の面としてOBJへ保存しようとせず、開口の周囲を複数の単純な面へ分けます。たとえば、開口部のある壁面であれば、開口の上、下、左、右をそれぞれ独立した面または三角形群として構成します。
この方法であれば、開口部そのものは意図的な空間として残しつつ、各面は内周を持たない単純な輪郭になります。ドア、窓、配管用の開口、橋脚間の空間など、実物に存在する穴を保持したい場合に適しています。
三角形化後には、元の形状と比較します。修復前後のモデルを同じ位置へ重ね、外形、稜線、高さ、開口部の寸法が意図せず変わっていないかを確認します。自動分割そのものは既存頂点の位置を変えない場合が多いものの、破損面の再構成や自動補間を伴うと形状が変わる可能性があります。
また、三角形化によって面数が増えるため、ファイル容量や処理負荷も確認します。必要以上に細分化されたメッシュでは、穴の修復に成功しても、アップロード容量の上限、変換時間、利用端末のメモリなど別の問題が発生することがあります。
面数が多すぎる場合は、形状への影響を確認しながら全体を適度に簡略化します。ただし、穴の周囲や鋭い角を一律に簡略化すると、境界が崩れたり開口寸法が変わったりすることがあります。修復部分や稜線を保護しながら段階的に調整することが大切です。
修復手順6:面の向きと参照情報を整えて再出力する
面の修復と三角形化が完了したら、面の頂点順序、頂点法線、頂点参照、材質参照などを確認してOBJを再出力します。
一般的なポリゴン面の幾何学的な向きは、面を構成する頂点の並び順から決まります。一方、OBJのvnで記録される頂点法線は、主に滑らかな陰影を表現するための情報です。頂点法線だけを修正しても、面の頂点順序が逆のままであれば、読み込み先の背面非表示設定などによって面が見えないことがあります。
まず、隣接する面の頂点順序が連続するようにそろえます。閉じた立体であれば、外側を向くように統一します。地表面や片面のモデルでは、主に表示または計算へ利用する側を確認します。
頂点法線が保存されている場合は、面の修復後に再計算する方法があります。ただし、角を明確に残したい部分まで一律に平滑化すると、稜線が丸く見えることがあります。平滑化する範囲と角を維持する範囲を分けます。
次に、OBJ内の参照番号を確認します。一般的な編集ソフトから全体を書き出し直せば、削除後の参照番号は再構成されることが多いものの、テキストを直接編集した場合や、一部の記述だけを別ファイルから移した場合は、存在しない番号を面が参照していないかを確認する必要があります。
OBJの面定義では、頂点座標だけでなく、テクスチャ座標や頂点法線を同時に参照することがあります。代表的な記述はv/vt/vn、テクスチャ座標を省略する場合はv//vnです。面の途中で参照形式が混在しても読める実装はありますが、互換性を重視する場合は、同じ用途の面で記述をそろえます。
修復した面にテクスチャ座標や頂点法線が用意されていない場合は、書き出し設定を見直します。存在しない番号を追加するのではなく、利用しない属性を参照しない形式で出力するか、必要な属性を再生成します。
材質を使用している場合は、修復面へ意図した材質が割り当てられているかを確認します。未定義の材質名や見つからないMTLファイルがあっても形状を読み込める環境はありますが、材質が欠落したり、警告や変換失敗につながったりする可能性は読み込み先によって異なります。
再出力時には、アップロード先の仕様が不明な場合、複雑な多角形を残すよりも、確認済みの三角形へ変換した状態で出力するほうが互換性を確保しやすくなります。また、不要な補助オブジェクト、非表示の面、孤立頂点、用途のない線要素などを含めず、アップロード対象だけを出力します。
ファイル名や関連ファイルの参照には、利用環境によって扱いが変わりやすい文字を避け、簡潔な名前を付けます。MTLファイルやテクスチャ画像を使用する場合は、OBJ内の参照先と実際のファイル名が一致していることを確認し、必要なファイルを同じフォルダ単位で整理します。
再出力後は、元の編集環境だけで確認を終えず、新しく保存したOBJをいったん閉じてから読み直します。編集画面上では正常でも、書き出し設定によって一部の情報が保存されていない場合があるためです。
新しいOBJを開いたときに、意図しない穴、面の向きの乱れ、材質の欠落、位置ずれがないことを確認したうえで、アップロードを試します。問題を切り分けるため、最初は修復した範囲だけを含む小さなOBJでテストし、成功してから全体データを書き出す方法も有効です。
修復しても読込失敗する場合の確認項目
穴を修復しても点群OBJのアップロードに失敗する場合は、別の問題が残っている可能性があります。
まず確認したいのは、孤立した頂点、線、面です。どの面にも使われていない頂点が存在しても読み込める環境はありますが、不要な情報が大量に残っていると解析負荷が増えます。面に接続されていない線要素や、用途の不明な点要素が含まれている場合も、アップロード先の対応状況によって挙動が変わります。
次に、座標値を確認します。現場座標をそのまま使用したOBJでは、原点から遠い大きな座標値が保存されることがあります。読み込み側が単精度浮動小数点で内部処理する場合などには、小さな形状差を十分に保持できず、細かな面が乱れて見える可能性があります。
現場座標を維持する必要がある場合は、アップロード先が大きな座標値へ対応しているかを確認します。原因切り分け用の複製データを原点付近へ平行移動し、同じ形状で読込結果が変わるかを比較すると、座標値の影響を確認できます。座標を移動したテストデータは、成果データと混同しないように管理します。
ファイル容量や面数も確認します。穴を埋める過程で過剰に細かな面を作成すると、修復前よりもファイルが大きくなることがあります。アップロード自体は完了しても、その後の変換処理でメモリ不足や処理時間超過が発生する可能性があります。
一つのOBJへ複数の離れた形状が含まれている場合は、部位ごとに分割してテストします。分割したすべてのファイルが読み込めるのであれば、全体容量、面数、処理時間などが影響している可能性があります。特定の分割ファイルだけが失敗する場合は、その範囲に不正な面や参照が残っている可能性が高くなります。
文字コード、改行、制御文字も確認対象です。OBJはテキスト形式であり、通常は一つの命令を一行で記述します。仕様上は行末のバックスラッシュによる継続行が利用できる場合がありますが、対応状況は読み込み実装によって異なるため、互換性を重視する場合は面定義を通常の一行として出力するほうが安全です。テキストを直接編集した場合は、意図しない改行や区切り文字の変化がないかを確認します。
数値として解釈できない値が含まれていないかも重要です。頂点座標、テクスチャ座標、頂点法線に未定義値、無限値、空欄、数値以外の文字が入っていると、穴とは別に読込失敗が発生します。
参照番号には正の番号だけでなく負の相対参照も利用できますが、読み込み環境によって対応差があります。互換性を優先する場合は、書き出し設定で一般的な正の参照番号へ統一できるか確認します。
面が参照する正の番号は、該当する頂点、テクスチャ座標、頂点法線の定義範囲内にある必要があります。存在しない番号を参照する面が残っていると、その面が無視されたり、ファイル全体の処理が停止したりする可能性があります。
修復後の確認では、穴の見た目だけでなく、ファイル構造、数値、参照情報、座標値、容量、面数を順番に切り分けることが大切です。
穴を埋めるべきではないケース
点群OBJに穴がある場合でも、すべてを修復する必要があるわけではありません。実物に存在する開口部や、用途上必要な空間まで埋めると、計測成果の意味が変わってしまいます。
窓、出入口、配管の内部、橋脚間、機械設備の開口などは、形状として残すべき穴です。このような穴を維持する場合は、内周を持つ一枚のOBJ面として表現しようとせず、開口の周囲を複数の単純な面または三角形で構成します。
計測できていない範囲も、用途によっては無理に補間しないほうが安全です。たとえば、出来形確認や現況記録に使用する点群では、取得できていない範囲を推定面で埋めると、実測値と補間値の区別がつかなくなります。
体積計算などで閉じた形状が必要な場合は、計算用の補完面として穴を埋めることがあります。その場合でも、補完した範囲、補間方法、使用した境界を記録し、元の計測面と区別できるようにします。
モデルの外周にある開いた境界も、必ずしも穴ではありません。地表の一部を切り出したモデルは、周囲が開いた状態になります。この外周を自動的に閉じると、底面や側面が生成され、意図しない立体になる可能性があります。
穴埋め機能を使用するときは、検出されたすべての境界ではなく、修復対象となる境界だけを選択します。自動処理を適用した後は、意図的な開口、モデル外周、未計測として残す範囲が維持されていることを確認します。
点群OBJの穴を発生させにくくする予防策
点群OBJの穴は、修復工程だけでなく、計測やメッシュ生成の段階から減らすことができます。
計測時には、一方向からだけでなく、対象物を複数方向から取得します。壁の裏側、段差の側面、設備の下部などは、一つの位置からでは点を取得できません。視点を変えて重複範囲を確保すると、表面生成に必要な点がそろいやすくなります。
対象面に対する計測角度も重要です。表面を浅い角度から計測すると、点の間隔が広がったり、欠測が増えたりすることがあります。可能な範囲で対象面に正対する方向からも計測します。
反射状態が不安定な部分や細い部材では、点がまばらになりやすいため、周辺よりも取得条件を慎重に確認します。ただし、同じ場所へ不要な点や外れ値が増えると、ノイズや誤った面の原因になることがあります。点数だけでなく、分布と品質を確認します。
メッシュ生成前には、孤立点、明らかな外れ値、移動物体の点などを整理します。ノイズが残ったまま表面を生成すると、実際の対象面から離れた位置に細い面が作られ、穴の周囲の接続が複雑になることがあります。
点の密度が急激に変化する範囲も注意します。高密度部分と低密度部分を同じ条件で処理すると、低密度側に大きな面が生成されたり、接続できずに穴が残ったりすることがあります。必要に応じて範囲を分け、目的に合う条件でメッシュを生成します。
メッシュ生成後は、すぐにOBJを出力するのではなく、境界辺、重複面、自己交差、非多様体、面の向きなどを確認します。問題がある状態で簡略化や結合を重ねると、後から原因を特定しにくくなります。
編集工程では、頂点の削除と面の削除の関係を確認します。一般的な編集ソフトでは接続面も同時に処理されることがありますが、テキスト編集や独自変換では参照だけが残る可能性があります。不要部分を除去した後は、新しい境界が意図した形になっているかを確認します。
複数のメッシュを結合するときは、接触部分の頂点が正しく統合されているかを確認します。位置が一致していても接続されていない場合は、継ぎ目に細い穴が残ります。一方で、近接する別部材まで統合すると形状が変わるため、結合範囲と許容距離を限定します。
OBJ出力前には、自己交差した多角形や、開口を無理に一枚で表した面を残さず、単純な面へ分割します。出力元とアップロード先で三角形化の結果が変わることを避けるため、必要に応じて出力前に三角形化し、その状態で形状を確認します。
アップロード前に行いたい最終確認
修復した点群OBJをアップロードする前には、編集画面上の見た目だけでなく、保存後のファイルを対象に最終確認を行います。
まず、新しく出力したOBJを別の作業領域へ読み込み直します。穴を埋めた面が保存されているか、面の頂点順序がそろっているか、不要な部材が含まれていないかを確認します。
次に、境界辺を再検出します。意図的な開口とモデル外周以外に、想定していない開いた辺が残っていないことを確認します。小さな穴は通常表示では見つけにくいため、境界表示を利用します。
重複頂点、重複面、面積がほとんどない面、自己交差、非多様体接続が残っていないことも確認します。自動修復後に新しい重複面や細長い面が作られることもあるため、修復前だけでなく修復後にも検査します。
モデル全体の寸法と位置も見直します。編集や再出力の際に、単位、座標軸、原点、縮尺が意図せず変わっていないことを確認します。穴の修復とは直接関係しませんが、アップロード後に形状が極端に大きい、小さい、横倒しになる場合は、出力設定が影響している可能性があります。
材質やテクスチャを使用する場合は、関連ファイルがそろっていることを確認します。形状だけを確認するテストでは、材質参照を外した簡易OBJを別途作り、形状の読込可否を先に確認する方法もあります。
大規模なOBJでは、修復箇所だけを含む小さなテストファイルを作成すると原因を切り分けやすくなります。小さなファイルが正常に読み込める場合は、修復部分の形状は受け入れられており、全体ファイルでは容量、面数、別の破損箇所などが影響している可能性があります。
反対に、修復部分だけでも読み込めない場合は、その範囲に不正な参照、自己交差、重複面などが残っている可能性があります。穴埋め面を一度削除し、境界整理からやり直します。
アップロードテストでは、ファイル名を変更し、過去にアップロードしたデータと区別します。同じ名前を使い続けると、キャッシュや履歴の影響で古いデータを確認していることに気づきにくい場合があります。ただし、キャッシュの有無や更新方法はアップロード先の仕様によって異なるため、必要に応じてサービス側の更新手順も確認します。
修復前、修復途中、修復後のファイルを別名で保存し、どの処理で読込結果が変わったかを記録すると、同様の問題が発生したときの対応手順として再利用できます。
まとめ
点群OBJの多角形メッシュに穴があるときは、単純に空白部分へ面を追加するだけでは、読込失敗を解消できないことがあります。穴の周囲に重複頂点、自己交差、面積がほとんどない面、分岐した境界、非多様体接続、複雑な多角形などが残っていると、アップロード先での三角形化や変換が不安定になる可能性があります。
また、一般的なOBJのf行は一つの頂点列で一枚の面を定義し、外周とは別の内周を直接指定する専用記法を持ちません。実物の開口を残す場合は、開口の周囲を複数の単純な面または三角形へ分割して出力することが重要です。
修復では、最初に元データを保存し、計測不足による欠損なのか、意図的な開口なのか、不正な面や参照による表示異常なのかを切り分けます。その後、開いた辺と不正な頂点を検出し、破損面を削除して境界を整理します。
穴を埋める際は、周囲の曲率や面密度に合わせて新しい面を作成し、自己交差する巨大な多角形を残さないことが大切です。複雑な面は単純な多角形や三角形へ分割し、面の頂点順序、頂点法線、頂点参照、材質参照を整えてからOBJを再出力します。
修復後も読込失敗が続く場合は、孤立要素、参照番号、数値の異常、相対参照、座標値、面数、ファイル容量などを順番に確認します。対象を小さく分割してテストすると、問題のある範囲を特定しやすくなります。
実物の開口や未計測範囲まで無条件に埋めると、点群が示す現況と異なる形状になります。計算用に補完した面と実際に計測した面を区別し、利用目的に応じて修復範囲を判断することが大切です。
点群OBJの読込エラーを減らすには、アップロード直前の修復だけでなく、計測時の重複確保、不要点の除去、メッシュ生成後の境界確認までを一連の工程として管理する必要があります。現場での点群取得からデータ確認までを効率化したい場合は、LRTK Phoneを活用した計測方法も確認してみてください。