LRTKレフィクシア株式会社

点群OBJにNaN座標が混ざる原因とアップロード前の5検査

点群OBJにNaN座標が混ざると何が起きるか

点群OBJをアップロードしたときに、読み込みが途中で停止する、処理完了と表示されない、点群がまったく見えない、一部の点だけが欠落するといった問題が起こることがあります。その原因の一つが、頂点座標に含まれるNaNです。 NaNは「数値ではない値」を表す特殊な状態です。通常の整数や小数とは異なり、三次元空間上の位置を確定するためには使用できません。たとえば、OBJ内にv 125.300 87.420 4.160と記録されていれば、三つの数値から頂点の位置を決められます。しかし、v NaN 87.420 4.160のように一つでもNaNが含まれていると、頂点の位置を正常に決定できません。 ゼロとNaNは意味が異なります。ゼロは有効な座標値であり、原点や座標軸上の位置を示せます。一方、NaNは座標がゼロであることを示すものではなく、計算結果や入力値が定義できないことを示します。そのため、NaNを見つけたときに単純にゼロへ置き換えると、本来存在しない点が原点付近へ作られるおそれがあります。 NaNを含むOBJをどのように扱うかは、アップロード先や読み込み処理の実装によって異なります。入力検査が厳しい環境では、NaNを一つ検出した時点でファイル全体が拒否されることがあります。別の環境では、NaNを含む頂点だけを無視し、残りの点を読み込む場合があります。また、最初の解析は通過しても、表示用データへの変換や空間分割の工程で処理が止まることもあります。 特に問題になりやすいのが、点群全体の表示範囲を計算する処理です。点群の最小座標と最大座標を求める途中でNaNが使われると、境界値まで正常に計算できなくなる場合があります。その結果、正常な頂点が何百万点あっても、点群全体が表示されない、視点が合わない、表示倍率が異常になるといった現象につながります。 OBJに面や線が含まれている場合は、影響がさらに複雑です。NaNを含む頂点が面定義から参照されていると、その面だけが欠落したり、関連する形状の生成が失敗したりする可能性があります。異常な頂点を削除しただけでは頂点番号がずれ、別の読み込みエラーを発生させることもあります。 点群OBJのアップロードでエラーが起きると、通信状態やファイル容量だけを疑いがちです。しかし、アップロード自体が完了していても、受信後の解析でNaNが見つかり、処理が停止している可能性があります。したがって、アップロード前には、ファイルの大きさや拡張子だけでなく、すべての頂点座標が有効な数値であることを確認する必要があります。

NaN座標が発生する主な原因

点群OBJにNaNが混ざる原因は、OBJ形式そのものよりも、OBJを作成する前の測定、計算、座標変換、データ統合などの工程にあることが一般的です。NaNが発生した後に削除するだけでは、同じ条件で再び異常なファイルが作られるため、発生源まで調べることが重要です。 代表的な原因は、欠損値を含むデータの変換です。測定できなかった点や、必要な座標が取得できなかった行が元データに含まれていると、変換処理によって空欄がNaNへ置き換えられることがあります。x、y、zのうち一つでも欠けていれば、その点の三次元位置は確定できません。 測定データでは、距離を取得できなかった点、反射条件が悪かった点、測定範囲外の点などが無効値として記録されることがあります。この無効値をOBJ出力前に除外しなければ、NaN座標として残る可能性があります。元データ上では特定の記号や空欄になっていても、数値型へ変換した段階でNaNになることがあるため注意が必要です。 ゼロ除算や定義できない計算もNaNの原因です。点群処理では、二点間の距離、方向ベクトル、法線、回転、縮尺、補正量などを計算します。分母がゼロの状態で除算したり、長さがゼロのベクトルを正規化したりすると、正常な数値を得られないことがあります。 たとえば、同じ位置にある二点の差から方向を求めると、長さがゼロのベクトルになります。その長さで各成分を割ると、NaNが発生する可能性があります。この結果を点の移動や座標補正へ利用すると、元の座標が正常でも、出力座標にはNaNが混ざります。 座標変換の設定不足も原因になります。測地座標から平面座標へ変換する場合や、現場のローカル座標へ変換する場合には、基準となる座標、座標系、回転角、縮尺、単位などの情報が必要です。必要な値が未設定のまま計算されると、変換結果がNaNになる可能性があります。 角度の単位を誤って扱うこともあります。度で入力された値を別の単位として処理した場合、必ずNaNになるとは限りませんが、変換式の条件によっては計算不能な値が生じます。入力値が変換式の想定範囲を外れている場合も同様です。 文字列から数値への変換失敗も見逃せません。座標値の前後に不要な文字が付いている、区切り文字の位置がずれている、小数点の表現が統一されていない、数値欄に状態を表す文字が入っていると、数値解析に失敗します。処理によってはエラーで停止せず、変換結果としてNaNを返すことがあります。 複数の点群を結合する工程でもNaNが発生します。ファイルごとに列の並びが異なっている、座標系や単位が統一されていない、ヘッダーの有無が違うといった状態で一括変換すると、一部の行だけ正常に読み取れないことがあります。 たとえば、ある入力データがx、y、zの三列で、別の入力データが点番号、x、y、zの四列だった場合、同じ列番号を座標として読み取ると対応関係がずれます。誤って読み取った値が文字列であればNaNになり、数値であれば異常な位置の点になります。 計算値が保持可能な範囲を超えた場合には、無限大が生成されることがあります。その無限大を別の計算へ使用すると、NaNへ変化する場合があります。このため、NaNだけでなく、正負の無限大も同時に検査しなければなりません。 ファイル出力が途中で停止した場合も注意が必要です。処理の強制終了、記憶領域の不足、書き込み先との接続切断などによって、頂点行が途中までしか出力されないことがあります。不完全な行を後段の処理が読み込むと、欠けた値をNaNとして扱う可能性があります。 NaN座標を根本的に防ぐには、OBJ完成後だけを検査するのではなく、元データの読込直後、座標計算後、座標変換後、OBJ出力前という複数の段階で有限値を確認することが有効です。

