LRTKレフィクシア株式会社

点群OBJアップロードで面番号エラーが出る原因と6つの確認

点群OBJの面番号エラーとは

点群データをOBJ形式でアップロードしたときに、面番号が不正である、参照先が存在しない、面を構成できないといった内容のエラーが表示されることがあります。実際のエラーメッセージはアップロード先の仕様によって異なりますが、OBJファイル内の面定義と、頂点位置、テクスチャ座標、法線の参照番号が対応していない場合に発生しやすいエラーです。

OBJは、三次元形状をテキストで記録できる形式です。頂点位置は行頭のv、テクスチャ座標はvt、法線はvn、面はfで表します。たとえば、ファイル内に次のような頂点が三つあるとします。

v 0.0 0.0 0.0 v 1.0 0.0 0.0 v 0.0 1.0 0.0

この三つの頂点を使って三角形を作る場合、面はf 1 2 3と記録されます。最初の頂点行が1番、次の頂点行が2番、その次が3番として扱われます。OBJの頂点番号は、頂点行に書かれた固有の番号ではなく、ファイル内に定義された順番によって決まる点が重要です。

ファイル内に頂点が三つしかないのに、面がf 1 2 4となっていれば、4番の頂点は存在しません。この状態では面を再構成できないため、アップロード時に面番号エラーが出る可能性があります。同様に、頂点番号は正しくても、存在しないテクスチャ座標番号や法線番号を参照していれば、読み込みに失敗することがあります。

点群として利用するOBJには、頂点だけが記録され、面を示すf行がない場合もあります。一方、点群を表面化したデータ、別形式から変換したデータ、過去の編集工程を経たデータには、意図せず面情報が含まれていることがあります。利用者が点だけを表示したい場合でも、アップロード処理がファイル全体を検査する設計であれば、壊れた面定義が一つあるだけで処理が止まることがあります。

面番号エラーに対応するときは、エラーになった数字を適当な範囲内の番号へ置き換えるだけでは不十分です。番号を無理に変更すると、本来は離れている頂点同士が結ばれ、形状がねじれたり、大きな三角形が発生したりするおそれがあります。読み込みに成功しても、表面形状、面積、体積、断面などの結果が正しいとは限りません。

安全に修正するには、面が参照している番号の範囲、頂点の削除履歴、面定義の記法、番号の開始位置、面の構成方法、ファイル結合時の補正を順番に確認する必要があります。次の六つの確認を進めることで、原因を効率よく切り分けられます。

確認1 頂点番号が存在する範囲内か

最初に確認したいのは、すべての面が実在する頂点番号を参照しているかです。一般的なOBJでは、頂点や属性を先に定義し、その後のf行から参照します。正の頂点番号は1から始まり、各f行の時点ですでに定義されている頂点の範囲内である必要があります。すべてのv行が面行より前に並ぶ一般的な構成で、頂点位置を示すv行が10万行ある場合、正の頂点番号は1から10万までになります。

このファイルにf 99998 99999 100001という面が含まれていれば、100001番の頂点は存在しません。面に並ぶ番号のうち一つだけが範囲外でも、その面は正しく構成できません。アップロード先によっては問題の面だけを読み飛ばす場合がありますが、ファイル全体を不正として処理を中止する場合もあります。

頂点数を数えるときは、vで始まるすべての行を単純に数えないよう注意が必要です。テクスチャ座標を表すvtや、法線を表すvnも文字としてはvから始まります。頂点位置の総数を調べるには、先頭のキーワードがvである行を数えます。区切りには半角空白だけでなくタブが使われる場合もあるため、文字列の前方一致ではなく、空白類で分割した最初の項目がvかどうかで判定する方が安全です。

面定義が頂点位置だけで構成されている場合は、f行に書かれたすべての正番号が、その行より前に定義された頂点数以下かを調べます。OBJの面定義には、頂点位置、テクスチャ座標、法線を組み合わせた記法もあります。たとえばf 10/5/2 20/6/3 30/7/4という面では、10、20、30が頂点位置番号、5、6、7がテクスチャ座標番号、2、3、4が法線番号です。

これらの番号は、それぞれ別の要素数を基準に判定します。頂点位置が100個あっても、その面行までにテクスチャ座標が6個しか定義されていない場合、テクスチャ座標番号7は範囲外です。頂点番号だけを調べて問題がないと判断すると、属性番号の不整合を見落とします。

