LRTKレフィクシア株式会社

点群OBJの負の頂点番号で読込エラーが出る4つの修正法

点群OBJで負の頂点番号が使われる仕組み

点群データから作成したOBJファイルをアップロードすると、「頂点番号が不正です」「負のインデックスを解釈できません」「面の参照先がありません」といった読込エラーが出ることがあります。このとき、OBJファイル内の面定義に「-1」「-2」「-3」のような負の頂点番号が含まれていることが原因になっている場合があります。 OBJは、三次元形状をテキストで記述できる形式です。頂点座標は一般に「v」で始まる行、テクスチャ座標は「vt」で始まる行、法線は「vn」で始まる行、面は「f」で始まる行に記録されます。点群をそのまま保存したOBJでは頂点行だけが並ぶこともありますが、点群からメッシュを生成した場合や、線・面付きのデータとして書き出した場合には、頂点番号を参照する要素が追加されます。 正の頂点番号は、ファイルの先頭から数えた位置を示します。たとえば「f 1 2 3」は、1番目、2番目、3番目の頂点を使って三角形を構成する指定です。これに対して負の頂点番号は、その行までに定義された要素を基準に、直前からさかのぼって参照します。「-1」は直前に定義された頂点、「-2」はその一つ前、「-3」はさらに一つ前を意味します。 たとえば、面定義の直前までに100個の頂点が記録されているとき、「f -3 -2 -1」は「f 98 99 100」と同じ頂点を参照します。負の番号は、頂点を追加しながら面を順次記述する処理では便利です。ファイル全体の最終頂点数を事前に確定しなくても、直近の頂点を使って面を作れるためです。 ただし、すべてのアップロード先や変換処理が負の番号を同じように解釈するとは限りません。OBJの基本的な記述として負の参照が用いられることはありますが、実装側が正の番号だけを前提としていたり、頂点番号とテクスチャ座標番号の混在に対応していなかったりすると、読込エラーにつながります。そのため、点群 OBJ アップロードの互換性を重視する場合は、負の番号を正の番号へ正しく変換し、面定義を単純化しておくことが有効です。

点群OBJアップロード時に読込エラーが起きる主な原因

負の頂点番号が含まれているだけで、必ずOBJが壊れているとは限りません。重要なのは、その番号がどの位置から何を参照しているかです。正しく記述された負の番号でも、アップロード先が未対応であればエラーになります。一方、負の番号の計算自体が間違っている場合は、対応している読込処理でも正しく復元できません。 最も多い原因は、面定義を書き出した処理と、読み込む処理の対応範囲が異なることです。書き出し側は負の相対番号を使用できても、アップロード側が正の絶対番号のみを受け付ける場合があります。この場合、形状の内容に問題がなくても、番号表現の違いだけで読込が停止します。 次に多いのが、頂点、テクスチャ座標、法線の番号を同じ基準で変換してしまう誤りです。OBJの面定義には「頂点番号/テクスチャ座標番号/法線番号」という形式があります。たとえば「f -3/-3/-1 -2/-2/-1 -1/-1/-1」のような行です。ここで、頂点の総数、テクスチャ座標の総数、法線の総数は通常一致しません。それぞれ別の記録数を基準に計算する必要があります。 また、面定義より前に存在する頂点数ではなく、ファイル末尾の最終頂点数を使って負の番号を変換すると、参照先がずれることがあります。負の番号は原則として、その行が現れた時点までに定義された要素を基準にします。ファイルの途中で頂点行と面行が交互に現れる構造では、最終総数を一律に使う変換は適切ではありません。 ほかにも、ゼロ番を含む面定義、存在しない番号への参照、区切り記号の欠落、全角記号の混入、行末の不要文字、途中で切れたファイル、文字コードや改行の扱いなどが原因になることがあります。エラーメッセージに「負の頂点番号」と表示されていても、実際にはその周辺行の構文不正が原因である場合もあります。したがって、番号だけを機械的に置換するのではなく、面定義全体を確認する必要があります。

修正前に確認しておきたいOBJファイルの構造