検査1 OBJ内のNaNと無限大を検索する

アップロード前の最初の検査は、OBJファイル内にNaNや無限大を示す文字列が含まれていないかを検索することです。この方法は比較的簡単であり、大容量ファイルの入口検査として利用できます。 検索対象はNaNだけに限定しません。出力処理によってはnanやNANのように大文字と小文字が異なることがあります。そのため、大文字と小文字を区別しない条件で検索する方が安全です。 無限大を示す表記についても確認します。有限ではない値は三次元座標として正常に使用できません。また、無限大を含む演算が後続処理でNaNを発生させることもあります。検索条件には、利用している変換処理が出力する可能性のある無限大表記を含めます。 文字列検索には、専用の三次元表示処理を起動しなくても検査できる利点があります。OBJは基本的にテキスト形式であるため、ファイルを先頭から順番に読み取り、異常な文字列を探せます。全内容を一度にメモリへ読み込まず、一行ずつ確認すれば、容量の大きな点群OBJにも対応できます。 ただし、単純な文字列検索だけで合否を決めることはできません。コメント、グループ名、マテリアル名など、座標以外の部分に偶然同じ文字列が含まれる可能性があるためです。検索で該当箇所が見つかったら、その文字列がどの種類の行に含まれているかを確認します。 頂点行は一般に、行頭のvに続いて座標値が記録されています。NaNや無限大が頂点行のx、y、zに含まれていれば、アップロード前に修正が必要です。頂点以外の行で見つかった場合も、未定義の値が誤って名前として出力されていないか確認します。 検索結果には、検出件数だけでなく行番号を記録します。最初に見つかった位置、最後に見つかった位置、連続している範囲を確認すると、原因を推定しやすくなります。 特定の範囲にNaNが連続している場合、その範囲に対応する入力ファイル、測定時刻、処理単位などに問題がある可能性があります。一方、数百万点の中に数点だけ散発している場合は、一時的な測定失敗や局所的な計算異常が疑われます。 検索によってNaNを見つけても、直ちにその行を自動削除するのは避けた方が安全です。まず、該当件数と発生箇所を記録し、元データや変換工程を調べます。自動削除だけで処理を継続すると、異常の原因が残り、別のファイルでも同じ問題が再発します。 検査結果には、対象ファイル名、容量、検査日時、頂点行数、NaNの件数、無限大の件数などを残します。修正後に同じ検索を実施し、検出件数がゼロになったことを確認します。 文字列検索は短時間で実施しやすい反面、空欄や壊れた数値までは確実に検出できません。そのため、次の検査では、頂点行に記録された値を実際に数値へ変換して確認します。