確認時には、v、vt、vnの行数を別々に集計します。そのうえで、面定義のスラッシュより前を頂点位置番号、一つ目と二つ目のスラッシュの間をテクスチャ座標番号、二つ目のスラッシュより後を法線番号として検査します。正番号は各面行の時点ですでに定義済みの対応要素を参照しているか、負番号はその時点の要素数に対する相対参照として成立しているかを確認することが重要です。

多くのOBJはv、vt、vnを先にまとめて記述し、その後へfを並べます。この構成ならファイル全体の各要素総数を上限として確認できます。ただし、頂点定義と面定義が途中で交互に現れるファイルでは、最終的な総数だけを見ても、面行より後ろの要素を先取りして参照している不整合を見落とす可能性があります。

大容量の点群OBJでは、数十万から数百万の頂点が含まれることがあります。すべての面を目視で確認するのは現実的ではありません。テキスト処理や検査用の仕組みを使い、最小番号、最大番号、範囲外参照が含まれる行を抽出すると効率的です。

問題を記録するときは、単に「範囲外の番号があった」とするのではなく、OBJ内の行番号、問題の面定義、参照されていた番号、その面行までに定義されていた要素数を残します。たとえば、「面定義のある120万行目で頂点500001を参照しているが、その時点の頂点数は500000」と記録すれば、変換処理で最後の頂点が欠落したのか、番号だけが一つずれたのかを調べやすくなります。

範囲外の番号を見つけても、最大番号へ置き換えるだけの修正は避けます。複数の面が同じ末尾頂点へ集中し、形状が大きく変わるおそれがあるためです。元データと照合して不足した頂点を復元する、誤った面を削除する、面を再生成するなど、原因に合わせて対応します。

確認2 頂点削除後の番号ずれがないか

点群から不要点やノイズ点を除去した後に面番号エラーが出る場合は、頂点削除後の番号ずれを確認します。OBJの頂点番号はファイル内の並び順で決まるため、途中の頂点を一つ削除すると、それより後ろにあるすべての頂点番号が一つずつ変わります。

たとえば、1番から100番までの頂点が記録されているOBJから、50番に相当する頂点行を削除したとします。削除後は、元の51番が新しい50番、元の52番が新しい51番となり、元の100番は新しい99番になります。

ところが、面定義が削除前の番号のまま残っていると、面が別の頂点を参照します。削除前のf 49 50 51は、削除後には異なる位置関係の頂点を結ぶことになります。また、f 98 99 100は、削除後のファイルに100番が存在しないため、明確な範囲外参照になります。

この問題が難しいのは、すべての面がエラーになるとは限らないことです。削除した頂点より前の番号だけで構成された面は、見かけ上そのまま読み込めます。削除位置より後ろの面は、番号が範囲内であっても別の頂点を参照します。ファイル末尾付近の面だけが範囲外になり、アップロード時のエラーとして表面化する場合があります。

したがって、範囲外の面だけを削除しても、範囲内に残った誤接続までは修正できません。頂点を削除した場合は、削除前の番号と削除後の番号を対応付け、すべての面定義を更新する必要があります。

削除する頂点が一つだけで、頂点順序を変更していない場合は、削除番号より大きい参照番号を一つ減らすことで対応できる可能性があります。しかし、複数の頂点を削除した場合は、削除された頂点数が位置によって異なります。元の100番が新しい何番になるかは、100番より前で削除された頂点の数によって決まります。

安全な方法は、旧番号と新番号の対応表を作ることです。残す頂点には新しい連番を割り当て、各面の旧番号を対応する新番号へ置き換えます。面が削除対象の頂点を参照していた場合、その面はそのまま維持できません。必要に応じて面を削除するか、周辺の残存頂点から再構成します。

点群の間引き処理にも同じ注意が必要です。点数を減らす処理では、多数の頂点が削除されます。面情報を持つデータで頂点だけを間引くと、既存の面接続は維持できない場合があります。メッシュとして使うのであれば、頂点削減と面の更新を一体で行う処理や、削減後の頂点から面を再構成する工程が必要です。点群として使うのであれば、間引き前の面情報を残さず、頂点中心の構成へ整理する方が安全な場合があります。