修正を始める前に、元ファイルを複製し、原本を変更しない状態で保存しておきます。OBJはテキスト形式なので編集しやすい一方、置換を誤ると大量の面定義が一度に壊れる可能性があります。元に戻せるように、作業用ファイルと原本を分けてください。 次に、ファイル内にどの種類の行が含まれているかを確認します。「v」だけで構成されている場合は、純粋な頂点群に近い構造です。この場合、負の頂点番号が原因と表示されるなら、「p」や「l」などの参照要素が含まれていないか、ファイル末尾に別の形状要素が付加されていないかを確認します。 「f」で始まる行がある場合は、点群から面が生成されたメッシュOBJです。エラーの対象になりやすいのは、この面定義です。面行には、頂点番号だけを並べる形式、頂点番号とテクスチャ座標番号を並べる形式、頂点番号と法線番号を並べる形式、三種類すべてを並べる形式があります。 代表的な記述は次のようになります。 f 1 2 3 f 1/1 2/2 3/3 f 1//1 2//1 3//1 f 1/1/1 2/2/1 3/3/1 二つの斜線が続く「1//1」は、テクスチャ座標を省略し、頂点番号と法線番号を指定する形です。この区切りを一つに減らしたり、空欄を別の番号で埋めたりすると、別の意味になるため注意が必要です。 修正前には、面行が三角形だけで構成されているか、四角形以上の多角形を含むかも確認します。「f 1 2 3」は三角形ですが、「f 1 2 3 4」は四角形です。多角形自体を扱える読込処理もありますが、点群 OBJ アップロード先によっては三角形のみを安定して処理できる場合があります。負の番号と多角形が同時に含まれていると、どちらが直接原因なのか分かりにくくなります。 さらに、頂点行と面行の並び順を確認します。すべての頂点が先に並び、その後に面が並ぶ構造であれば変換は比較的単純です。一方、オブジェクト単位やグループ単位で頂点と面が交互に記録されている場合は、各面行が現れた時点の頂点数を数えながら変換する必要があります。

修正法1 負の頂点番号を正の絶対番号へ変換する

最も直接的な修正法は、負の相対番号を正の絶対番号へ変換する方法です。アップロード先が正の番号のみを安定して扱える場合、この修正で読込できる可能性が高まります。 変換式は、面行が現れた時点までの頂点数をN、負の頂点番号をiとした場合、「N+i+1」です。iには負の値が入ります。たとえば、その時点までに100個の頂点があり、「-1」を変換するなら、100-1+1で100です。「-3」なら100-3+1で98です。 次のようなOBJがあるとします。 v 0.0 0.0 0.0 v 1.0 0.0 0.0 v 1.0 1.0 0.0 v 0.0 1.0 0.0 f -4 -3 -2 -1 面行の時点では頂点が4個あるため、「-4」は1、「-3」は2、「-2」は3、「-1」は4へ変換できます。修正後は次のようになります。 f 1 2 3 4 ここで重要なのは、ファイル全体の最終頂点数ではなく、対象行までに現れた頂点数を使うことです。すべての頂点が先に定義されているファイルでは両者が一致しますが、途中に新しい頂点が追加される構造では一致しません。 また、単純な文字列置換は避ける必要があります。たとえば「-1」を「100」に一括置換すると、「-10」や「-11」の一部まで書き換えてしまう可能性があります。座標値の負数まで置換する危険もあります。頂点座標には「v -12.345 6.789 0.123」のような負の座標が普通に含まれます。このマイナス記号は頂点番号ではなく座標値なので、変更してはいけません。 安全に変換するには、「f」「l」「p」など、番号参照を行う行だけを対象にします。そのうえで、空白で要素を分け、斜線で構成要素を分解し、負の番号だけを計算します。座標行、コメント行、材質指定行、グループ名などはそのまま保持します。 変換後は、参照番号が1以上であり、その時点までに定義された頂点数以下であることを確認します。OBJでは0番の頂点は使いません。計算結果が0以下になる場合は、元の負の番号が参照可能な範囲を超えています。たとえば頂点が3個しかない時点で「-4」が現れた場合、その面は有効な頂点を参照できません。この場合は番号変換では直せず、元の書き出し処理や面生成の状態を見直す必要があります。 大規模な点群OBJでは、面行が数十万行以上になることがあります。手作業での修正は現実的ではないため、変換処理を行う場合は、必ず作業用ファイルで実行し、変換件数、最小番号、最大番号、範囲外番号の件数を記録します。変換後にファイルサイズだけを見るのではなく、頂点数と面数が変わっていないことも確認してください。