検査2 頂点行を数値として解析する

二つ目の検査では、OBJ内のすべての頂点行を一行ずつ解析し、x、y、zが数値として読み取れるかを確認します。さらに、それぞれが有限値であることを判定します。 有限値とは、通常の数値計算や大小比較に使用できる値です。NaNや正負の無限大は有限値ではありません。数値型への変換が成功したように見えても、NaNや無限大を数値型として受け入れる処理があるため、変換の成否と有限値判定を分けて実施することが重要です。 この検査により、文字列検索では見つけにくい異常も検出できます。たとえば、座標欄が空になっている、数値の途中に不要な記号が入っている、指数表記が途中で切れているといった行は、NaNという文字を含まなくても数値変換に失敗します。 検査対象は一部のサンプルではなく、原則としてすべての頂点行とします。点群OBJは非常に多くの頂点を含むため、先頭の数百行だけを確認しても、中央や末尾に混ざったNaNを発見できません。 大容量ファイルであっても、一行ずつ逐次処理すれば、ファイル全体をメモリ上へ展開する必要はありません。現在の行を読み取り、頂点行であれば数値を検査し、結果を集計した後に次の行へ進みます。この方法であれば、点数が多いことを理由に全件検査を省略せずに済みます。 頂点行を解析するときは、行頭の要素を確認してから、後続する座標を取り出します。x、y、zのいずれか一つでも数値へ変換できなければ、その行を不正行として記録します。 異常行については、どの座標成分に問題があったかも残します。x座標だけに異常が集中していれば、x列の割当てや水平方向の変換処理に問題がある可能性があります。z座標に集中していれば、高さ補正、標高変換、深度計算などの工程を重点的に調査できます。 正常な頂点数、不正な頂点数、不正な座標成分の件数を集計すると、問題の規模を判断しやすくなります。数点だけの異常なのか、全頂点の大きな割合を占めるのかによって、必要な対応は異なります。 不正点が少数であり、元データ上でも明確な無効点として確認できる場合は、その点を除外できる可能性があります。しかし、広い範囲でNaNが発生している場合は、個別削除ではなく、座標変換や入力設定を修正してOBJを再生成する必要があります。 頂点に追加情報が記録されている場合も、少なくとも位置を表す座標値について有限値を確認します。位置以外の値に異常がある場合も、アップロード先の解釈によっては問題になる可能性があるため、使用するデータ仕様に沿って検査対象を決めます。 数値解析と有限値判定を通過すれば、OBJ内の頂点が少なくとも数値として解釈できる状態であることを確認できます。ただし、有限値であっても、単位の誤りや列ずれによって極端な座標が混ざっている可能性があります。次の検査では、頂点行の構造そのものを確認します。

検査3 頂点行の列数と書式を確認する

三つ目の検査では、各頂点行に必要な数の座標値がそろっているか、行の書式が一貫しているかを確認します。NaNは計算処理だけでなく、列の欠損や解析位置のずれによって発生するためです。 基本的な頂点行では、頂点を示すvの後ろにx、y、zの三つの座標値が続きます。追加の値を記録する形式もありますが、少なくとも位置を決める三座標が必要です。 正常な行がv 125.300 87.420 4.160であるのに対し、異常な行ではv 125.300 87.420のようにz座標が欠けていることがあります。また、行の途中に不要な文字列が入り、列数はそろっていても座標として解釈できない場合があります。 列数の不足を後段の処理が自動補完すると、欠けた座標にNaNが入ることがあります。そのため、OBJでNaNが見つかったときは、NaNの文字だけを除去するのではなく、元の行に必要なデータがそろっていたかを調べる必要があります。 想定より列が多い行も確認対象です。別の情報を追加した正常な形式である可能性もありますが、二つの頂点行が改行されずにつながっている場合や、区切りが崩れている場合にも列数が増えます。 頂点行ごとの列数を集計し、最も多い列数と異なる行を抽出すると、書式の不統一を見つけやすくなります。特定の位置から列数が変化している場合は、その付近で入力ファイルの切替えや処理条件の変更が発生していないか確認します。 複数の入力データを統合してOBJへ変換した場合は、元ファイルごとに列構成が統一されているかを調べます。あるファイルだけ点番号が先頭に追加されていたり、時刻や測定状態の列が含まれていたりすると、固定の列番号でx、y、zを取得する処理では対応関係がずれます。 列ずれによって座標欄へ文字が入ればNaNになりますが、点番号や時刻などの数値が入った場合は有限値として検査を通過してしまいます。したがって、列数だけでなく、各列が何を表しているかも確認しなければなりません。 改行の異常も書式を崩します。一つの頂点行が途中で二行に分割されると、前半は列不足、後半は行頭要素のない不正行として現れます。反対に二行が連結されると、想定より列数の多い行になります。 ファイルの最後の行も確認します。書き出し処理が途中で停止すると、末尾の頂点行が座標の途中で終わっている場合があります。ファイル全体の検査で末尾まで読み取り、最後の行が正常に完結していることを確認します。 不要な制御文字や想定外の文字コードが混ざると、画面上では通常の空白に見えても、解析時に区切りとして認識されない場合があります。頂点行の区切りを統一し、通常の空白で各要素を分けると互換性を高めやすくなります。 空行やコメント行が存在すること自体は直ちに異常とは限りませんが、アップロード先の仕様が不明な場合は、不要な行を減らして単純な構造に整える方が安全です。ただし、修正前の原本は保存し、変更内容を追跡できるようにします。 列数と書式の検査は、NaNそのものだけでなく、NaNを生み出す入力不足やデータ構造の不整合を見つける工程です。数値として読めるかどうかと、想定した列を正しく座標として読んでいるかを分けて確認します。

