LRTKレフィクシア株式会社

点群OBJの座標にNaN・Infが混じる原因4選と除去手順

点群OBJに混じるNaN・Infとは

点群OBJをアップロードしたときに、読み込みが途中で止まる、頂点数がゼロと表示される、点群が画面に見えない、モデル全体が極端に小さく表示されるといった問題が起きることがあります。その原因の一つが、頂点座標に含まれるNaNやInfです。

OBJでは、頂点座標が一般に v X Y Z という形式で記述されます。たとえば、v 123.456 789.012 15.300 であれば、X、Y、Zの各軸に有限の数値が入っているため、3次元空間上の位置を計算できます。一方、v NaN 789.012 15.300 や v 123.456 Inf 15.300 のような行は、頂点の位置を正常に決定できません。

NaNは「Not a Number」を略した表記で、数値として定義できない計算結果を示します。単に文字が誤入力された状態だけを指すものではありません。ゼロをゼロで割った場合、空のデータから平均値を求めた場合、長さがゼロのベクトルを正規化した場合などにも生成されます。

Infは無限大に相当する値です。負方向の無限大は、-Inf や -Infinity のように出力される場合があります。実際の測量や点群計測で、座標が無限大になることはありません。そのため、Infが含まれている場合は、計測値そのものではなく、計算、変換、結合、書き出しのいずれかで異常が発生していると考えられます。

表記は処理環境によって異なります。NaNは nan、NaN、NAN、Infは inf、Inf、INF、Infinity などとして記録されることがあります。大文字と小文字を区別する検索だけでは見落とす可能性があるため、点群OBJアップロード前の検査では複数の表記を想定する必要があります。

また、OBJファイル内にNaNやInfという文字列が存在しなくても安心はできません。座標欄に空文字、数値へ変換できない記号、壊れた指数表記などがあると、読み込み側が内部的にNaNとして扱う場合があります。したがって、文字列検索と数値としての妥当性検査を組み合わせることが重要です。

NaN・Infが点群OBJアップロードを妨げる理由

NaNやInfを含むOBJがどのような挙動を示すかは、アップロード先の読み込み処理によって異なります。ファイル選択直後にエラーが表示される場合もあれば、アップロードまでは完了し、その後の変換や表示処理で失敗する場合もあります。

点群を表示する処理では、全頂点の最小座標と最大座標を求め、データ全体が収まる表示範囲を計算することがあります。この計算にNaNが入ると、最小値や最大値を正常に比較できなくなる可能性があります。その結果、点群の中心位置、外接範囲、初期表示倍率などを決められず、何も表示されない状態につながります。

Infが含まれている場合は、表示範囲が異常に広がる可能性があります。正常な点が数十メートル程度の範囲に存在していても、一点だけ非常に大きな値や無限大相当の値を持つと、正常な点群が画面上で極端に小さくなります。利用者から見ると、点群が消えたように感じられることがあります。

点群から重心、密度、距離、法線、境界などを計算する処理でも、NaNやInfは問題になります。一つの異常点が計算に含まれることで、周辺点の結果までNaNになることがあります。異常値が連鎖するため、元のOBJでは数行だけの問題だったものが、変換後には多数の頂点や面へ影響する場合があります。

面を含むOBJでは、問題がさらに複雑です。異常な頂点を参照する面について、面積、法線方向、交差、表示位置などを正常に求められません。読み込み処理が異常面を自動的に無視する場合もありますが、どの環境でも同じ結果になるとは限りません。

点だけで構成されたOBJでも、頂点の順番や件数を使って別データと対応付けている場合があります。異常点が削除された結果、写真、時刻、分類、色などの属性との対応がずれる可能性があります。単純にアップロードできる状態へ直すだけでなく、関連情報との整合性も確認しなければなりません。

NaNやInfを含むOBJは、ある端末では開けても、別の処理環境では読み込めないという不安定な状態になりがちです。共有後のトラブルを避けるには、読み込み側が補正してくれることを期待せず、アップロード前に有限の数値だけで構成されたデータへ整える必要があります。

原因1:計測不能点や欠損値が座標へ変換されている

NaNやInfが発生する一つ目の原因は、計測できなかった点や無効な距離値を、そのまま3次元座標へ変換していることです。