修正法2 頂点・テクスチャ座標・法線の番号を個別に整える

負の番号を正に変換しても読込エラーが解消しない場合、面定義の各番号を同じ基準で処理していない可能性があります。OBJの「f」行では、斜線で区切られた各番号が別の配列を参照します。 たとえば、次の面定義を考えます。 f -3/-6/-2 -2/-5/-2 -1/-4/-1 最初の数値は頂点番号、二番目はテクスチャ座標番号、三番目は法線番号です。面行の時点までに、頂点が120個、テクスチャ座標が200個、法線が60個あるとします。この場合、最初の要素「-3/-6/-2」は、頂点118、テクスチャ座標195、法線59へ変換されます。すべてを頂点数120を基準に計算してはいけません。 頂点番号の変換には、その時点までの「v」行数を使います。テクスチャ座標番号の変換には「vt」行数、法線番号の変換には「vn」行数を使います。この三つを別々に数えることが重要です。 また、面定義には一部の情報が省略される場合があります。「f -3//-1 -2//-1 -1//-1」のように斜線が二つ続く形式では、中央のテクスチャ座標番号は存在しません。この空欄を0として処理したり、直前の番号で補ったりすると、構文が変わってしまいます。空欄は空欄のまま保持し、前後の番号だけを変換します。 逆に、「f -3/-3 -2/-2 -1/-1」のように法線番号がない形式では、二つ目の番号はテクスチャ座標です。斜線の数と位置から、どの情報が含まれているかを判定しなければなりません。 点群由来のOBJでは、テクスチャ座標や法線が不要な場合もあります。アップロード先が頂点と面だけを必要とし、元データにテクスチャを使用していないなら、不要な参照を整理することで互換性が上がる場合があります。ただし、番号だけを削除すると、画像との対応や陰影に必要な情報が失われることがあります。見た目を保持する必要がある場合は、むやみに削除せず、正しい番号へ変換してください。 法線が壊れていても形状自体は読み込める処理がありますが、陰影が不自然になったり、面が暗く見えたりすることがあります。テクスチャ座標が壊れている場合は、形状は表示されても画像がずれる可能性があります。したがって、読込成功だけを確認して修正完了とせず、形状、表裏、色や画像の対応まで確認することが大切です。 同じ面行の中で、正の番号と負の番号が混在していることもあります。形式上の解釈が可能でも、アップロード処理によっては混在を想定していないことがあります。互換性を優先するなら、面行内のすべての参照を正の番号へ統一します。その際も、頂点、テクスチャ座標、法線をそれぞれ独立して処理します。

修正法3 面定義を三角形化して互換性を高める

負の頂点番号を正の番号へ変換した後もエラーが続く場合は、四角形以上の面を三角形へ分割すると改善することがあります。点群から生成したメッシュでは、一つの面に多数の頂点が含まれることがあります。読込処理が多角形の分割に対応していない場合、番号が正しくても面構造の解釈に失敗します。 たとえば、次の四角形があります。 f 1 2 3 4 これを二つの三角形に分ける例は次のとおりです。 f 1 2 3 f 1 3 4 ただし、どの対角線で分割しても同じ形になるとは限りません。四つの頂点が同一平面上にあり、凸形状であれば比較的単純ですが、ねじれた四角形や凹形状では、分割方法によって表面形状や法線方向が変わります。自動的に先頭頂点を扇の中心にするだけでは、意図しない面ができる場合があります。 負の番号を含む四角形を修正する場合は、先に正の番号へ変換し、その後で三角形化すると確認しやすくなります。たとえば、頂点数が4の時点で「f -4 -3 -2 -1」があるなら、まず「f 1 2 3 4」へ変換し、次に「f 1 2 3」と「f 1 3 4」へ分割します。変換と三角形化を同時に行うと、どちらの処理で誤りが生じたか追いにくくなります。 テクスチャ座標や法線を含む場合は、頂点だけでなく各要素の組み合わせを保ったまま分割します。たとえば「1/10/5」という一組は、頂点1、テクスチャ座標10、法線5の組み合わせです。三角形化の際に頂点番号だけを並べ替え、テクスチャ座標や法線の順番を変えないままにすると、画像や陰影がずれます。 面の向きにも注意が必要です。OBJの面は、頂点が並ぶ順序によって表裏の向きが決まります。三角形化するときに一部の面だけ順序を逆にすると、その面だけ裏向きになります。アップロード後に穴が開いたように見える場合、実際には面が削除されたのではなく、裏面として表示されていない可能性があります。 三角形化は、負の頂点番号そのものを直す処理ではありません。しかし、負の番号を使う複雑な多角形では、番号変換後に別の互換性問題が表面化しやすいため、実務上は有効な修正法です。特に、アップロード先の対応仕様が明確でない場合は、正の頂点番号と三角形面に統一すると、処理系の違いを減らしやすくなります。 ただし、点だけを扱う用途では、そもそも面が不要な場合があります。点群として表示したいだけなら、メッシュ面を削除した頂点主体のデータにする選択肢もあります。ただし、アップロード先が点群OBJをどのように扱うかは確認が必要です。面を削除すると、表面モデルとしての表示や体積計算に使えなくなる可能性があります。用途に応じて、点群用とメッシュ用のファイルを分けて管理する方法が安全です。