検査4 座標範囲と外れ値を確認する

四つ目の検査では、すべての座標が有限値であっても、その値が点群として妥当な範囲に収まっているかを確認します。 NaNを削除したりゼロへ置換したりした結果、別の座標異常が発生することがあります。また、無限大になる直前の非常に大きな数値や、誤った列から読み取った数値は、有限値判定だけでは異常と判断されません。 まず、x、y、zそれぞれの最小値と最大値を求めます。最大値と最小値の差から、点群全体の水平範囲と高さ範囲を確認できます。実際の現場や対象物に比べて極端に広い場合は、外れ値、単位の不一致、座標系の混在などを疑います。 たとえば、数十メートル程度の対象を記録したはずなのに、一つの軸だけ非常に大きな範囲へ広がっている場合、計算異常や列ずれが発生している可能性があります。点群全体が正常に見えない場合は、少数の遠方点によって表示範囲が引き延ばされていないかを確認します。 単位の混在も典型的な原因です。複数のデータを結合した際に、あるデータはメートル相当、別のデータはより細かな単位で記録されていると、一部の点群だけ大きく離れます。すべて数値として正常であるため、有限値検査では検出できません。 座標系が異なるデータを同じOBJへ入れた場合も、範囲が不自然になります。現場内のローカル座標と大きな絶対座標を変換せずに統合すると、点群同士が遠く離れて配置されます。統合前に座標系、原点、軸方向、単位を統一する必要があります。 座標値の平均と中央値を比較する方法も有効です。平均は少数の極端な外れ値の影響を受けやすい一方、中央値は影響を受けにくいため、両者が大きく離れていれば遠方点の混入を疑えます。 中心位置から各点までの距離を計算し、極端に遠い点を抽出する方法もあります。ただし、道路、河川、トンネルなど細長い範囲を対象とした点群では、中心から遠い点が正常に存在します。対象物の形状や測定範囲に応じた基準を設定することが必要です。 z座標の範囲は特に注意して確認します。地表付近の点群を想定しているのに、高さが大きな正負の範囲へ広がっている場合は、高さと深度の符号、軸の割当て、補正値の重複適用などが考えられます。 ゼロ座標の件数も集計します。ゼロは有効値ですが、欠損座標を一律でゼロへ置き換えた場合、大量の点が原点や特定の平面へ集まります。x、y、zがすべてゼロの点が不自然に多ければ、無効点の置換処理を疑います。 一つの軸だけゼロが多い場合は、必ずしも異常とは限りません。二次元の平面データを三次元形式へ変換した場合など、対象の構造によっては正常です。数値だけで機械的に削除せず、データの用途と一致しているかを確認します。 座標範囲の合否基準は、対象データに応じて設定します。現場中心、想定する水平範囲、最低高さ、最高高さ、使用単位などを事前に定め、その範囲を大きく外れる点を警告または不合格にします。 この検査により、NaNだけでなく、NaNを生じさせた計算の前後にある異常値や、誤った修正による外れ点も見つけられます。点群が極端に小さく見える、初期視点から見つからない、表示範囲が広がりすぎるといった問題の予防にもつながります。