点群計測では、すべての位置で必ず有効な距離が取得できるわけではありません。対象物が遠すぎる場合、反射しにくい表面である場合、急な角度で観測した場合、ほかの物体に遮られた場合、計測中に対象や端末が大きく動いた場合などには、距離値が欠損することがあります。

正常な処理では、有効な距離を取得できなかった点を除外してから座標を作成します。しかし、無効点の判定が不足していると、欠損値を含んだままX、Y、Zの計算が行われます。元の距離が未定義であれば、計算後の座標にもNaNが残ります。

奥行きの値を使って画像上の位置から3次元座標を求める処理では、分母がゼロになることがあります。たとえば、尺度や奥行きに相当する値で別の数値を割る式を使用している場合、その値がゼロならInfが生成される可能性があります。ゼロ同士の演算になればNaNになることもあります。

複数の計測値を平均化する処理でも注意が必要です。有効な計測値が一つもない状態で平均を求めると、合計値を件数ゼロで割ることになります。点の位置だけでなく、色、法線、信頼度などの平均計算でも同じ問題が起こります。

周辺点から法線方向を求める際にもNaNが発生します。同じ位置に重なった点だけを使って方向ベクトルを作ると、長さがゼロのベクトルになることがあります。そのベクトルを長さで割って正規化すると、結果がNaNになります。その後、法線を使って座標を補正する処理があれば、頂点座標にも異常値が広がります。

計測由来の問題かを見分けるには、異常点の出現位置を調べます。ファイル内の連続した範囲にNaNが集中している場合は、特定の計測区間で距離を取得できなかった可能性があります。一定間隔で発生している場合は、画像の行、列、走査単位などに対応した処理に問題があるかもしれません。

異常点が少数であり、その周囲の点群が十分に残っている場合は、該当点を除去して利用できる可能性があります。一方、広い範囲がNaNになっている場合は、単純な削除だけでは点群に大きな欠損が残ります。その場合は、計測距離、移動速度、死角、対象表面の状態などを確認し、元データの再生成や再計測を検討する必要があります。

原因2:座標変換や数値計算で異常値が発生している

二つ目の原因は、取得済みの点群へ座標変換や補正を加える過程で、NaNやInfが生成されることです。計測直後の座標が正常でも、変換後のOBJにだけ異常値が含まれる場合があります。

点群には、原点移動、回転、縮尺変更、単位変換、標高補正、基準点への位置合わせなど、複数の計算が行われます。変換に必要な値が不足していたり、想定と異なる単位が入力されたりすると、計算結果が不安定になります。

たとえば、2点から方向を求める処理で、同じ座標の点を二つ選んでいると、方向ベクトルの長さはゼロになります。このベクトルを正規化しようとすると、ゼロ除算によってNaNが生じます。その方向を使って回転行列を作れば、多数の頂点にNaNが広がる可能性があります。

基準点を使った変換でも、点の配置に偏りがあると計算が成立しない場合があります。すべての基準点がほぼ同一直線上に並んでいたり、必要な点数を満たしていなかったりすると、安定した変換量を求められません。処理が異常を明示せずに続行すると、変換結果へNaNが出力されることがあります。

単位変換の重複も原因になります。メートルからミリメートルへの変換を複数回適用すると、座標値が想定以上に大きくなります。さらに大きな倍率や指数演算が重なると、処理環境で扱える数値範囲を超え、Infになる可能性があります。

科学表記の解釈にも注意が必要です。1.23e+05 のような値は有限の数値ですが、指数部を誤って処理すると、まったく異なる桁の値になることがあります。変換後の極端な座標を使って追加計算を行った結果、Infへ到達する場合があります。

座標変換が原因かを確認するには、工程ごとにデータを保存して比較します。計測直後、不要点除去後、原点移動後、回転後、縮尺変更後、座標系変換後、OBJ書き出し後というように段階を分け、各段階でNaNとInfの有無を検査します。

変換前には異常がなく、特定の処理後にだけNaNやInfが現れるのであれば、その工程の入力値、分母、行列、単位、基準点を重点的に確認できます。すべての処理を一度に実行して最終OBJだけを見るより、原因をはるかに絞り込みやすくなります。

大きな現地座標を扱う場合は、NaN・Infと数値精度の問題を分けて考えることも大切です。座標値が大きいと小数部分の表示精度が低下する場合がありますが、大きな有限値であるだけならNaNではありません。異常値の除去と、座標原点や精度の調整は別々に検討します。