修正法4 不正な面だけを切り分けて再構成する

大規模な点群OBJでは、ファイル全体ではなく、一部の面だけが壊れていることがあります。この場合、すべての面を削除したり、全番号を一括変換したりするより、不正な面を特定して切り分ける方法が適しています。 まず、各面行について、参照番号が有効範囲内にあるかを確認します。正の頂点番号なら1以上かつ、その時点までに定義された頂点数以下である必要があります。負の頂点番号なら、変換後の値が1以上になる必要があります。0は有効な頂点番号ではありません。 次に、一つの面の中で同じ頂点が重複していないかを確認します。たとえば「f 10 10 11」のように同じ頂点が二度使われると、面積が0に近い退化面になります。読込処理によっては警告だけで通過しますが、別の処理ではエラーになる場合があります。 さらに、一つの面に必要な頂点数があるかを確認します。一般的な面は少なくとも3点を必要とします。「f 10 11」のように2点しかない記述は面として成立しません。行の途中が欠落した場合や、区切り処理に失敗した場合に、このような不完全な面が生じます。 不正な面を見つけたら、いきなり削除するのではなく、元の行番号と原因を記録します。削除によってアップロードできるようになっても、その部分に穴が開く可能性があります。周辺の頂点関係から面を再構成できる場合は、正しい頂点順序で三角形を作り直します。再構成が難しい場合は、問題の範囲を別ファイルに分け、正常部分だけで読込試験を行います。 切り分けでは、オブジェクト名やグループ名の境界を利用できます。OBJには、形状のまとまりを表す行が含まれることがあります。これらの区切りごとにファイルを分けると、どの範囲でエラーが起きるかを特定しやすくなります。ただし、OBJの頂点番号はファイル全体で連続している場合があるため、単純に途中の行を別ファイルへコピーするだけでは、番号が一致しません。分割後のファイルでは、使用する頂点を抽出し、1から番号を振り直す必要があります。 二分探索のように、ファイルを前半と後半に分けて読み込み、エラーが出る側をさらに分ける方法も有効です。数十万面あるファイルでも、範囲を半分ずつ絞ることで、問題行を効率よく見つけられます。ただし、面行だけを分割すると参照する頂点が不足するため、各試験ファイルには必要な頂点定義を含めます。 不正面を削除した後は、頂点が孤立して残る場合があります。孤立頂点は必ずしもエラーではありませんが、ファイル容量を増やし、後工程の集計を分かりにくくします。必要に応じて未参照頂点を整理し、頂点番号を連番に振り直します。その際、テクスチャ座標や法線の対応も同時に更新します。 この修正法は、元データの一部だけが破損している場合に向いています。一方、ほぼすべての面で負の番号が使われ、アップロード先が負の番号に対応していないだけなら、修正法1の一括変換を優先したほうが効率的です。問題の範囲を見極めて、全体変換と部分修復を使い分けてください。