検査5 再読み込みと試験アップロードを行う

五つ目の検査では、作成したOBJを独立した検証工程で再読み込みし、可能であれば小規模な試験アップロードまで行います。 OBJを書き出した処理が正常終了していても、別の読み込み処理で正常に解釈できるとは限りません。書き出し側ではNaNや不完全な行を許容していても、アップロード先では厳格に拒否する場合があります。 再読み込みには、可能な限り書き出し処理とは別の検証方法を使用します。同じ処理で書き出しと読み込みを行うと、同じ解釈や同じ不具合によって異常を見逃す可能性があるためです。 再読み込み後は、取得できた頂点数を確認します。出力前の頂点数と一致しなければ、NaNを含む頂点が読み飛ばされた、途中で解析が停止した、書式の違いによって一部の行が認識されなかったといった可能性があります。 座標の最小値と最大値も出力前後で比較します。頂点数が一致していても、列の誤認識、数値の丸め、単位変換などによって座標範囲が変化していることがあります。 点群の中心位置も確認します。想定した現場や対象物の位置から大きく外れていれば、座標変換や原点設定を見直します。点群が表示できたという理由だけで合格にせず、位置と範囲が正しいことを確認します。 試験アップロードでは、最初から大容量の本番ファイルを使用せず、同じ生成条件で作った小規模なOBJを使う方法があります。アップロード、解析、変換、表示まで正常に完了するかを確認し、形式上の互換性を調べます。 ただし、先頭部分だけを切り出した試験ファイルでは、元ファイルの中央や末尾にある異常を見落とします。試験用データを作る場合は、先頭、中央、末尾など複数の範囲から点を抽出し、元ファイル全体の特徴をある程度含めます。 試験用ファイルが正常でも、本番ファイルの全件検査は必要です。試験アップロードは、NaNや書式異常を探す検査の代わりではなく、実際の処理環境との互換性を確認する最終工程です。 アップロード後は、処理完了の表示だけでなく、表示された点数、全体範囲、中心位置、欠落箇所、向き、高さを確認します。表示できていても、異常な頂点だけが無視されている可能性があります。 修正前と修正後のファイルを同じ名前で上書きすると、どの版を試験したか分からなくなります。版を区別できる名前や識別情報を付け、検査したファイルとアップロードしたファイルが同一であることを確認します。

NaN座標を見つけた場合の修正方法

NaNを発見した場合は、最初に発生原因を確認します。NaNを一律にゼロへ置き換える方法は簡単ですが、多くの場合は適切な修正ではありません。 NaNは、座標がゼロであることではなく、座標を求められないことを示します。ゼロへ変えると、本来存在しない点が原点や座標軸上へ配置されます。少数の点であっても、境界計算や体積計算、断面作成などへ影響する可能性があります。 点だけで構成されたOBJで、該当点が元データ上でも明確な無効点である場合は、その頂点行を除外する方法が考えられます。ただし、削除した件数と全体に占める割合を確認し、利用目的へ影響しないことを判断します。 大量のNaNが存在する場合は、個別削除で済ませるべきではありません。列の対応、入力ファイル、座標系、基準値、単位、変換式などに共通の問題がある可能性が高いため、生成工程を修正して再出力します。 欠損値が原因であれば、OBJへ変換する前に無効行を判定します。x、y、zのうち一つでも欠けている行を除外するのか、入力エラーとして停止するのか、用途に応じてルールを決めます。 ゼロ除算が原因の場合は、計算前に分母を確認します。分母がゼロ、または計算上ゼロに近い状態であれば、処理を分岐させます。対象点を無効として除外する、補正を行わない、処理全体をエラーで停止するなど、計算内容に適した対応が必要です。 座標変換が原因の場合は、入力座標の範囲、座標系、角度単位、原点、縮尺、回転方向を見直します。変換後の座標をOBJ出力へ渡す直前に有限値判定を行うと、異常値がファイルへ混入することを防げます。 文字列変換の失敗であれば、不要な文字、区切り、空白、小数点、指数表記などを確認します。数値変換に失敗した値をNaNとして処理し続けるのではなく、元の文字列と行番号を記録して処理を停止させると原因を把握しやすくなります。 周囲の点から座標を補間する方法もありますが、適用できる条件は限定されます。規則的な格子や連続面で、欠けた点の位置関係が明確な場合には補間できる可能性があります。しかし、一般的な三次元点群では、NaNになった点の正しい位置を周囲から一意に決められない場合があります。 元データから再生成できる場合は、完成したOBJを直接書き換えるより、原因を修正して再出力する方が安全です。OBJへの直接修正は、元データと完成ファイルの対応関係を分かりにくくし、別の不整合を作る可能性があります。 修正後には、NaN検索、有限値判定、列数検査、座標範囲検査、再読み込みをすべてやり直します。一つの問題を直した結果として、頂点番号のずれや外れ値が発生していないことを確認します。