また、番号の範囲内に収まっていても、同じ頂点番号を複数回参照する面が発生することがあります。たとえばf 100 100 101という面は、三つの番号が記載されていても、実際には二つの異なる頂点しか使っていません。このような面は面積を持たない退化面となります。

頂点統合の処理でも退化面が発生します。近接する二つの頂点を一つへ統合した結果、もともと異なっていた二つの面頂点が同じ番号になることがあるためです。アップロード先によっては退化面を警告として除外しますが、面構成の不正として処理を停止することもあります。

頂点を削除、統合、並べ替え、間引きした後は、範囲外番号だけでなく、重複番号を含む面、削除済み頂点を参照していた面、極端に細長い面も確認します。番号の整合性と形状の整合性を分けずに確認することが、修正後の表示異常を防ぐポイントです。

確認3 面定義のスラッシュ記法が正しいか

OBJの面定義では、頂点位置番号だけでなく、テクスチャ座標番号や法線番号を同時に参照できます。属性をどこまで使うかによって、スラッシュの記法が変わります。

頂点位置だけを参照する場合は、f 1 2 3と記述します。頂点位置とテクスチャ座標を参照する場合は、f 1/1 2/2 3/3となります。頂点位置と法線を参照し、テクスチャ座標を省略する場合は、f 1//1 2//2 3//3です。三種類すべてを使う場合は、f 1/1/1 2/2/2 3/3/3と記述します。

面番号エラーは、数字の範囲だけでなく、このスラッシュ記法が壊れている場合にも発生します。たとえば、f 1/1/1 2/2 3/3/3のように、一つの面の中で参照項目の構成が混在していると、読み込み側によっては想定どおりに解釈できない場合があります。OBJ内で面ごとに記法が異なること自体は成立し得ますが、一つの面を構成する各頂点要素は、利用する属性をそろえておく方が互換性を確保しやすくなります。

f 1///1 2///2 3///3のようにスラッシュが過剰な場合や、f /1/1 /2/2 /3/3のように頂点位置番号が欠けている場合は、一般的な面要素として成立しません。f 1/ /1のようにスラッシュの間へ空白が入ると、一つの面要素が複数の文字列に分断され、面番号として認識されない可能性があります。

テクスチャ座標を持たない点群OBJへ、変換途中の空欄だけが残ることもあります。たとえば、法線を使わないのに1/1/のような末尾スラッシュが付いている場合です。読み込み側が柔軟に処理することもありますが、厳密な検証では不正な要素として扱われる可能性があります。

記法を修正するときは、テクスチャ座標や法線が本当に不要かを確認します。点の位置だけを読み込みたい場合は、面定義を頂点位置番号だけへ単純化できることがあります。しかし、画像を表面へ割り当てる用途ではテクスチャ座標が必要です。陰影表現に法線を利用する場合は、法線参照を消すことで表示結果が変わる可能性があります。

スラッシュを一括削除するだけでは、必要な属性まで失うおそれがあります。面定義を単純化する場合は、元ファイルを別に保存し、点表示、表面表示、テクスチャ表示など、目的ごとにファイルを分けると安全です。

面行の途中へ全角空白や不可視文字が混ざっているケースにも注意します。OBJは通常、半角空白やタブを区切りとして解釈しますが、読み込み処理によって対応範囲が異なることがあります。異なるテキスト環境からコピーした場合、数字の間に全角空白が入ることがあります。

コメントを記述する場合は、行頭の#で始める一般的な形式を用いると安全です。面定義と同じ行へ独自の説明文字列や未定義の記号を追加すると、読み込み先によっては面要素の一部として扱われるおそれがあります。利用するアップロード先の仕様が明確でない場合は、構文行と説明を分けておく方が互換性を保ちやすくなります。

修正後は、各面の要素構成が意図どおりかを確認します。頂点位置だけの面であれば、すべての要素が整数だけで構成されている必要があります。頂点位置とテクスチャ座標を使うなら、各頂点要素が頂点番号とテクスチャ座標番号を一つのスラッシュで区切る構成になっているかを見ます。

一つのOBJ内で複数の面記法が使われていても、面ごとの記法として成立する場合はあります。しかし、アップロード先の対応範囲が限定されていると、途中で形式が変わることがエラーにつながります。互換性を優先するなら、利用目的に必要な範囲で面記法を統一することが有効です。

確認4 ゼロ番号と負の番号の扱いが適切か