原因3:点群の結合や列変換で欠損値が混入している

三つ目の原因は、複数の点群を結合したり、表形式のデータからOBJへ変換したりする際に、欠損値が座標列へ混入することです。

点群データには、X、Y、Zの座標以外にも、色、強度、分類、時刻、法線などが含まれることがあります。異なる構成のファイルを結合すると、列数や並び順が一致しない場合があります。結合処理が不足する値をNaNで補完すると、そのままOBJの座標へ出力される可能性があります。

たとえば、一方のファイルにはX、Y、Zがそろっている一方、もう一方ではZが空欄になっているとします。この二つを単純に結合し、空欄を欠損値として扱う処理を行うと、v 125.0 430.0 NaN のような行が生成されることがあります。

列の指定ミスも起こりやすい問題です。X、Y、Zの順で並んでいると想定していたデータが、実際には点番号、X、Y、Zの順だった場合、列を一つずつ取り違える可能性があります。点番号は数値なので読み込みに成功してしまい、末尾の不足した列だけがNaNになることもあります。

区切り文字の違いにも注意が必要です。空白区切り、タブ区切り、カンマ区切りなどが混在していると、行ごとの列数が変わることがあります。連続した区切り文字を空欄として扱う処理では、途中の座標が欠損値になります。

小数点として使う記号と列区切りが衝突している場合もあります。変換処理が数値を正しく認識できないと、該当項目をNaNとして扱うことがあります。ファイルの一部だけ異なる形式になっていると、先頭付近は正常でも途中から異常値が増えるという状態になります。

複数の点群を位置合わせして結合する場合は、対応点の不足も問題になります。位置合わせに使う点が少なすぎたり、誤った点を対応付けたりすると、変換量を正常に計算できないことがあります。その結果、片方の点群全体がNaNになる場合があります。

結合時のトラブルを防ぐには、各ファイルを個別に検査してから統合します。頂点数、列数、座標の最小値と最大値、単位、基準位置、欠損数を確認し、すべてのデータを同じ構造へそろえます。

結合後には、頂点数が想定どおり増えているかだけでなく、座標範囲も確認します。NaNやInfがなくても、異なる単位や座標基準の点群が遠く離れて配置されることがあります。有限値検査と座標範囲検査を同時に行うことで、点群OBJアップロード後の表示トラブルを減らせます。

原因4:OBJの書き出しや編集で座標行が壊れている

四つ目の原因は、OBJへの書き出し処理や、その後のテキスト編集によって座標行が壊れることです。

OBJは文字列で構成されるため、内容を直接確認しやすい形式です。しかし、文字置換、改行変換、ファイル結合、分割、再保存などによって構文が変化する可能性があります。

書き出し処理が内部の欠損値を検査せず、そのまま文字列へ変換した場合、NaNやInfがOBJへ記録されます。内部処理では欠損値として保持できても、OBJの頂点座標としては利用できません。書き出し直前に有限値を判定しない設計では、異常値がそのまま外部ファイルへ流出します。

非常に大きなOBJを複数に分割し、後から連結した場合は、改行の不足に注意が必要です。前のファイルの最終行と、次のファイルの先頭行がつながると、v 1.0 2.0 3.0v 4.0 5.0 6.0 のような不正な行になります。NaNやInfの文字列がなくても、読み込み側が数値変換に失敗します。

指数表記を通常の小数へ変換する処理でも、値が壊れることがあります。指数部の符号を削除したり、桁を途中で切ったりすると、想定と異なる値になります。その後の再変換や計算によってInfが発生する可能性があります。

全角空白や制御文字の混入も見落とされやすい問題です。見た目には空白でも、一般的な半角空白とは異なる文字が座標間に入っていると、読み込み処理が列を分割できない場合があります。座標の途中に改行が入った場合も同様です。

ファイル末尾が途中で切れている場合は、保存処理や転送が完了していない可能性があります。最後の頂点行が不完全であったり、面定義の途中で終了していたりすると、読み込みエラーにつながります。

書き出し工程が原因かを確認するには、各段階のファイルを比較します。元データからOBJへ変換した直後、圧縮前、圧縮後、転送後、アップロード直前のファイルを分けて保存し、頂点数や異常行数を比べます。