面や線を含むOBJを修正するときの注意点

点だけで構成されたOBJでは、無効な頂点行を削除しても、残った点の表示に直接影響しない場合があります。一方、面や線を含むOBJでは、頂点番号による参照関係があるため、単純な行削除は危険です。 OBJの面定義や線定義は、頂点の番号を使って構成されています。途中の頂点行を削除すると、それより後ろにある頂点の番号が変化します。参照番号を修正しなければ、別の頂点を参照したり、存在しない番号を参照したりすることになります。 NaN頂点が面から参照されている場合は、その面を削除するのか、残った頂点で再構成するのかを判断します。形状を無理に再構成すると、本来の表面とは異なる面が作られる可能性があります。 参照されていない孤立頂点であれば、削除後に番号を詰め、すべての参照番号を新しい番号へ置き換えることで整合性を保てます。ただし、頂点だけでなく、テクスチャ座標や法線の参照が含まれる場合は、それぞれの番号体系を区別して処理する必要があります。 修正後は、すべての参照番号が有効範囲内にあることを検査します。頂点数を超える番号、ゼロとして扱えない番号、意図しない負の参照などが残っていないかを確認します。 面数や線数も修正前後で比較します。NaN頂点を含む形状を除外した場合、どの程度の面や線が失われたかを記録します。点群の可視化だけでなく、表面計算や体積計算へ使用する場合は、欠損が結果へ影響しないかを確認する必要があります。

大容量の点群OBJを効率よく検査する方法

点群OBJは、頂点数が増えるほどファイル容量も大きくなります。検査対象が数百MBから数GBになると、一般的なテキスト編集画面で開くだけでも負荷が高くなります。 大容量ファイルでは、全体を一度にメモリへ読み込まず、一行ずつ逐次処理する方法が適しています。現在の行だけを解析し、頂点数、異常数、最小値、最大値などの集計結果を更新します。 NaNの検出では、最初に高速な文字列検索を行い、その後に全頂点の数値解析を実施すると効率的です。文字列検索で明確な異常が見つかった場合は、詳細検査の前に生成工程を見直せます。 検査中に異常行が大量に見つかった場合、すべての内容を記録すると検査結果自体が巨大になります。詳細として保存する行数には上限を設け、総件数は別に集計します。最初の数件、一定間隔の例、最後の数件などを残すと、発生傾向を確認しやすくなります。 進捗を把握できるように、読み取った容量や処理済み行数を記録する方法もあります。大容量ファイルでは検査が停止しているのか、正常に進行しているのかを判断しにくいためです。 ファイルを分割して検査する場合は、単純に任意の位置で分けると頂点行の途中を切断する可能性があります。必ず改行位置を基準に分割し、面や線を含む場合は参照関係が分割をまたがないか確認します。 検査結果には、ファイル内容から求めた識別値を関連付けると安全です。検査後にファイルが書き換えられた場合、同じ名前でも内容が異なる可能性があります。アップロード直前に識別値を再確認すれば、検査済みのファイルと実際に送信するファイルが同一であることを確認できます。

NaN座標の混入を防ぐ運用ルール