OBJの正の参照番号は1から始まります。0番は有効な頂点番号ではありません。ところが、データ変換に使う処理や別形式の内部管理では、最初の要素を0番として数える方式が使われることがあります。

内部番号をOBJ用に変換せず、そのまま出力すると、f 0 1 2のような面が生成されます。OBJでは0番の頂点を参照できないため、面番号エラーの原因になります。独自の変換工程や自動出力処理を使用した場合は、内部の番号をOBJの1始まりの番号へ変換しているかを確認します。

ただし、ファイル内に0が見つかったからといって、すべての番号へ単純に1を加えればよいとは限りません。0が番号開始位置の違いではなく、欠損値の代わりとして出力されている可能性があるためです。

最初の面から規則的に0 1 2、0 2 3のような番号が続いている場合は、0から始まる内部番号をそのまま出力した可能性があります。一方、数十万件の面のうち一部だけに0が現れる場合は、対応する頂点を見つけられなかった処理が0を仮の値として書き込んだ可能性があります。

前者であれば番号全体の変換を検討できますが、後者では問題の面を元データと照合する必要があります。欠損を示す0へ1を加えても、正しい頂点へ戻るわけではありません。

負の番号については、OBJの記法として使用できます。負の参照番号は、その面行までに定義された対応要素の末尾から相対的に参照します。たとえば、三つの頂点を記録した直後にf -3 -2 -1と書けば、直近の三頂点を参照する表現になります。

負の番号はOBJの構成として成立しますが、すべてのアップロード処理が同じ方法で対応するとは限りません。読み込み側が正の絶対番号だけを想定している場合、正しい相対参照であっても不正な面番号として扱われる可能性があります。

互換性を高めるには、負の番号を正の絶対番号へ変換する方法があります。ただし、変換には面行の位置が重要です。ファイル全体の最終的な頂点数だけを基準に変換してはいけません。面行より後ろに追加の頂点行がある場合、相対参照の基準が変わってしまうためです。

負の頂点位置番号は、その面行までに登場したv行数を基準に変換します。負のテクスチャ座標番号は、その時点までのvt行数を基準にします。負の法線番号は、その時点までのvn行数を基準にします。三種類の要素を同じ総数で計算しないよう注意が必要です。

たとえば、ある面行までに頂点位置が100個あり、-1が指定されている場合は、その時点の100番を参照します。-2なら99番です。しかし、同じ時点でテクスチャ座標が80個しかない場合、テクスチャ座標の-1は80番を指します。

ゼロと負の番号を確認するときは、-0や不要な正符号を含む表記も確認します。読み込み処理によって整数として解釈される可能性はありますが、互換性を考えると、正の絶対番号は1以上の通常の整数として記述する方が安全です。

修正後は、最小の正番号が1以上であること、最大番号が各要素の参照可能範囲内であることを再確認します。番号を置換したことで、新たな範囲外参照や重複参照が生じていないかも検査します。

確認5 面を構成する頂点数と並び順が適切か

OBJでは、三つの頂点で構成する三角形だけでなく、四つ以上の頂点を使った多角形も記録できます。f 1 2 3 4であれば、四つの頂点からなる面です。さらに多くの頂点番号を一行へ並べることもできます。

一方、アップロード先によっては三角形の面だけを前提としている場合があります。四角形や多角形の分割に対応していない処理では、各番号が有効範囲内であっても、面の形式が想定外としてエラーになる可能性があります。

多角形を三角形へ分割すれば対応できる場合がありますが、分割方法には注意が必要です。平面上の凸形状であれば、四角形1 2 3 4を1 2 3と1 3 4へ分ける方法が考えられます。しかし、凹形状の多角形や、四つの頂点が同一平面上にないねじれた形状では、単純な分割で正しい表面にならないことがあります。

分割方向によって、表面の凹凸、稜線、法線方向が変わることもあります。点群から生成した面は、細長い形状や局所的な凹凸を含みやすいため、番号を三つずつ分けるだけの処理では品質を保てない場合があります。

面に必要な頂点数が不足していないかも確認します。f 10 11のように二つの番号しかない行は、面として成立しません。二点で表される要素は線に相当しますが、f行として処理しようとするとエラーになる可能性があります。

三つの番号があっても、f 10 11 11のように同じ頂点を重複していれば、有効な三角形にはなりません。三点が異なっていても、三点が一直線上に並んでいる場合は面積がゼロの退化面となります。数値誤差を含む実データでは、面積が極端に小さい面も処理上の問題になることがあります。