変換直後は正常なのに、転送後のファイルだけ壊れている場合は、書き出し元ではなくファイル操作の工程に原因があります。反対に、最初のOBJからNaNが含まれている場合は、書き出し前の数値検査を見直す必要があります。

除去前に確認する点群OBJの構成

NaNやInfを見つけても、すぐに該当行を削除してはいけません。OBJ内の頂点が、面や線から参照されている可能性があるためです。

まず、必ず元ファイルを複製し、原本を変更しない状態で作業します。異常値を削除した後に参照関係が壊れた場合、元の頂点番号を確認できるファイルが必要になります。

次に、OBJが点だけで構成されているか、面を含むかを調べます。行頭が v の行は頂点座標です。行頭が f の行は面を表します。行頭が l の行は線、p の行は点要素を表す場合があります。

頂点行だけが並び、面や線から番号参照されていないOBJであれば、異常な頂点行の削除は比較的単純です。一方、面を含むOBJでは、頂点を一つ削除すると、それ以降の頂点番号が変わります。面行を更新しなければ、別の頂点を参照したり、存在しない番号を参照したりします。

OBJには、頂点座標以外にテクスチャ座標や法線が記録されることがあります。面行では、頂点番号だけでなく、複数の参照番号が斜線で区切られる場合があります。修正時には、どの番号が頂点を示しているのかを正しく識別しなければなりません。

点群OBJであっても、頂点行に色などの追加値が含まれている場合があります。X、Y、Zの後ろに追加の数値が並んでいるとき、異常値除去のために行を単純な4項目へ書き直すと、色や属性を失う可能性があります。正常な行はできるだけ原文の構造を維持することが安全です。

異常値の総数も確認します。数点だけであれば除去による影響は限定的かもしれません。しかし、数万点単位でNaNが含まれている場合は、除去後の欠損が大きくなります。その場合は、元工程を修正してOBJを再生成した方が適切です。

さらに、NaNとInf以外の異常値も調べます。極端に大きな有限値、想定範囲から離れた点、座標がすべてゼロの大量の点などが残っている可能性があります。有限であることと、現場の座標として妥当であることは別の条件です。

除去手順1:NaN・Infを含む行を検索する

最初に、OBJファイル内でNaNとInfに相当する文字列を検索します。大文字と小文字を区別せず、nan、inf、infinity を確認します。負の符号が付いている場合もあるため、-inf や -infinity も対象にします。

検索結果が見つかったら、その行の種類を確認します。頂点座標を示す v 行にあるのか、法線を示す行にあるのか、別の属性行にあるのかによって影響が変わります。

異常行の前後も確認します。一行だけ孤立している場合、特定の点で計算に失敗した可能性があります。多数の行が連続している場合は、計測不能区間や一括変換処理の異常が考えられます。一定間隔で発生している場合は、データの行や列を単位とした処理に原因があるかもしれません。

次に、NaNやInfという文字を含まない不正な頂点行を探します。頂点行を数値として解析し、X、Y、Zの三つがすべて読み取れるかを確認します。値が不足している行、余計な文字が入っている行、指数表記が途中で切れている行などは、文字列検索だけでは見つけられません。

たとえば、v 10.0 20.0 はZ座標が不足しています。v 10.0 abc 30.0 はY座標を数値として解釈できません。v 10.0 20.0 1.2e+ は指数部が不完全です。いずれも正常な頂点として扱うことはできません。

頂点行の列数が一定かどうかも確認します。色などの追加情報がある場合は、正常行の列数を基準として、途中だけ項目数が変わっていないかを調べます。

異常行を見つけたら、元ファイル内での行番号と、頂点として何番目に当たるかを記録します。面や線の参照関係を修正する際には、ファイル全体の行番号ではなく、頂点番号が必要です。

除去手順2:異常頂点と参照番号を特定する

OBJの頂点番号は、頂点行が現れた順番で決まります。ファイルの20行目にある頂点が、20番頂点とは限りません。途中にコメント、グループ、材質、その他の定義が入っていれば、行番号と頂点番号は異なります。

異常な頂点行を見つけたら、先頭から数えて何番目の v 行であるかを確認します。これが、面や線から参照される頂点番号です。

次に、その頂点番号が f 行、l 行、p 行などから参照されているかを調べます。ただし、単純な文字列検索だけでは誤判定が発生します。頂点番号12を探すときに、112や120まで一致してしまうためです。