修正後の点群OBJをアップロード前に検証する手順

修正後は、すぐに本番環境へアップロードするのではなく、ファイル構造を段階的に検証します。まず、頂点行数、テクスチャ座標行数、法線行数、面行数を数えます。修正前後で意図しない増減がないかを確認します。三角形化を行った場合は面数が増えるため、その増加が分割数と一致しているかを見ます。 次に、すべての面参照を走査し、0番がないこと、正の番号が範囲を超えていないこと、負の番号が残っていないことを確認します。負の番号を許容する方針であっても、アップロード先との互換性確認が目的なら、正の番号へ統一した試験用ファイルを用意すると原因を比較しやすくなります。 テクスチャ座標と法線についても同様に、参照範囲を確認します。頂点番号だけが正常でも、テクスチャ座標番号が存在しない値を指していれば、読込処理が停止することがあります。法線番号の範囲外参照も確認します。 その後、軽量な検証用ファイルを作ります。元の大容量ファイルから、頂点と面の一部を正しい対応関係で抽出し、小さなOBJとして保存します。この小規模ファイルがアップロードできれば、基本構文は受け付けられていると考えられます。小規模ファイルでも失敗する場合は、行構造、区切り、文字コード、改行、未対応要素などを確認します。 小規模ファイルは成功し、全体ファイルだけが失敗する場合は、容量、面数、頂点数、処理時間、メモリ使用量、一部の破損行などが候補になります。エラーが負の頂点番号と表示されていても、実際には大規模処理の途中で解析が停止し、直前の面行が報告されている可能性があります。エラー行の周辺だけでなく、ファイル全体の規模も確認してください。 形状の検証では、外周、角部、段差、穴、薄い面などを重点的に見ます。面の順序が逆になっていないか、三角形化で意図しない対角線が入っていないか、座標が変わっていないかを確認します。点群から作ったメッシュでは、細い部分や急な段差で退化面が生じやすいため、アップロード後の見た目も重要です。 ファイル名や関連ファイルの扱いも確認します。OBJが材質情報や画像を参照する場合、関連ファイルとの名前対応が崩れると、形状は読めても外観が欠けます。負の番号修正とは別の問題ですが、再保存や再書き出しの際に関連付けが変わることがあります。形状のみ必要な場合でも、不要な参照行が残っていると読込処理に影響する可能性があるため、使用しない関連指定は整理します。 最後に、修正内容を記録します。変換日時、元ファイル名、頂点数、面数、負の番号の変換件数、削除または再構成した面数、三角形化の有無を残しておくと、後から品質を追跡できます。同じ現場で複数の点群OBJを扱う場合、変換条件を統一しやすくなります。

負の頂点番号を再発させない書き出し運用

読込エラーを毎回手修正するより、書き出し段階で互換性の高いOBJを作るほうが効率的です。書き出し機能に番号形式の設定がある場合は、正の絶対番号を選びます。設定がない場合は、書き出し後に自動検査と変換を行う工程を標準化します。 点群からメッシュを生成する工程では、頂点と面の出力順を一定にします。すべての頂点を先に出力し、その後に面を出力する構造は、検査や変換がしやすい形式です。頂点と面を交互に出力する必要がある場合は、面行が現れた時点の要素数を正確に管理します。 三角形化の条件も統一します。あるファイルは四角形、別のファイルは三角形という状態では、アップロード結果の違いを比較しにくくなります。アップロード先の対応範囲に合わせ、必要なら書き出し時点で三角形へ統一します。 テクスチャや法線を使用しない用途では、不要な情報を出力しないことも有効です。情報が多いほど品質が高いとは限りません。使用しない参照が壊れていると、形状自体は正常でも読込に失敗します。一方で、色や画像、陰影を必要とする用途では、参照を省略せず、対応関係を検証します。 ファイル出力後には、自動的に構造検査を行う流れを作ります。負の番号の有無、0番の有無、範囲外参照、面の頂点数、重複頂点を持つ面、未参照頂点、行の途中欠落などを確認します。検査結果が基準を満たしたファイルだけをアップロード対象にすると、現場でのやり直しを減らせます。 また、元の点群、メッシュ生成後のデータ、アップロード用OBJを別々に保存します。アップロード用に番号や面構造を変更しても、元データが残っていれば再処理できます。変換済みファイルだけを保管すると、後で別の用途に使う際に情報が不足する可能性があります。 複数人で作業する場合は、ファイル名だけで修正版を判断しない運用が必要です。変換条件や検証結果を記録し、どのファイルが正の番号へ統一済みか、三角形化済みか、関連ファイルを含むかを明確にします。同じ名称のOBJが複数の場所にあると、古い未修正版を誤ってアップロードする原因になります。