退化面は、範囲検査だけでは見つけられません。すべての番号が頂点総数以下であっても、形状計算の段階で面を作れず、エラーになることがあります。頂点を統合した後や、座標値を丸めた後は、異なる番号の頂点が同じ位置になることもあります。

たとえば、細かい座標を大きく丸めた結果、三つの頂点のうち二つが同じ座標になると、番号は異なっていても形状としては退化します。面番号エラーの表示が出ていても、実際には番号そのものではなく、番号が示す座標関係に問題がある可能性があります。

頂点の並び順も確認が必要です。面の向きは、頂点を並べる方向によって決まります。隣り合う面で頂点順序が不統一になると、一部の面法線が反転し、片面表示の環境では面が欠けて見えたり、陰影が不自然になったりします。

頂点順序の反転は必ずしも面番号エラーを起こすわけではありませんが、番号修正後に形状が直っていないように見える原因になります。面を再生成した場合は、隣接面の向きがそろっているか、内外が反転していないかを確認します。

点群OBJを点として表示することだけが目的なら、多角形や退化面を修正するより、不要な面定義を取り除く方法が適している場合があります。しかし、面積、体積、断面、表面表示などに使う場合は、面を削除するだけでは目的を満たせません。

アップロード先が点群を扱うのか、メッシュを扱うのか、三角形以外の面を受け付けるのかを確認し、用途に合う構成へ整えます。面番号だけを範囲内に直しても、面の構成条件が合っていなければ、別の読み込みエラーや表示異常につながります。

確認6 OBJを結合・分割したときの番号補正が正しいか

複数のOBJを一つへまとめた後に面番号エラーが出た場合は、番号の補正不足を確認します。個別のOBJでは、それぞれのファイルで頂点番号が1から始まります。そのため、単純にテキストを後ろへ連結するだけでは、二つ目以降の面が正しい頂点を参照できません。

一つ目のOBJに頂点が10万個あり、二つ目のOBJの最初の面がf 1 2 3だったとします。二つのファイルを結合した後、二つ目のOBJの最初の頂点は全体の100001番になります。したがって、面はf 100001 100002 100003へ補正する必要があります。

この加算値をオフセットと考えます。二つ目のOBJには一つ目の頂点総数を加えます。三つ目のOBJには、一つ目と二つ目の頂点総数の合計を加えます。ファイルを追加するたびに、それまでに記録された頂点総数を基準として番号を補正します。

テクスチャ座標番号と法線番号も同じ考え方ですが、加える数は頂点総数ではありません。二つ目のテクスチャ座標番号には、一つ目のvt行数を加えます。二つ目の法線番号には、一つ目のvn行数を加えます。

頂点位置、テクスチャ座標、法線の数が同じとは限りません。すべての番号へ頂点総数を加えると、テクスチャ座標や法線だけが範囲外になる可能性があります。f 1/1/1の三つの1は同じ数字に見えますが、結合後に加える値はそれぞれ異なります。

単純連結で注意したいのは、番号が範囲内に収まるため、明確なエラーが出ない場合があることです。二つ目の面が一つ目の頂点を参照しても、番号自体は存在します。その結果、アップロードには成功しても、離れた形状同士が巨大な面で結ばれたり、二つ目の形状が崩れたりします。

したがって、結合後の確認では範囲外番号だけでなく、各面が本来所属する頂点群を参照しているかも調べます。ファイルごとの頂点番号範囲を記録し、二つ目の面が一つ目の頂点範囲へ戻っていないかを確認すると、誤接続を見つけやすくなります。

負の相対番号を含むOBJを結合する場合は、さらに注意が必要です。負の番号は面行がある位置までの要素数を基準にするため、ファイルの並び方や頂点行の配置によって解釈が変わります。

安全性を高めるには、各OBJを単独の状態で正の絶対番号へ変換し、その後で結合用オフセットを加える方法があります。これにより、元ファイル内の参照関係と、結合後の補正を分けて確認できます。

大容量OBJを複数ファイルへ分割するときも、逆方向の番号補正が必要です。元のファイルで100001番から始まっていた頂点群を別ファイルへ移した場合、分割先では1番から番号を振り直す必要があります。面定義も、新しい番号へ対応させます。

