点群をOBJ形式で出力し、ビューアーやクラウドサービスへアップロードしたところ、形状は表示されるのに頂点色だけが消えてしまうことがあります。元データでは地面、構造物、植生、舗装などが色分けされていたにもかかわらず、アップロード後には点群全体が白色や灰色で表示されるケースです。
この現象は、必ずしも点群データそのものが壊れていることを意味しません。OBJファイル内に色情報が書き出されていない場合もあれば、色情報は残っていても、読み込み側がその記述方法に対応していない場合もあります。また、出力時の最適化や頂点統合によって、座標と色の対応関係が変化している可能性もあります。
特に注意したいのは、OBJ形式における頂点色の扱いが、すべてのソフトウェアやサービスで完全に統一されているわけではない点です。OBJでは頂点座標を表す記述が広く利用されていますが、座標の後ろにRGB値を追加して頂点色を持たせる方法は、読み書きを行う環境によって対応状況が異なります。そのため、出力元で色が見えていることだけでは、点群 OBJ アップロード後にも同じ色が再現されるとは限りません。
本記事では、点群OBJの頂点色が消えるときに確認したい6つの出力設定を解説します。単に出力ボタンを押し直すのではなく、OBJファイルの中身、RGB値の形式、頂点数の変化、点と面の扱い、マテリアルへの置換まで順番に確認することで、原因を切り分けやすくなります。
点群OBJで頂点色が消える仕組みを理解する
OBJファイルでは、一般に頂点座標を
v
で始まる行に記録します。たとえば、
v 1.250 2.500 3.750
という行は、X、Y、Zの3つの座標値を持つ頂点を表します。頂点色を扱う一部の出力環境では、この後ろにRGB値を追加し、
v 1.250 2.500 3.750 0.80 0.40 0.20
のように記録します。
この例では、最初の3つの数値が座標で、後ろの3つの数値が赤、緑、青の色成分です。しかし、読み込み側が座標後方の数値を頂点色として解釈しない場合、座標だけが読み込まれ、色は無視されます。OBJファイル自体は開けるため、利用者から見ると「形状は正常なのに色だけ消えた」という状態になります。
また、色の数値範囲にも違いがあります。RGB値を0から1の小数で記録する環境もあれば、0から255の整数で記録する環境もあります。出力側が
255 128 0
と記録し、読み込み側が0から1の値を想定している場合、正しい色として処理されない可能性があります。反対に、0から1の小数を0から255の整数として扱うと、ほぼ黒色に見えることがあります。
点群OBJでは、頂点だけを並べたファイル、頂点と点要素を記録したファイル、三角形などの面を持つファイルが混在します。読み込み側によっては、面に使用されている頂点の色には対応していても、点だけで構成されたOBJの色には対応していない場合があります。逆に、点群としての表示には対応していても、面生成時に頂点色を引き継がない場合もあります。
そのため、頂点色が消えたときは、色の有無だけを確認するのではなく、どのような構造で色が記録され、どのような形状として読み込まれているかを確認する必要があります。出力元、OBJファイル、アップロード先の3段階に分けて考えると、原因を整理しやすくなります。
出力設定1:頂点色情報を含める
最初に確認するのは、OBJ出力時に頂点色情報を含める設定が有効になっているかどうかです。元の点群に色が付いていても、OBJ出力の初期設定では座標だけが書き出されることがあります。画面上で色付き点群を表示できていることと、ファイル内に色情報が保存されることは別の処理です。
出力設定には、頂点色、カラー属性、RGB、色付き頂点、属性を含めるといった名称の項目が用意されていることがあります。名称は利用する環境によって異なりますが、座標以外の属性を書き出す設定を探すことが重要です。法線、テクスチャ座標、分類情報などを個別に選択できる場合は、RGBまたは頂点色に該当する設定が有効になっているかを確認します。
設定画面だけで判断できない場合は、出力したOBJファイルをテキストとして開き、
v
で始まる行を確認します。座標値しか並んでいなければ、そのOBJには頂点色が含まれていない可能性が高いと考えられます。座標の後ろに3つ以上の数値が続いていれば、RGB値や別の属性が記録されている可能性があります。
ただし、数値が多いことだけで頂点色が保存されているとは断定できません。出力形式によっては、座標の後ろに同次座標用の値や別属性が追加される場合があるためです。出力元の設定内容と数値の範囲を照らし合わせ、追加された値がRGBであるかを確認します。
点群を加工した後に出力する場合は、加工後の点群に色属性が残っているかも重要です。座標変換、ノイズ除去、点群結合、切り出し、間引きなどの処理によって、RGB属性が削除されることがあります。加工画面では元画像や別レイヤーを重ねて色付きに見せているだけで、実際の点データには色が保持されていない場合もあります。
この切り分けには、加工前と加工後の点群属性を比較する方法が有効です。点数だけでなく、各点が持つ属性項目を確認し、赤、緑、青に相当する値が残っているかを見ます。加工後の段階ですでにRGB属性が消えていれば、OBJ出力設定を変更しても頂点色は復元されません。
複数ファイルを統合してからOBJへ変換する場合は、一部の点群だけに色がなく、統合時に共通属性だけが採用されることもあります。色付き点群と色なし点群を混在させると、全体が色なし属性として整理される可能性があるため、統合前に属性構成をそろえておくことが大切です。
出力設定2:RGB値の範囲と精度をそろえる
OBJファイルにRGB値が含まれていても、値の範囲が読み込み側の想定と異なると、色が正しく表示されないことがあります。代表的なのは、0から1までの小数と、0から255までの整数の違いです。
0から1の形式では、赤を最大にする場合は1、赤を半分程度にする場合は0.5のように表します。0から255の形式では、最大値が255、半分程度が128前後になります。どちらもRGBを表す方法ですが、読み込み側が自動判定できるとは限りません。
たとえば、白色を
255 255 255
と記録したOBJを、0から1の値だけに対応する環境へアップロードすると、値が許容範囲外として無視される可能性があります。値を強制的に1へ制限する実装であれば白色として表示されることもありますが、処理結果は環境によって異なります。反対に、
1 1 1
を0から255の値として扱うと、ほぼ黒に近い色になります。
色が完全に消えたように見えても、実際には極端に暗い色で表示されている場合があります。背景色が黒や濃い灰色であれば、点群が見えにくくなり、色属性そのものが失われたと判断しやすくなります。背景を明るく変更したり、点の表示サイズを大きくしたりして、微弱な色が残っていないかを確認することも有効です。
出力時にRGB値の範囲を選択できる場合は、アップロード先が想定する形式にそろえます。選択項目がない場合は、出力後のOBJを確認し、実際の値がどの範囲になっているかを調べます。数行だけでは判断しにくいため、明るい部分、暗い部分、赤みの強い部分など、異なる場所の頂点を複数確認すると傾向を把握しやすくなります。
小数点以下の精度も確認が必要です。RGB値を0から1で記録する場合、小数点以下をすべて切り捨てると、多くの値が0または1になります。たとえば0.48が0へ丸められると、その色成分は失われます。赤、緑、青の各成分が粗く丸められると、元の写真に近い色ではなく、限られた色だけで表示されることがあります。
出力設定に数値精度や小数桁数がある場合は、座標精度だけでなく、色属性にも同じ設定が適用されるかを確認します。座標では数桁の小数が必要でも、色では別の精度が必要になる場合があります。少なくとも、0から1のRGB値が途中の階調を保持できる桁数を確保することが重要です。
色の値に負数、空欄、文字列、極端に大きな数値が混ざっている場合も、読み込みが不安定になることがあります。欠測点に特別な値を入れている点群では、OBJ変換時にその値がそのまま書き出されていないかを確認します。色がない点については、一定の既定色を設定するか、対象点を除外して出力するほうが安定する場合があります。
出力設定3:色チャンネル数と並び順を統一する
頂点色は、一般に赤、緑、青の3成分で表しますが、透明度を含む4成分で出力される場合もあります。さらに、出力環境によっては、RGBではなく別の順序で値が並ぶことがあります。色チャンネル数と並び順が読み込み側の想定に合わないと、色が無視されたり、元とは異なる色で表示されたりします。
座標の後ろにRGBだけを付ける場合、1行はX、Y、Z、R、G、Bという構成になります。透明度を追加すると、X、Y、Z、R、G、B、Aという構成になります。読み込み側が6つの数値だけを想定している場合、7つ目の透明度があることで行全体を解釈できない可能性があります。
透明度が0で出力されている場合にも注意が必要です。読み込み側が透明度を有効に解釈すると、点群自体は存在していても完全に透明になります。この状態では、頂点色が消えたというより、色付きの点が見えなくなっています。透明度を使用しない運用であれば、RGBの3成分だけにそろえるか、透明度を不透明側の値に統一して出力します。
RGBの並び順が入れ替わると、赤い対象が青く見えるなどの変化が起こります。この場合は色が消えるわけではありませんが、読み込み側が異常な属性と判断して既定色へ置き換える可能性もあります。出力元で赤、緑、青の順序を指定できる場合は、一般的なRGB順にそろえておくと互換性を確保しやすくなります。
座標値とRGB値の間に別の数値が追加される形式にも注意します。たとえば、X、Y、Zの後ろに補助値が入り、その後ろにRGBが続くと、読み込み側が補助値を赤成分として解釈する可能性があります。OBJの頂点行に独自属性を追加する方式は、出力元では問題なく再読込できても、別の環境では認識されないことがあります。
点群に反射強度、分類番号、信頼度、撮影番号などの属性が含まれている場合、OBJへ変換するときにどの属性を頂点行へ追加するかを確認します。必要のない属性をすべて書き出すよりも、アップロードに必要な座標とRGBだけへ整理したほうが、読み込み側の解釈が安定しやすくなります。
検証するときは、色が明確に分かる少数の点を用意すると便利です。赤、緑、青、白、黒に近い点を含む小さなデータを出力し、アップロード後の色を確認します。赤が青になる、白が透明になる、すべて黒くなるといった結果から、並び順や数値範囲の問題を推測できます。
色チャンネルの設定を変更した後は、同じファイル名で上書きするのではなく、条件が分かる名前で別ファイルとして保存します。アップロード先に以前の変換結果や表示データが残っていると、新しいOBJへ差し替えたつもりでも古い表示が再利用される可能性があります。条件ごとにファイルを分けることで、比較と切り分けがしやすくなります。
出力設定4:頂点統合と間引きを抑える
大容量の点群OBJを扱う際には、ファイルサイズを抑えるために頂点統合、重複削除、間引き、簡略化などの処理が行われることがあります。これらの設定はアップロード時間や表示負荷の軽減に役立ちますが、処理方法によっては頂点色が失われる原因になります。
頂点統合は、同じ位置または近接した位置にある複数の頂点を1つにまとめる処理です。統合対象となる頂点が異なる色を持っている場合、どの色を残すかという問題が生じます。最初の頂点の色を採用する方法、最後の頂点の色を採用する方法、平均色を計算する方法、色属性を削除する方法などが考えられますが、実際の処理は出力環境によって異なります。
特に、座標だけを基準に重複判定する設定では、色の違いが考慮されない可能性があります。建物の角や地面と構造物の境界では、ほぼ同じ位置に異なる色の点が存在することがあります。これらをまとめると、境界部分の色がにじんだり、一方の色だけが残ったりします。
間引き処理でも、座標と色の対応関係を保つ必要があります。一定間隔で頂点を削除するだけであれば、残った頂点の色を維持しやすい一方、新しい代表点を生成する方式では、色の再計算が必要になります。代表点の座標だけが作られ、RGB属性が引き継がれなければ、出力後のOBJは色なし点群になります。
面を持つOBJでは、形状簡略化によって頂点番号が組み替えられる場合があります。色属性が頂点行と一体で記録されていれば対応を保ちやすいものの、別の内部データとして管理されている場合は、簡略化後に色との対応が外れることがあります。出力結果で頂点数が大幅に減っている場合は、簡略化設定が色属性に与える影響を確認します。
原因を切り分けるときは、最初に頂点統合、重複削除、間引き、簡略化を無効にして出力します。容量は大きくなりますが、元点群の座標とRGBをできるだけそのままOBJへ書き出せます。この状態で頂点色が表示されるのであれば、最適化処理のいずれかが原因と考えられます。
その後、必要な処理を1つずつ有効にし、どの段階で色が消えるかを確認します。複数の最適化を同時に有効にすると、原因を特定しにくくなります。重複削除だけ、一定間隔の間引きだけ、面の簡略化だけというように条件を分けることが重要です。
実運用では、最大限の点数を残すことが常に正解とは限りません。重要なのは、点数を減らした後も座標とRGBが対になって保存されることです。出力後の頂点数だけでなく、すべての頂点行に同じ数の色成分が入っているか、途中から座標だけの行になっていないかも確認します。
出力設定5:点群として読める要素構成にする
OBJ形式は、頂点座標だけでなく、点、線、面などの要素を表現できます。点群をOBJへ変換する場合、頂点行だけを並べる方式と、各頂点を点要素として参照する方式があります。また、点群から三角形などの面を生成し、メッシュとして出力する方式もあります。
アップロード先がどの構成に対応しているかによって、頂点色の扱いが変わる可能性があります。頂点行だけのOBJを点群として表示できる環境もありますが、点要素の記述を必要とする環境もあります。反対に、面を持つOBJだけを想定し、点だけのデータを既定色で表示する環境も考えられます。
元のデータが点群である場合は、まず点群としての構成を維持した出力を試します。点群を自動的に面へ変換すると、面生成の過程で新しい頂点が作られたり、元の点が削除されたりすることがあります。その際にRGB値が補間されなければ、メッシュには色が引き継がれません。
点群の密度が不均一な状態で面を生成すると、離れた点同士が結ばれ、不自然な三角形が作られることもあります。形状の崩れと色の消失が同時に起きている場合は、アップロード時ではなく、OBJ出力前の面生成処理に原因がある可能性があります。
一方で、アップロード先が点要素に対応していない場合は、面を持たないOBJが正常に表示されないことがあります。この場合は、頂点色に対応したメッシュとして出力する必要があります。ただし、頂点色付きメッシュを受け付けるか、マテリアルやテクスチャが必要かは環境によって異なるため、少量の検証データで確認します。
点群とメッシュのどちらで出力する場合でも、頂点番号の対応関係が重要です。面は頂点番号を参照して構成されます。出力途中で頂点の並びが変わったり、不要な頂点が削除されたりすると、色が別の位置へ割り当てられる可能性があります。色が消えるだけでなく、まだら模様や不自然な縞が出る場合は、頂点番号と属性の対応が崩れていないかを疑います。
出力設定に、点として書き出す、面を生成する、メッシュへ変換する、点要素を含めるといった選択肢がある場合は、アップロード先の対応形式に合わせます。対応状況が不明な場合は、同じ範囲から点群版とメッシュ版を作り、どちらが正しく表示されるかを比較すると効率的です。
検証用データでは、広大な現場全体を使う必要はありません。色の違いが分かりやすく、平面と立体物の両方を含む小さな範囲を切り出します。点群版で色が出て、メッシュ版で消える場合は、面生成またはメッシュ出力の設定に原因があると判断しやすくなります。
出力設定6:マテリアルとテクスチャへの置換を確認する
OBJでは、形状ファイルとは別にマテリアル情報を参照する構成が利用されることがあります。マテリアルは表面色や反射特性などを指定するためのもので、画像によるテクスチャと組み合わせることもあります。ただし、マテリアルの色と頂点ごとの色は同じものではありません。
出力設定で「頂点色をマテリアルへ変換する」「色をテクスチャへ焼き付ける」といった処理が有効になっている場合、OBJ本体の頂点行からRGB値が削除される可能性があります。その代わり、別ファイルのマテリアルや画像に色が保存されます。この状態でOBJ本体だけをアップロードすると、形状は表示されても色が失われます。
複数ファイルをまとめてアップロードできる場合でも、OBJから参照されるファイル名や相対位置が一致していなければ、マテリアルやテクスチャは読み込まれません。出力後にファイル名を変更したり、別々のフォルダーへ移動したりすると、参照関係が切れることがあります。
頂点色を維持したい場合は、マテリアルやテクスチャへの置換を無効にし、RGB値をOBJの頂点行へ直接含める設定を確認します。反対に、アップロード先が頂点色に対応せず、テクスチャだけに対応している場合は、頂点色を画像へ変換する運用が必要になることがあります。
ここで重要なのは、どちらか一方が常に優れているわけではないという点です。点群の各点が持つ色をそのまま扱う場合は頂点色が適していますが、面を持つモデルの外観を細かく再現する場合はテクスチャが適することがあります。目的とアップロード先の対応状況に合わせて選択します。
OBJ、マテリアル、画像の複数ファイルを使用する場合は、アップロード前に参照関係を確認します。OBJ内にマテリアルファイルを参照する記述があるか、マテリアル内に画像を参照する記述があるか、実際のファイル名と一致しているかを見ます。大文字と小文字、全角文字と半角文字、空白、記号の違いが影響する環境もあるため、短い英数字のファイル名へ統一すると管理しやすくなります。
一方、OBJ内の頂点行にRGB値があり、マテリアルも設定されている場合は、読み込み側がどちらを優先するかによって表示結果が変わることがあります。マテリアルの既定色が頂点色より優先されると、すべて同じ色に見える可能性があります。頂点色の検証時には、不要なマテリアル指定を外した単純なOBJを作成すると原因を切り分けやすくなります。
出力前に行う検証用OBJの作り方
頂点色の問題を調べるときに、現場全体の大容量OBJを何度も出力すると、変換とアップロードに時間がかかります。設定を変更するたびに結果を待つことになり、原因の切り分けも複雑になります。そのため、最初に小さな検証用OBJを作る方法が有効です。
検証範囲には、複数の色が含まれる場所を選びます。舗装、土、草、構造物など、見た目の違いが分かりやすい対象を含めると、色の変化を判断しやすくなります。単色に近い範囲だけを切り出すと、頂点色が残っているのか、既定色で表示されているのかを区別しにくくなります。
検証用OBJでは、最初に加工を最小限にします。座標変換、点群統合、間引き、面生成、マテリアル生成などを必要以上に行わず、元点群の座標とRGBをそのまま出力します。ここで色が表示されれば、基本的な頂点色の記述には対応している可能性があります。
次に、実運用で必要な処理を1つずつ追加します。座標変換後、間引き後、面生成後、ファイル分割後というように段階を分け、それぞれ別のOBJとして保存します。どの段階で色が消えたかが分かれば、確認すべき設定を絞り込めます。
ファイル名には、設定内容が分かる短い識別情報を付けます。頂点色あり、RGB範囲変更、透明度なし、間引きなし、点群形式など、比較したい条件が判別できるようにします。同じ名前で上書きすると、アップロード先の履歴や一時データと混同しやすくなります。
OBJの中身を確認するときは、先頭部分だけでなく、中間や末尾の頂点行も見ます。ファイルの先頭ではRGBが記録されていても、途中から座標だけになる場合があります。複数の点群を結合したデータでは、元ファイルごとに属性構成が異なり、一部だけ色が欠けている可能性があります。
頂点行の数値項目数が一定かどうかも確認します。ある行は座標とRGBの6項目、別の行は座標だけの3項目という状態では、読み込み側がファイル全体を色なしとして処理することがあります。すべての頂点に色を付けられない場合は、色がない点へ共通の既定色を補う方法も検討します。
検証結果は、出力設定とアップロード結果を組み合わせて記録します。色が表示されたか、点数が変化したか、形状が崩れたか、処理が停止したかを残すことで、後から条件を再現できます。担当者が変わっても同じ確認を繰り返さずに済むため、継続的な運用にも役立ちます。
点群OBJアップロード後に色が消えたときの切り分け
点群 OBJ アップロード後に頂点色が消えた場合は、出力元、OBJファイル、アップロード先の順で確認すると効率的です。最初からアップロード先の表示設定だけを変更しても、OBJに色が入っていなければ解決しません。
出力元では、元点群にRGB属性が存在するかを確認します。画面上で写真や別レイヤーを重ねて色付きに見せているだけではなく、各点が実際に色成分を持っているかを見ることが重要です。加工後の点群についても同じ確認を行います。
次に、OBJの頂点行を確認します。座標の後ろにRGBと考えられる値があるか、数値範囲が0から1か0から255か、すべての行で項目数がそろっているかを見ます。透明度や不要な属性が追加されていないかも確認します。
OBJにRGBが含まれているにもかかわらず色が表示されない場合は、アップロード先がその頂点色表現に対応していない可能性があります。この場合、別の読み込み環境で同じOBJを開き、色が表示されるかを比較します。別環境で色が出るのであれば、OBJの色が完全に失われているわけではありません。
アップロード先に点群表示とメッシュ表示の切り替えがある場合は、表示方式も確認します。点群として読み込まれているのか、面へ変換されているのかによって、頂点色の反映方法が変わる可能性があります。点の大きさ、背景色、照明、マテリアルの有効状態なども見直します。
色が一部だけ消える場合は、ファイル全体の問題ではなく、特定の点群や処理範囲に原因がある可能性があります。複数の点群を統合している場合は、元データごとにRGB属性の有無と値の形式を確認します。0から1と0から255の点群をそのまま統合すると、一部だけ暗くなったり、異常な色になったりすることがあります。
アップロード処理中にデータが変換されるサービスでは、元OBJとは別の内部形式へ変換されることがあります。その変換過程で頂点色が対象外になっている場合、元OBJを修正しても同じ結果になる可能性があります。対応する色表現や推奨される構成が確認できる場合は、それに合わせて出力条件を調整します。
頂点色を維持する運用ルール
頂点色の問題は、担当者ごとに異なる出力設定を使うと再発しやすくなります。正しく表示できた条件が見つかったら、その設定を一度限りの対応で終わらせず、標準的な出力ルールとして残すことが大切です。
標準化する内容には、RGB値の範囲、色チャンネル数、小数精度、間引き方法、点群とメッシュの選択、マテリアルの有無などを含めます。単に「頂点色を有効にする」と記録するだけでは、別の環境で設定項目の名称が変わったときに判断できません。出力後のOBJがどのような構造になるべきかも記録します。
検証済みの小容量OBJを基準データとして保管しておく方法も有効です。アップロード環境の更新や出力手順の変更後に基準データを読み込み、以前と同じ色で表示されるかを確認します。基準データでも色が消える場合は、現場ごとの点群ではなく、読み込み環境や変換処理の変更を疑えます。
元点群からOBJまでの中間ファイルを残すことも重要です。最終OBJだけを保管していると、色がどの段階で消えたかを後から調べられません。元点群、加工後点群、間引き後点群、OBJというように主要な段階を残しておけば、属性の変化を追跡できます。
ファイルを受け渡すときは、OBJだけで完結するのか、マテリアルや画像が必要なのかを明確にします。複数ファイルで構成される場合は、必要なファイルを同じ単位で管理し、参照関係を崩さないようにします。OBJだけを送付して色が出ないという問題は、頂点色ではなく、付属ファイルの不足によって起こることもあります。
また、点群の座標系や原点調整を行う場合は、色属性を保持できる処理を選びます。座標値だけを書き換える単純な変換でも、利用する方法によってはRGB列が削除される可能性があります。変換前後で点数、属性数、RGB値の範囲を比較し、意図しない変化がないことを確認します。
大容量データでは、処理負荷を下げるための間引きが必要になることがあります。その場合は、色属性を保持できる方法を標準として採用し、代表点の色をどのように決めるかも整理します。境界部分の色を重視するのか、全体の見た目を重視するのかによって、適した間引き方法は異なります。
まとめ
点群OBJの頂点色が消えるときは、OBJファイルが壊れていると決めつけず、頂点色情報の出力、RGB値の範囲、小数精度、色チャンネル数、頂点統合、点と面の構成、マテリアルへの置換を順番に確認することが重要です。
特に、OBJの頂点色は読み書きする環境によって対応状況が異なります。出力元で色が見えていても、OBJ内にRGB値が含まれているとは限りません。また、RGB値が含まれていても、アップロード先が同じ数値範囲や項目構成を想定していなければ、色が無視される可能性があります。
最初は小さな範囲を切り出し、加工や最適化を無効にした単純なOBJで検証します。そこから設定を1つずつ追加すれば、どの処理によって色が消えたかを特定しやすくなります。正しく表示できた条件は標準設定として記録し、基準データとともに管理することで、同じ問題の再発を防ぎやすくなります。
現場での点群取得から出力、共有までの流れをまとめて見直したい方は、次にLRTK Phoneの活用方法をご確認ください。