面行では、頂点番号が 12 のように単独で書かれる場合だけでなく、12/5 や 12/5/8 のようにほかの番号と組み合わされることがあります。頂点番号部分を解析し、完全一致で参照を確認する必要があります。

負の番号が使われるOBJもあります。負の参照番号は、その位置より前に定義された頂点を後ろから数える形式です。途中の頂点を削除すると参照先の解釈が変わる可能性があるため、負の番号を含むファイルは特に慎重に扱います。

異常頂点が面や線から参照されていない場合は、頂点行だけを除去できる可能性があります。参照されている場合は、該当する面や線を除外するか、妥当な頂点で再構成する必要があります。

元の形状が不明な状態で、異常頂点を近くの点へ自動的に置き換えるのは危険です。地形の段差、構造物の角、穴、境界などが変形する可能性があります。確実な復元根拠がなければ、異常頂点を含む要素は除去対象として扱う方が安全です。

除去手順3:点だけのOBJから異常頂点を除外する

面や線の参照を持たない点群OBJでは、異常な頂点行を除外し、正常な頂点だけを新しいファイルへ書き出します。

処理では、各頂点行のX、Y、Zを数値へ変換し、三つの値がすべて有限であることを確認します。NaN、正のInf、負のInf、数値へ変換できない文字列を含む行は出力しません。

正常な頂点行は、必要以上に書き換えないことが大切です。座標の桁数を短くしたり、追加属性を削除したりすると、NaN・Infの除去とは別の変更が加わります。異常な行だけを除外し、正常な行は元の文字列を維持する方法が適しています。

コメントやグループ情報など、頂点以外の行を残すかどうかも判断します。点だけを表示する目的で不要な行もありますが、データの由来や区分を示す情報が含まれている場合があります。アップロード先が対応している構文を確認し、不要な変更を避けます。

p 行で点番号を指定しているOBJでは、頂点行を削除すると点番号の更新が必要です。頂点だけが並び、すべての頂点を暗黙的に点として扱うOBJとは異なるため、ファイル構造を確認してから処理します。

除去後には、元の頂点数、削除した頂点数、残った頂点数を記録します。元が100万点で異常点が10点なら、修正後は99万9990点になることが期待されます。実際の件数と一致しなければ、正常な行まで削除した可能性があります。

異常点の割合が高い場合は、修正ファイルをそのまま実務に使わない方が安全です。点群の広い範囲が失われていれば、距離、面積、体積、断面などの結果に影響します。除去率だけでなく、削除された位置の分布も確認します。

除去手順4:面を含むOBJの参照関係を修正する

面を含むOBJでは、異常な頂点行を削除するだけでは不十分です。異常頂点を参照する面を除外し、残った頂点へ新しい番号を割り当て、すべての参照番号を書き換える必要があります。

まず、元の頂点番号ごとに、有効か無効かを判定します。正常な頂点には、新しい連番を割り当てます。異常頂点には新しい番号を割り当てません。

たとえば、元の1番から5番までの頂点のうち、3番がNaNを含むとします。新しいファイルでは、元の1番が新しい1番、元の2番が新しい2番、元の4番が新しい3番、元の5番が新しい4番になります。

次に、各面が参照する頂点番号を確認します。一つでも無効な頂点を含む面は、そのまま出力できません。該当面を削除するか、形状を確認したうえで再構成します。

三角形の面から異常頂点を一つ取り除くと、残るのは二頂点だけです。これは面として成立しません。多角形でも、削除後に三頂点未満になる場合は除外します。

有効な頂点だけを参照している面については、元の番号を新しい番号へ置き換えます。頂点番号以外にテクスチャ座標番号や法線番号が含まれている場合は、頂点番号部分だけを更新します。

参照番号の更新漏れがあると、存在しない頂点を参照する面ができます。また、番号が偶然存在していると、本来とは別の頂点を参照してしまいます。その場合、読み込みエラーにはならず、遠くへ伸びる面や交差した形状として表示される可能性があります。

線や点要素の参照も同様に更新します。面だけを検査して、線要素に古い頂点番号が残ると、アップロード後の表示や変換に影響する場合があります。

処理後は、すべての正の頂点参照番号が1以上、修正後の頂点数以下であることを確認します。ゼロは有効な頂点番号として扱いません。