点群OBJの読込エラーでよくある誤解

よくある誤解の一つは、座標値のマイナスと頂点番号のマイナスを同じものとして扱うことです。座標が負になるのは正常です。原点より西側、南側、下側にある点は負の座標を持つことがあります。修正対象は、面や線などの参照要素に現れる負の番号です。「v」で始まる行の負の座標を正に変えると、形状の位置や向きが変わってしまいます。 二つ目の誤解は、負の番号をすべて絶対値にすればよいという考えです。「-1」を「1」、「-2」を「2」に変えるだけでは、参照先がまったく異なります。負の番号は後ろから数える相対参照なので、現在までの要素数を使って正しい番号を計算する必要があります。 三つ目は、ファイル末尾の総頂点数を使えば常に変換できるという考えです。すべての頂点が先頭に並ぶ構造なら問題になりにくいものの、途中で頂点が追加されるOBJでは誤変換になります。面行ごとに、その時点までの頂点数を使う必要があります。 四つ目は、頂点番号だけ直せば、斜線で区切られた残りの番号も自動的に正しくなるという考えです。テクスチャ座標と法線は別の行数を持ちます。三種類の番号を個別に変換しなければなりません。 五つ目は、アップロードできれば修正完了という考えです。番号変換や三角形化に誤りがあると、読込自体は成功しても、面がねじれたり、裏返ったり、画像がずれたりします。アップロード後の表示と、元データの形状を比較する必要があります。 六つ目は、点群OBJには面がないはずだという思い込みです。実務では、点群から作成したメッシュをOBJで受け渡す場合も「点群OBJ」と呼ばれることがあります。ファイル内に「f」行があれば、面付きのデータです。呼び方だけで構造を判断せず、実際の行内容を確認してください。 七つ目は、エラーメッセージに書かれた行だけを直せばよいという考えです。解析処理は、前の行の欠落や区切り不正によって、次の行で初めて異常を検出することがあります。報告された行の前後も確認し、頂点数の推移や構文を追う必要があります。

まとめ

点群OBJの負の頂点番号による読込エラーは、単純なマイナス記号の問題ではありません。負の番号は、面行が現れた時点までに定義された頂点を後ろから参照する相対番号です。アップロード先がこの表現に対応していない場合や、番号の参照範囲が壊れている場合にエラーが発生します。 第一の修正法は、負の頂点番号を正の絶対番号へ変換することです。変換では、対象行までの頂点数を基準にし、座標値の負数を変更しないことが重要です。第二の修正法は、頂点、テクスチャ座標、法線を別々の件数で計算し、斜線区切りを維持することです。第三の修正法は、正の番号へ変換したうえで、多角形を三角形へ分割して互換性を高めることです。第四の修正法は、範囲外参照や退化面などの不正な面を切り分け、必要に応じて再構成することです。 修正後は、頂点数、面数、参照範囲、面の向き、テクスチャ座標や法線の対応を確認し、小規模ファイルで試験してから全体をアップロードすると安全です。変換件数や削除面数を記録し、元データ、メッシュ生成後データ、アップロード用データを分けて保管すれば、再処理もしやすくなります。 点群 OBJ アップロードの失敗を減らすには、エラーが出てから一行ずつ直すだけでなく、書き出し時の番号形式、面構造、関連情報、検証手順を標準化することが大切です。現場で取得した三次元データを継続的に活用する場合は、取得から確認、共有、後工程での利用までを一つの流れとして整える必要があります。LRTK Phoneを活用した計測を起点に、取得したデータの整理と点群活用まで見据えた運用を構築すると、点群OBJの作成やアップロードに伴う確認作業を進めやすくなります。

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

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