単にファイルの行数で前半と後半を分けると、後半の面が前半の頂点を参照したり、必要な頂点が別ファイルへ分離したりします。分割するときは、面とその面が参照する頂点を一組として扱います。複数の面で共有される頂点がある場合は、分割先ごとに必要な頂点を含め、対応する番号を再構成します。

結合や分割の後は、番号だけでなく座標範囲も確認します。異なる座標系、原点、軸方向、単位のOBJを結合すると、一方の形状だけが遠く離れたり、極端に大きくなったりすることがあります。これは面番号エラーとは別の問題ですが、アップロード後の表示異常として同時に発生しやすい項目です。

各ファイルについて、頂点数、面数、X座標の最小値と最大値、Y座標の最小値と最大値、Z座標の最小値と最大値、想定している長さの単位を記録しておくと、結合後の検証がしやすくなります。OBJ自体には長さの単位を固定する仕組みがないため、運用側で単位を明示しておくことが重要です。

点群として使うOBJに面情報は必要か

点群として頂点位置を閲覧し、座標を確認するだけであれば、OBJに面情報が必須ではない場合があります。頂点位置を示すv行だけを持つOBJを、点の集合として読み込める環境もあります。

面番号エラーの原因が壊れたf行にあり、アップロード先が頂点だけのOBJに対応しているなら、面定義を除去して再アップロードする方法が考えられます。点だけを使う用途では、不要な面情報を残さないことでファイル構造が単純になり、面参照の不整合を避けやすくなります。

ただし、面を削除すると、表面としてのつながりは失われます。面積や体積の計算、表面の陰影表示、断面生成、画像の貼り付け、面を利用した選択処理などができなくなる可能性があります。

点群を共有する目的と、メッシュを利用する目的を混同しないことが重要です。点の位置や付随情報を確認するためのファイルと、表面形状を計測するためのファイルを分けて管理すれば、不要な面を無理に維持する必要がなくなります。

壊れた面だけを削除し、正常な面を残す方法もあります。範囲外番号を参照する面、同じ頂点を重複して参照する面、面積がほぼゼロの面だけを除外すれば、ほかの表面を維持できる可能性があります。

しかし、一部の面を削除すると、表面に穴ができます。地形や構造物の表面を数量計算へ使う場合、その穴が結果へ影響することがあります。穴を自動補間すると、実際には存在しない面を作る可能性もあります。

欠損部分を補う場合は、周囲の点密度、対象物の形状、取得時の死角、必要な精度を確認します。単に穴を閉じることを目的とせず、その面が実際の表面を妥当に表しているかを判断する必要があります。

点群OBJをどの用途で使うかを先に整理すると、面番号エラーへの対応方法を選びやすくなります。点の座標を共有したいのか、表面を表示したいのか、距離や断面を確認したいのか、面積や体積を求めたいのかによって、必要な要素は異なります。

点だけでよい用途では、頂点以外の要素を減らすことで互換性を高められる場合があります。メッシュが必要な用途では、面番号を正しく再構成し、表裏、穴、重複、退化面まで確認する必要があります。

修正作業では、面を削除する前の原本を必ず残します。アップロードを成功させるために面を除去した後で、表面処理が必要になっても、元の接続関係を復元できないことがあるためです。原本、点群用、メッシュ用を別ファイルとして管理すると、後工程での混乱を防げます。

修正後の再アップロードで確認したい項目

OBJを修正した後は、アップロードが完了したという結果だけで正常と判断しないことが重要です。誤った面番号でも、存在する番号を参照していれば読み込みに成功することがあります。形状が正しく再現されているかまで確認する必要があります。

最初に、修正前後の頂点数、テクスチャ座標数、法線数、面数を比較します。壊れた面を10件削除したのであれば、面数が想定どおり10件減っているかを確認します。番号を振り直しただけであれば、頂点数や面数が意図せず変化していないかを見ます。

次に、形状全体の座標範囲を確認します。X、Y、Zの最小値と最大値が、修正前と大きく変わっていないかを調べます。番号修正だけを行ったつもりでも、頂点行を誤って削除したり、座標行を並べ替える過程で値を壊したりすることがあります。

表示確認では、形状全体を遠くから見るだけでなく、修正した面の周辺を拡大します。特に、データの外周、穴の周辺、鋭い稜線、構造物の角、複数ファイルの接合部、頂点を削除した範囲を重点的に確認します。