負の番号が含まれている場合は、可能であれば元の参照先を絶対番号として解釈し、新しい正の番号へ変換します。途中削除後も負の参照を維持しようとすると、参照位置の計算が複雑になり、更新漏れが起きやすくなります。

除去手順5:修正後の座標範囲と構文を検査する

NaNやInfを取り除いたら、再度ファイル全体を検査します。異常文字列が消えたことだけでなく、すべての頂点座標が有限値として解析できることを確認します。

まず、NaN、Inf、Infinityに相当する表記を再検索します。大文字と小文字の違い、負の符号付き表記も対象にします。

次に、すべての頂点行についてX、Y、Zを数値として読み取れるか確認します。列不足、不完全な指数表記、不要な文字、改行の連結などが残っていないかを調べます。

座標の最小値と最大値も計算します。NaNやInfを除去できても、極端に大きな有限値が残っている場合があります。たとえば、ほとんどの点がX座標100から200の範囲にあるのに、一点だけX座標が非常に離れていれば、表示範囲が広がります。

点群の中心座標と各軸の幅も確認します。修正前と比較して、想定外の変化がないことを確かめます。異常値を少数削除しただけなら、正常点群の範囲は大きく変わらないことが一般的です。

面を含む場合は、頂点参照番号が有効範囲内にあるかを確認します。同じ頂点を重複して参照する面、頂点数が不足した面、面積がほぼゼロの面なども検査します。

法線やテクスチャ座標を含む場合は、それらの値にもNaNやInfが残っていないか確認します。頂点座標が正常でも、法線がNaNであれば、表示や変換処理が不安定になる可能性があります。

修正前後の件数も比較します。頂点数、面数、線数などが、意図した分だけ減っているかを確認します。想定以上に減っている場合は、検索条件や除外処理が広すぎた可能性があります。

除去手順6:小規模データで再アップロードする

修正後のOBJは、最初から本番用の大容量データとして扱わず、小規模な検証データでアップロードを試します。

異常値が存在していた周辺の点だけを切り出せる場合は、その範囲を使います。難しい場合は、全体から一部の頂点や面を抽出し、同じ構文で小さなOBJを作成します。

小規模データを使うと、アップロード、変換、表示に必要な時間を抑えられます。問題が再発した場合も、ファイル構造を確認しやすくなります。

アップロード後は、完了表示だけで判断せず、認識された頂点数や面数を確認します。修正ファイルに記録された件数と、アップロード後の件数が大きく異なる場合は、別の構文問題が残っている可能性があります。

全体表示を行い、点群が想定位置に現れるかを確認します。極端に小さく表示される場合は、離れ点や大きな座標が残っているかもしれません。逆に、点群が極端に拡大される場合は、単位や縮尺の設定を見直します。

異常値があった周辺では、不自然な穴、線状に伸びる点、原点へ集まる点、遠方へ飛ぶ面がないかを確認します。

小規模データで正常に読み込めたら、同じ処理を全体データへ適用します。全体データでも、頂点数、面数、座標範囲、表示位置を再確認します。

アップロード前後のファイルを別名で保存しておくと、問題が再発した際に比較できます。元データ、異常値除去後、小規模検証用、全体アップロード用を区別して管理することが重要です。

NaN・Infをゼロに置換してはいけない理由

NaNやInfを検索し、すべてを 0 に置き換えれば読み込めると考えることがあります。しかし、単純なゼロ置換は原則として避けるべきです。

v NaN 120.0 35.0 のNaNをゼロへ置換すると、v 0 120.0 35.0 になります。構文上は有限の座標ですが、その点がX座標ゼロに存在する根拠はありません。

複数の異常点をゼロへ置換すると、座標軸上や原点付近に点が集中します。点群全体とは関係のない線や面が形成され、外接範囲、密度、重心、距離などの計算に影響する可能性があります。

X、Y、ZのすべてがNaNであり、すべてをゼロにした場合は、原点に大量の点が重なります。見た目では目立たなくても、点数集計や密度計算には含まれます。

面を含むOBJでは、ゼロ置換した頂点と正常な頂点を結ぶ巨大な面が生成される場合があります。点群の中心から原点まで細長い三角形が伸び、表示範囲が大きく変化することがあります。