NaN問題を減らすには、アップロード前の最終検査だけでなく、点群を生成する全工程に検査を組み込むことが重要です。 まず、元データで使用する無効値の定義を統一します。空欄、特定の数値、文字列、状態コードなどが混在すると、処理ごとに異なる判定が行われます。何を有効点とし、何を除外するかを明確にします。 次に、座標系と単位をデータごとに記録します。座標値だけを受け渡すと、どの座標系で、どの単位で、どの軸方向を使用しているか分からなくなります。複数データを統合する前に、これらの条件が一致していることを確認します。 有限値判定は、入力直後、座標計算後、変換後、OBJ出力前に行います。入力直後からNaNがあれば元データの問題であり、計算後に初めてNaNが発生すれば計算処理の問題です。検査箇所を分けることで原因を特定しやすくなります。 NaNを検出したときは、できるだけ早い段階で処理を停止します。異常を警告だけにして後工程へ渡すと、最終的にどこで問題が発生したのか分かりにくくなります。 ファイル名や保存場所も整理します。元データ、変換途中、未検査、検査済み、アップロード済みを区別できるようにすると、未検査ファイルを誤って送信するリスクを減らせます。 同じ名前で上書きを繰り返すのではなく、修正前のファイルを残します。どの工程を変更し、NaN件数や頂点数がどのように変化したかを追跡できる状態にします。 自動的に無効点を削除する場合は、削除件数と理由を記録します。NaNによる削除、測定範囲外による削除、外れ値判定による削除を区別すると、点数が減った原因を後から確認できます。 アップロード後の確認方法も統一します。処理完了だけでなく、頂点数、全体範囲、中心位置、高さ、欠落箇所を確認します。複数の担当者が同じ基準で判断できるように、確認項目を固定します。

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

実務では、五つの検査を毎回同じ順序で行うと、見落としを減らしやすくなります。 最初に、OBJが正常に書き出されていることを確認します。ファイルが存在し、容量がゼロではなく、想定した規模から大きく外れていないことを調べます。 次に、NaNと無限大の文字列検索を行います。検出された場合は、行番号、件数、該当する座標成分を記録し、元データや変換工程へ戻ります。 文字列検索を通過したら、すべての頂点行を数値として解析します。x、y、zが数値へ変換でき、かつ有限値であることを確認します。 続いて、頂点行の列数と書式を確認します。列不足、列過多、不完全な末尾行、異常な改行、想定外の文字がないことを調べます。 その後、x、y、zの最小値と最大値、点群の中心、ゼロ座標数、外れ値候補を確認します。現場や対象物の想定範囲と比べ、不自然な座標がないことを判断します。 面や線が含まれている場合は、参照番号も検査します。すべての参照が有効な頂点を指していること、NaN頂点の削除後に番号がずれていないことを確認します。 最後に、独立した方法でOBJを再読み込みします。頂点数と座標範囲を比較し、小規模な試験アップロードで解析から表示まで正常に完了することを確かめます。 検査に合格したファイルには、検査日時と結果を関連付けます。アップロード直前にファイルが変更されていないことを確認し、合格した版だけを使用します。 この一連の手順を自動化すれば、担当者の経験に依存せず、同じ基準で点群OBJを確認できます。NaNが見つかった場合にアップロードを自動停止する仕組みにすると、解析不能なファイルが後工程へ流れることを防げます。

まとめ

点群OBJにNaN座標が混ざると、ファイルの読み込み拒否、解析処理の停止、一部頂点の欠落、表示範囲の異常、点群全体の非表示などにつながる可能性があります。 NaNは、欠損値、無効な測定点、ゼロ除算、座標変換の設定不足、列ずれ、文字列から数値への変換失敗、計算範囲の超過、不完全なファイル出力などによって発生します。 アップロード前には、まずOBJ内のNaNと無限大を検索します。次に、すべての頂点行を数値として解析し、x、y、zが有限値であることを確認します。さらに、頂点行の列数と書式、座標範囲と外れ値を調べ、最後に再読み込みと試験アップロードを行います。 NaNを見つけたときは、安易にゼロへ置き換えず、元データや変換工程までさかのぼって原因を修正することが重要です。点だけのOBJで無効点と確認できる場合は除外を検討できますが、面や線を含むOBJでは参照番号の整合性も直す必要があります。 定期的に点群OBJを扱う業務では、五つの検査を自動化し、合格したファイルだけをアップロードする運用が有効です。検査済みファイルと実際にアップロードするファイルが同一であることを確認し、修正内容や削除点数も記録します。 点群の取得からOBJ出力、検査、アップロード、表示確認までを一つの工程として管理すれば、NaNによるやり直しを減らし、点群データを安定して活用できます。現場での点群取得からデータ活用までをより円滑に進める方法として、LRTK Phoneを使った運用も検討してみてください。

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

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