誤接続があると、離れた二点を結ぶ長い面が現れることがあります。全体表示では細い線のようにしか見えず、見落とす可能性があります。面の辺が極端に長い箇所を調べることも、誤った番号参照の発見に有効です。

表裏の確認も行います。一方向から見ると表示されるのに、反対側から見ると欠ける場合は、面の頂点順序や面法線の向きが反転している可能性があります。番号を再生成した工程で頂点順序が変わっていないかを確認します。

テクスチャ付きのOBJでは、画像の位置がずれていないかも見ます。頂点位置番号だけを正しく直しても、テクスチャ座標番号のオフセットや対応がずれていれば、画像が伸びたり、別の場所へ貼られたりします。法線番号が不正な場合は、表面の明暗が不自然になることがあります。

座標値の精度も確認します。テキスト編集や別形式への変換を経由すると、小数点以下の桁が減ることがあります。点群の位置精度を維持したい場合は、用途に必要な桁数を残し、修正前後で代表的な頂点座標を比較します。

大容量ファイルでは、すべてを一度に確認する前に、小さな検証用OBJを作る方法があります。問題のある面と、その面が参照する頂点を抜き出し、番号を1から振り直してアップロードします。

小さなファイルでも同じエラーが出る場合は、面記法、頂点数、退化面など、局所的な構造に原因がある可能性があります。小さなファイルでは読み込めるのに元ファイルでは失敗する場合は、ファイル容量、要素数、特定の後半行、結合処理などを確認します。

検証用ファイルを作るときは、面行だけを抜き出してはいけません。その面が参照するv、必要に応じてvtとvnも一緒に抜き出し、新しい番号へ対応させます。元の大きな番号を残したままでは、検証用ファイルでも範囲外参照が発生します。

アップロード先にファイル容量や処理可能な要素数の制限がある場合、面番号を修正した後で別のエラーが表示されることがあります。面番号エラーが解消した結果、次の検査段階へ進み、容量や処理時間の問題が表面化した可能性があります。

エラー内容が変わった場合は、修正が無意味だったと判断せず、現在どの段階まで処理が進んでいるかを整理します。構文検査、面生成、容量確認、表示変換など、処理段階によって原因が異なります。

正式なデータとして置き換える前に、可能であれば別の担当者や別の確認工程で検証します。修正した本人は、変更した場所に意識が集中し、ほかの異常を見落とすことがあります。修正記録と確認項目を共有し、同じ条件で再検査できるようにします。

面番号エラーを予防するデータ管理

面番号エラーは、アップロード直前にだけ確認するより、データ作成と編集の各段階で予防する方が効率的です。特に、頂点削除、頂点統合、間引き、面生成、ファイル結合、ファイル分割を行う工程では、番号の対応が変化します。

編集前のOBJは必ず複製し、原本を残します。ファイル名を上書きし続けると、どの工程で不整合が発生したかを確認できません。取得直後、不要点除去後、面生成後、軽量化後、アップロード用といった工程ごとに版を分けると、原因を追いやすくなります。

各版について、頂点数、面数、テクスチャ座標数、法線数を記録します。頂点削除を行ったのに面数がまったく変わっていない場合は、面の更新が行われていない可能性があります。面生成を行った後に頂点数だけが大きく変わっていれば、再配置や統合が行われた可能性があります。

処理内容も記録します。「不要点を削除した」という説明だけでなく、どの条件で何点を削除したか、面を再生成したか、頂点順序を変更したか、番号を振り直したかを残します。後から面番号エラーが出たとき、番号へ影響する工程を絞り込めます。

OBJを自動生成する場合は、出力後の検査を工程に組み込みます。最低限、頂点位置番号が1以上で参照時点の頂点数以下か、テクスチャ座標番号が対応範囲内か、法線番号が対応範囲内か、0番がないかを確認します。

さらに、面を構成する頂点が三つ以上あるか、同じ頂点番号が重複していないか、座標上で面積がほぼゼロになっていないかを確認すると、読み込み後の不具合を減らせます。

複数のOBJを結合する工程では、ファイルごとのオフセットを記録します。一つ目の頂点数、テクスチャ座標数、法線数を別々に集計し、二つ目の各番号へ対応する値を加えます。三つ目以降も累積値を管理します。