Infを大きな有限値へ置き換える方法も適切ではありません。読み込みエラーを避けられる可能性はありますが、点が遠方へ配置されるため、正常な点群が見えにくくなります。

周辺点から座標を補間する方法は、条件を満たせば利用できる場合があります。ただし、近傍点が同じ地形や面を表していること、欠損範囲が小さいこと、必要な精度を満たすことを確認しなければなりません。

構造物の角、地形の段差、法肩、法尻、穴、境界などでは、周辺点の単純平均が本来の形状を表すとは限りません。正しい位置を復元できる根拠がなければ、異常点を除去し、必要に応じて元データから再生成する方が安全です。

大容量の点群OBJを安全に処理する方法

点群OBJは、数十万行から数千万行以上になることがあります。大容量ファイルを一般的なテキスト編集画面で開くと、動作が重くなり、保存中に内容が欠落する可能性があります。

大規模なOBJでは、ファイル全体を一度に読み込まず、先頭から一行ずつ処理する方法が適しています。各行を確認し、頂点行であればX、Y、Zを解析します。有限値であれば出力し、異常値であれば除外記録へ残します。

点だけのOBJであれば、正常行を新しいファイルへ順番に書き出すことで処理できます。記憶領域へ全頂点を保持する必要がないため、大容量ファイルでも安定しやすくなります。

面を含むOBJでは、二段階の処理が必要になる場合があります。一度目に頂点の有効性と新旧番号の対応を作成し、二度目に面や線の参照番号を書き換えます。

新旧番号の対応情報が非常に大きくなる場合は、処理環境の記憶容量に注意します。全頂点の座標を保持する必要はなくても、番号対応を管理する領域は必要です。

検査結果には、元の頂点数、正常頂点数、NaNを含む頂点数、Infを含む頂点数、数値変換できなかった頂点数、座標範囲外の候補数などを記録します。

異常の種類を分けて集計することで、原因を判断しやすくなります。NaNだけが多数ある場合は欠損値の処理、Infだけが多い場合はゼロ除算や数値範囲超過、不正文字列が多い場合は書き出しや編集工程を重点的に確認できます。

処理中に異常値を見つけても、すべてを自動削除するだけでは不十分です。どの行、どの頂点番号、どの座標軸で発生したかを記録しておくと、元データや計測工程との照合に役立ちます。

大容量ファイルの修正後は、ファイルサイズだけで成否を判断しません。数値の桁数や改行形式が変わるだけでも容量は変わります。頂点数、座標範囲、面数、参照番号を数値で比較することが重要です。

NaN・Infの再発を防ぐ運用

NaNやInfを一度除去しても、同じ変換や書き出し工程を使い続ければ再発する可能性があります。継続的な運用では、OBJ作成前に異常値を止める仕組みが必要です。

最も重要なのは、座標を書き出す直前に、X、Y、Zのすべてが有限値であるかを判定することです。一つでもNaNやInfであれば、その頂点を出力せず、除外件数を記録します。

無効点の件数だけでなく、全体に占める割合も確認します。100万点中の数点と、100万点中の数十万点では、同じ除去処理を適用しても意味が異なります。割合が高い場合は、計測や変換の失敗として扱う必要があります。

座標変換を複数段階で行う場合は、各工程の後に有限値検査を入れます。原点移動、回転、縮尺変更、座標変換、標高補正などを一つの処理としてまとめると、どこで異常が発生したか分かりにくくなります。

ゼロ除算を防ぐ判定も必要です。点数、距離、尺度、ベクトル長などを分母に使う前に、ゼロまたは極端に小さな値でないことを確認します。条件を満たさない場合は、その計算を行わず無効データとして扱います。

平均値を求める場合は、有効点数が一つ以上あることを確認します。法線を作る場合は、使用する点が同じ位置に重なっていないかを確認します。基準点変換では、必要な点数と配置条件を満たすことを確かめます。

複数データを結合する前には、列構成、単位、座標基準を統一します。空欄をNaNで補う処理がある場合は、座標列に適用されないようにします。

書き出し後には、自動検査を行います。NaN・Infの文字列検索、頂点行の数値変換、座標範囲、頂点数、面参照の有効性を確認します。検査に合格したファイルだけをアップロード対象にする運用が効果的です。

元データ、変換途中のデータ、完成したOBJを分けて保存することも大切です。問題が発生したときに、どの工程で異常値が混入したかを比較できます。