分割工程では、各分割先に必要な頂点と面の対応を作り、番号を1から振り直します。元ファイルの大きな番号をそのまま残さないようにします。分割後は各ファイルを単独で検査し、別ファイルの要素へ依存していないことを確認します。

アップロード前の確認用として、ファイル全体の先頭部分と末尾部分を見ることも有効です。番号ずれは末尾で範囲外として現れることが多いためです。先頭の面が0番から始まっていないか、末尾の面が参照可能な頂点数を超えていないかを確認します。

ただし、先頭と末尾だけで正常と判断してはいけません。途中の頂点を削除した場合、問題はファイル中央にも発生します。全件検査が可能な仕組みを用意し、目視は補助として使います。

ファイルの文字コードや改行方法を変換した場合も、再検査します。数字そのものが変わらなくても、行が途中で分断されたり、複数行が一行につながったりすると、面定義を正しく読めなくなります。大容量ファイルを扱える編集環境を使い、保存後に行数が意図せず変化していないかを確認します。

点群用とメッシュ用のファイルを分けることも予防策になります。点の座標を共有するだけのOBJへ、過去の壊れた面情報を残さなければ、面番号エラーの発生要因を減らせます。表面処理が必要な場合は、面付きの別ファイルを作り、目的に応じて管理します。

アップロード作業を繰り返す現場では、確認項目を標準化します。担当者ごとに修正方法が異なると、同じエラーが再発しやすくなります。頂点数の集計、番号範囲の検査、スラッシュ記法の確認、ゼロ番号の確認、退化面の検査、結合オフセットの確認を一連の作業として定めます。

まとめ

点群OBJアップロードで面番号エラーが出る主な原因は、面定義が存在しない頂点や属性番号を参照していることです。OBJでは、頂点位置、テクスチャ座標、法線がそれぞれ独立した番号で管理されます。面定義の各番号は、対応する要素の参照可能範囲内でなければなりません。

最初に確認したいのは、面が参照する頂点番号が1から参照時点の頂点数までの範囲に収まっているかです。一般的にすべての頂点を先に記述する構成では、ファイル内の頂点総数を上限として確認できます。テクスチャ座標や法線を含む面では、それぞれの番号も個別に確認します。

次に、頂点を削除、統合、間引き、並べ替えた後で、面番号が更新されているかを調べます。頂点行を一つ削除するだけでも、その後ろにある番号は変わります。範囲外になっていない面でも、別の頂点を参照している可能性があるため注意が必要です。

面定義のスラッシュ記法も重要です。頂点位置だけを使う形式、テクスチャ座標を使う形式、法線を使う形式が正しく記述されているかを確認します。不要な空白、過剰なスラッシュ、属性番号の欠落があると、読み込み側が面を解釈できない場合があります。

0番はOBJの参照番号として使えません。負の番号は相対参照として成立しますが、アップロード先が対応していないこともあります。互換性を優先する場合は、面行の位置を考慮して正の絶対番号へ変換します。

番号が範囲内でも、面を構成する頂点数が不足している、同じ頂点を重複している、面積がゼロに近い、多角形へ対応していないといった理由でエラーになることがあります。アップロード先が扱える面構成に合わせ、必要に応じて形状を確認しながら三角形化します。

複数OBJの結合では、頂点位置、テクスチャ座標、法線へ別々のオフセットを加えます。分割時は、各ファイル内で番号を1から振り直します。番号が範囲内でも別ファイルの頂点へ誤接続する場合があるため、形状の確認まで行う必要があります。

点として利用するだけなら、不要な面情報を除去する方法もあります。ただし、面積、体積、断面、表面表示などに使う場合は面が必要です。アップロードを成功させることだけを目的にせず、点群として使うのか、メッシュとして使うのかを明確にしたうえで修正します。

修正後は、頂点数と面数、座標範囲、表裏、テクスチャ、接合部、極端に長い面を確認します。読み込みに成功したことと、形状が正しいことは同じではありません。元ファイルを残し、変更内容と検査結果を記録することで、後工程への影響を抑えられます。

現場で取得した三次元データを円滑に活用するには、取得から書き出し、アップロード、共有までの各工程で、データ形式と利用目的をそろえることが大切です。LRTK Phoneを含む点群取得・共有環境を検討する場合も、利用する機能、出力されるOBJの構成、アップロード先の対応要素を事前に確認し、点群用とメッシュ用のデータを目的に応じて管理することが重要です。

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

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