ファイル名には処理段階が分かる情報を含め、修正済みファイルで元データを上書きしないようにします。異常値除去によって点数が変わった場合は、削除数や処理内容を記録します。

点群OBJアップロード前の最終確認

NaNとInfを除去しても、点群OBJアップロードの準備が完了したとは限りません。ほかの構文や座標条件も確認する必要があります。

頂点行では、行頭の v とX、Y、Zが適切に分けられていることを確認します。全角空白、不要な記号、列不足、行の連結がないかを調べます。

座標の単位も確認します。メートル、センチメートル、ミリメートルなどの解釈が異なると、点群の大きさが想定と合いません。有限値だけで構成されていても、縮尺が大きく外れていれば正常に利用できません。

座標の基準位置も重要です。現地座標を保持するOBJは、表示原点から遠い場所に配置される場合があります。アップロード先の表示方式によっては、点群が見つけにくくなることがあります。

点群全体の最小座標、最大座標、中心座標、各軸の幅を記録しておくと、アップロード後の表示結果と比較できます。既知の基準点がある場合は、その座標も確認します。

面を含むOBJでは、頂点番号の範囲、各面の頂点数、重複参照、ゼロ面積の面などを確認します。異常頂点を除去した結果、穴や細長い面が発生していないかも確認します。

点だけのOBJでは、同一座標に大量の点が重なっていないか、原点へ点が集中していないか、遠方の離れ点がないかを確認します。

関連ファイルがある場合は、ファイル名、拡張子、参照関係、フォルダ構成を確認します。座標が正常でも、参照先が不足していると、表示結果が想定と異なる場合があります。

圧縮してアップロードする場合は、圧縮前と展開後のOBJが一致していることも確認します。展開後のファイルサイズや頂点数が変わっていないかを調べます。

アップロードには、まず小規模データを使います。読み込み完了後に、頂点数、座標範囲、表示位置、形状を確認し、問題がなければ全体データへ進みます。

修正後のファイルだけでなく、元ファイルと検査結果も保管します。異常値がどの程度存在し、何点を除去し、面を何枚削除したかを後から確認できるようにします。

まとめ

点群OBJの座標にNaNやInfが混じる主な原因は、計測不能点や欠損値を座標へ変換していること、座標変換や数値計算で異常値が発生していること、点群の結合や列変換で欠損値が混入していること、OBJの書き出しや編集で座標行が壊れていることの四つです。

NaNは数値として定義できない値であり、Infは無限大に相当する値です。どちらも実際の3次元位置を示す座標として利用できません。少数の異常点であっても、点群全体の表示範囲、重心、法線、面構成などへ影響する可能性があります。

除去するときは、まず元ファイルを複製し、OBJが点だけで構成されているのか、面や線の参照を含むのかを確認します。点だけのOBJであれば、有限でない頂点行を除外する方法が基本です。

面を含むOBJでは、異常頂点を参照する面を処理し、残った頂点へ新しい番号を割り当て、すべての参照番号を更新する必要があります。頂点行だけを削除すると、別の頂点を誤参照して形状が崩れる可能性があります。

NaNやInfをゼロへ一括置換する方法は避けます。根拠のない位置へ点を移動させることになり、原点への点集中や巨大な面の発生につながります。正しい座標を復元できない場合は、異常点を除去し、必要に応じて元データの再生成や再計測を行います。

修正後は、NaN・Infの再検索だけでなく、全頂点の数値変換、座標範囲、頂点数、面数、参照番号を確認します。最初に小規模なデータでアップロードし、表示位置や形状が正常であることを確かめてから全体データへ適用すると、原因を切り分けやすくなります。

再発を防ぐには、OBJを書き出す直前に有限値検査を行い、無効点の件数と割合を記録することが重要です。計測、変換、結合、書き出しの各段階で検査を行えば、異常値が混入した工程を早期に特定できます。

点群 OBJ アップロードを安定させるには、NaN・Infだけを見るのではなく、単位、座標基準、縮尺、離れ点、参照番号、関連ファイルまで含めて確認する必要があります。LRTK Phoneで取得した点群をOBJとして共有・活用する際にも、アップロード前の有限値検査と座標範囲確認を作業手順へ組み込むことで、読み込みエラーや表示不良を予防しやすくなります。

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

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