LRTKレフィクシア株式会社

点群OBJのMTLを複数指定すると材質が消える原因と4つの確認

点群OBJとMTLの関係を理解する

点群 OBJ アップロードを行った後、形状や点の位置は表示されるのに、色や材質だけが再現されないことがあります。特に、一つのOBJファイルから複数のMTLファイルを参照している場合は、作成元では正常に見えていても、別の表示環境へ取り込むと無地になる、特定の範囲だけ既定色になる、意図しない材質へ置き換わるといった現象が起こることがあります。

この問題を切り分けるには、OBJとMTLがそれぞれ何を記録する形式なのかを整理する必要があります。OBJファイルには、幾何頂点を示すv、テクスチャ座標を示すvt、法線を示すvn、面を示すf、線を示すl、点要素を示すp、グループ名、オブジェクト名、使用する材質名などを記述できます。一方、MTLファイルは、OBJから名前で参照される材質について、拡散色、反射特性、透明度、テクスチャ画像などの表面表現を定義するための補助ファイルです。

OBJ内でMTLを参照する代表的な命令がmtllibです。たとえば、mtllib site_material.mtlと記述されていれば、site_material.mtlという材質ライブラリを参照する意図を表します。usemtlは、その後に続く要素へ割り当てる材質名を指定します。usemtl ground_surfaceと書かれている場合は、参照対象のMTL内にあるnewmtl ground_surfaceという定義との対応が必要です。

ここで注意したいのは、OBJのv行が幾何頂点を定義するだけで、必ずしもそれだけで表示対象の点要素を構成するとは限らないことです。標準的なOBJには点要素を示すpがありますが、点群変換ソフトやビューアの中には、v行だけを独自に点群として表示するものもあります。そのため、作成元で点群として表示できても、アップロード先が同じ解釈をするとは限りません。

また、MTLは主として面や曲面の表面材質を表す仕組みとして普及しています。点要素に対するusemtlの扱い、v行へ独自に付加されたRGB値の扱い、点の大きさや描画方法は、読み込み側の実装に左右されます。OBJの標準的な頂点定義は座標を中心としたものであり、v x y z r g bのような頂点色は一部のソフトが採用する拡張です。点ごとの色を確実に受け渡したい場合は、アップロード先がその拡張を認識するかを確認しなければなりません。

面モデルで画像テクスチャを再現する場合は、MTLのmap_Kdなどが画像を参照しているだけでは不十分です。OBJ側にvtがあり、fの各頂点参照に対応するテクスチャ座標番号が含まれている必要があります。画像ファイルが存在していてもUV情報が欠けていれば、画像をどの位置へ貼るか決められず、単色表示や不正な貼り付けになる可能性があります。

このように、材質が消えたときは、MTLファイルの有無だけを確認しても原因を特定できません。OBJ内の要素種別、mtllib、usemtl、newmtl、テクスチャ座標、画像ファイル、複数ライブラリの検索順、アップロード先の実装を順番に確認する必要があります。

MTLを複数指定すると材質が消える主な原因

複数のMTLを指定したOBJで材質が消える原因は一つではありません。実務では、参照名の不一致、材質名の衝突、パスの崩れ、UV情報の不足、読み込み側の対応差などが組み合わさって発生します。

OBJの仕様上、mtllibには複数のMTLファイル名を並べて指定できます。元の仕様では、usemtlで求める材質定義を、mtllibに列挙されたライブラリの先頭から順に検索する考え方が示されています。そのため、複数のMTLに同じnewmtl名が存在すると、先に見つかった定義が選ばれる構成になり得ます。ただし、実際のインポーターが必ず同じ検索方法を実装しているとは限りません。すべてを一つの辞書へ結合するもの、後から読んだ定義で置き換えるもの、一つ目のMTLしか処理しないものなど、実装差が材質消失や置換の原因になります。

mtllibの書き方も互換性に影響します。一つのmtllib行へ複数のファイル名を並べる書き方は仕様上想定されていますが、出力ソフトによってはmtllibを複数行に分ける場合があります。読み込み側がどちらの形式にも対応していれば問題ありませんが、特定の書き方だけを処理する実装では、二つ目以降のライブラリが無視される可能性があります。

次に多いのが、複数MTL間の材質名重複です。たとえば、north.mtlとsouth.mtlの両方にnewmtl surfaceがあると、OBJ内のusemtl surfaceはファイル名まで指定して材質を選べません。usemtlが参照するのは材質名であり、どのMTLに属する同名材質かを明示する構文ではないため、検索順やインポーターの統合方法に結果が左右されます。

ファイル名やパスの不一致も重要です。OBJ内のMTL名と実際のMTLファイル名が一致していない場合、材質ライブラリを読み込めません。大文字と小文字、全角と半角、空白、記号、拡張子、連番の違いは、作成元では許容されても別環境では別名として扱われることがあります。

MTL自体は読めていても、MTLから参照される画像が不足している場合があります。map_Kdで指定した画像が見つからないと、Kdの基本色だけが使われる、既定色になる、材質の一部が無視されるなど、表示結果は実装によって変わります。画像へ見た目の大部分を依存している材質ほど、画像参照切れの影響が大きくなります。

画像が存在していても、OBJ側のvtや面のテクスチャ座標参照が欠けていれば、画像テクスチャは正しく配置できません。MTLと画像だけを確認し、OBJ内のUV情報を見落とすと、参照パスを修正しても表示が直らないことがあります。

文字コードや改行の違いも、材質名やファイル名に日本語、空白、特殊文字を含む場合には影響する可能性があります。OBJとMTLはテキスト形式ですが、すべての読み込み環境が同じ文字コードや引用符の扱いをするわけではありません。画面上で同じ名称に見えても、内部では異なる文字列として扱われることがあります。

点群OBJでは、さらに要素表現を確認する必要があります。pで点要素を定義しているのか、vだけを並べてビューア独自の点群解釈に依存しているのか、面へ変換されているのかによって、材質の適用対象が変わります。点ごとの色が必要な場合、MTLによる表面材質と頂点色拡張を同じ仕組みと考えないことが重要です。

このように、材質が消える現象は、OBJ、MTL、画像、UV、ファイル構成、アップロード先の解釈という複数の層で発生します。原因を効率よく特定するには、確認対象を四つに分けて一つずつ検証します。

確認1:OBJ内のmtllibとusemtlの対応を確認する

最初に確認するのは、OBJ内のmtllibとusemtlが、実際のMTLファイルおよびnewmtl定義と正しく対応しているかです。ここに不整合があると、画像や表示設定を変更しても材質は復元されません。

まずOBJファイルをテキストとして開き、mtllibの記述を探します。複数のMTLを利用している場合は、一つの行に複数名が並んでいるのか、複数のmtllib行があるのかを確認します。仕様上可能な書き方であっても、アップロード先の実装が同じ形式を処理できるかは別問題です。

mtllibに書かれたファイル名と、実際のMTLファイル名を一文字ずつ照合します。拡張子を含めて一致していることが基本です。OBJ内ではsite_material.mtlとなっているのに、実ファイルがsite_material_01.mtlであれば参照は成立しません。

大文字と小文字にも注意します。作成時の環境ではMaterial.mtlとmaterial.mtlを同じものとして扱えても、別の環境では異なるファイル名として扱われることがあります。移行時の不具合を減らすには、半角英小文字、数字、アンダースコアを中心に統一し、参照記述と実ファイル名を完全にそろえます。

次に、OBJ内のusemtlを調べます。usemtlの後ろに記述された材質名が、参照対象のいずれかのMTL内にnewmtlとして存在する必要があります。OBJにusemtl soilと書かれているなら、検索対象となるMTL内にnewmtl soilが必要です。

材質名の前後に不要な空白や制御文字が入っていないかも確認します。変換やコピーを繰り返したファイルでは、末尾の空白、文字化け、似た別文字などによって、見た目は同じでも一致判定に失敗することがあります。

usemtlは、その後に続く要素へ材質を割り当て、次のusemtlが現れるまで同じ指定を継続するのが基本です。面モデルであれば、usemtlの後に対象となるfがあるかを確認します。点群として扱う場合は、pがあるか、またはアップロード先がvだけのデータを点として解釈する仕様かを確認します。

v行だけが大量に並び、p、l、fなどの要素がない場合は、作成元が独自に頂点を点群表示している可能性があります。別の環境では要素がないデータとして扱われる、点は表示してもMTLを適用しない、頂点色拡張だけを読むなど、結果が分かれます。この状態をMTL破損と断定してはいけません。

確認を簡単にするには、小さな検証用OBJを作ります。一つのMTL、一つのnewmtl、一つのusemtl、少数の面または点要素だけに絞り、基本色だけで表示を確認します。この最小構成で材質が表示されれば、基本的な参照関係は成立しています。その後、MTLや材質、画像を一つずつ追加すれば、どの段階で表示が崩れるかを特定しやすくなります。

確認2:複数MTL間の材質名重複を確認する

二つ目の確認は、複数のMTLに同じ材質名が定義されていないかです。複数MTLを利用したときだけ表示が変わる場合は、材質名の重複を優先して調べます。

MTLではnewmtlの後ろに材質名を記述します。OBJはusemtlで指定された名前を手掛かりに材質を探しますが、usemtlにはMTLファイル名を組み合わせて指定する仕組みがありません。そのため、同名材質が複数ライブラリに存在すると、検索順や読み込み実装によって選ばれる定義が変わる可能性があります。

元の仕様に沿って複数ライブラリを先頭から検索する実装では、最初に見つかった同名材質が使われます。しかし、実務で利用されるすべての読み込み処理が同じ挙動をするとは限りません。ライブラリを結合して後の定義で置き換える実装や、重複を警告または無視する実装も考えられるため、同名材質を残したまま互換性を期待するのは安全ではありません。

たとえば、一つ目のMTLにnewmtl surfaceがあり地表画像を参照し、二つ目のMTLにもnewmtl surfaceがあり単色を指定している場合、どちらが使われるかによって見た目が変わります。材質が完全に消えたように見えても、実際には別の同名定義が選ばれ、画像参照や色設定が異なっていることがあります。

材質名の重複は、複数の作業範囲を別々に書き出し、後から一つのOBJやアップロード単位へまとめた場合に起こりやすくなります。個別のデータではDefault、Material、Surface、Groundなどの一般的な名称でも問題ありませんが、統合後は衝突しやすくなります。

この問題を避けるには、材質名をデータ全体で一意にします。単純な連番だけでなく、対象範囲や用途が分かる接頭語を付けると管理しやすくなります。北側と南側の表面材質を分けるなら、north_surfaceとsouth_surfaceのように区別します。

材質名を変更するときは、MTL内のnewmtlだけでなく、OBJ内の対応するusemtlも同じ名前へ変更します。片方だけを変更すると参照が切れます。同じ材質を複数箇所で使っている場合は、すべてのusemtlを漏れなく更新します。

大文字と小文字を混在させないことも重要です。ground、Ground、GROUNDを別名として扱う環境がある一方、変換処理の途中で正規化され、衝突する可能性もあります。命名規則を決め、同じ意味の材質に複数表記を使わないようにします。

日本語を含む材質名は作業者に分かりやすい場合がありますが、文字コードや変換処理の影響を受ける可能性があります。複数の環境を経由する点群 OBJ アップロードでは、半角英数字とアンダースコアを中心にすると、文字化けや区切り解釈の差を抑えやすくなります。

複数MTLを維持する必要がなければ、一つのMTLへ統合する方法もあります。統合前にnewmtl名を一意化し、画像名も重複しないよう整理したうえで、OBJのmtllibを一つにすれば、検索順に依存する要素を減らせます。ただし、単純にファイル内容を連結するだけでは同名材質が残るため、参照名の整理が必要です。

確認3:MTLとテクスチャの参照パスを確認する

三つ目の確認は、MTLファイルとテクスチャ画像の参照関係です。OBJからMTLを読み込めても、MTLから画像を読み込めなければ、写真や模様を使った材質は再現できません。

MTLでは、Kdなどで基本色を指定し、map_Kdなどで画像ファイルを参照できます。map_Kdがある材質では、画像の色と基本色を組み合わせて表示する実装が一般的ですが、対応する命令や計算方法は読み込み側によって差があります。画像が見つからない場合にKdだけを使うか、既定色にするか、材質を無視するかも一様ではありません。

よくある問題は、作成時の端末に依存した絶対パスが残っていることです。特定のドライブ名や利用者フォルダーから始まるパスは、別の端末やアップロード先では同じ場所を参照できません。作成元で表示できても、受け渡し後に画像を見つけられない状態になります。

点群 OBJ アップロードでは、OBJ、MTL、画像を同じフォルダーへまとめ、MTLから画像を単純な相対参照で指定する構成が扱いやすい場合があります。ただし、アップロード先がどの階層を基準に相対パスを解決するか、複数ファイルのフォルダー構造を保持するかは事前に確認します。

複数ファイルを一括選択する方式では、元の階層が保持されず、ファイルが同じ場所へ集められる場合があります。その状態でMTLにtextures/surface.jpgのような階層付き参照が残っていると、画像を見つけられない可能性があります。反対に、階層を保持して取り込む方式では、画像を同じ場所へ移動したことで参照が切れることもあります。

ファイル名の空白や特殊文字にも注意します。map_Kd ground texture.jpgのような記述は、読み込み側が空白を引数の区切りとして扱い、意図した一つのファイル名として解釈しない可能性があります。引用符に対応する実装もありますが、互換性を優先するなら、半角英小文字、数字、アンダースコアを基本にします。

画像の拡張子だけを変更したファイルにも注意が必要です。ファイル名の末尾を書き換えても、画像内部の形式は変換されません。拡張子と実データが一致しないと、読み込みに失敗することがあります。画像形式は実際に変換し、アップロード先が対応する形式を選びます。

大文字と小文字も照合します。MTLにsurface.jpgと書かれているのに、実ファイルがSurface.JPGである場合、環境によっては別ファイルとして扱われます。OBJからMTLへの参照と同様に、MTLから画像への参照も完全一致させます。

複数MTLから同名画像を参照している場合も注意が必要です。別々のフォルダー内で異なるtexture.jpgを利用できていても、アップロード時に一つの階層へまとめられると、上書きや取り違えが起こる可能性があります。画像名もデータ全体で一意にします。

さらに、面モデルで画像テクスチャを使う場合は、OBJ内のUV情報を確認します。vtが存在するか、fがv/vtまたはv/vt/vnの形で正しいテクスチャ座標を参照しているかを調べます。map_Kdのパスが正しくても、面がvtを参照していなければ、画像の配置情報がありません。

点群OBJでは、面のUVマッピングを前提とするテクスチャと、点ごとの色を区別します。点を写真のように着色したい場合、画像ファイルとMTLだけでは目的を達成できないことがあります。頂点色拡張、別の点群形式、アップロード先固有の色情報など、利用環境が対応する方法を選ぶ必要があります。

確認4:アップロード先の複数MTL対応状況を確認する

四つ目の確認は、アップロード先が複数MTLと各材質表現をどこまで処理できるかです。OBJやMTLの記述が妥当でも、読み込み側の機能範囲によって材質が再現されない場合があります。

OBJとMTLは広く利用されていますが、すべての命令がすべての環境で同じように実装されているわけではありません。幾何形状だけを読み込む環境、一つのMTLだけを処理する環境、Kdには対応してもmap_Kdを無視する環境、透明度や反射設定を限定的に扱う環境があります。

複数MTLでは、mtllibへ列挙したすべてのファイルを読み込むか、複数行のmtllibを処理するか、同名newmtlをどの順序で解決するかを確認します。仕様上の記述が正しくても、実装が機能の一部にしか対応していなければ、二つ目以降の材質が見つからないことがあります。

この場合は、複数MTLのまま記述方法だけを何度も変えるより、一つのMTLへ統合した検証版を作る方が切り分けやすくなります。材質名と画像名を一意にし、OBJから一つのMTLだけを参照する構成で表示できれば、複数ライブラリの読み込み処理が原因である可能性が高まります。

ただし、MTLを統合しても、点群への材質適用に対応していなければ表示は改善しません。pで定義した点、vだけを独自に点表示するデータ、面へ変換されたデータでは、同じOBJ拡張子でも読み込み側の処理経路が異なることがあります。

点の色を表示したい場合は、データにどの方法で色が保存されているかを確認します。MTLによる表面材質、map_Kdによる面テクスチャ、v行へ付加された非標準のRGB、アップロード先が別途保持する点属性は別の仕組みです。元の表示環境で色が見えるという事実だけでは、MTLが使われているとは断定できません。

ファイル規模や材質数に関する制限も、アップロード先ごとに確認します。表示用変換の過程で画像サイズ、画像形式、材質数、ファイル数などに制限が設けられている場合があります。ただし、これはOBJ形式そのものの一律な制限ではなく、利用するサービスやソフトの仕様です。根拠なく「大規模だから材質が削除された」と断定せず、公開仕様、エラー表示、処理ログ、検証データで確認します。

対応範囲を調べるには、小規模な検証データを段階的にアップロードします。一つのMTLと一つの基本色、二つのMTL、複数材質、画像付き材質、UV付き面、点要素という順に条件を増やすと、どの機能から再現されなくなるかを把握しやすくなります。

一つのMTLでは表示でき、複数に分けたときだけ消える場合は、複数MTLの処理または同名材質の解決を疑います。MTLを統合しても画像だけが消える場合は、画像パス、画像形式、UVを優先して確認します。基本色も表示されない場合は、MTL自体を処理していないか、対象要素への材質適用に対応していない可能性があります。

点群 OBJ アップロードの結果だけで原因を断定せず、ファイル構成を一要素ずつ変えて比較することが重要です。

点群OBJアップロード前にファイル構成を標準化する

材質消失のトラブルを減らすには、問題が起きてから修正するだけでなく、アップロード前のファイル構成を標準化することが効果的です。

まず、OBJ、MTL、テクスチャ画像を一つの作業単位として管理します。OBJだけを別の場所へ移動すると、MTLや画像との相対関係が崩れます。作業中から同じ受け渡し単位へまとめておけば、移動や共有による参照切れを防ぎやすくなります。

次に、ファイル名、材質名、画像名の命名規則を統一します。半角英小文字、数字、アンダースコアを基本とし、空白、全角文字、特殊記号を避けると、環境差による問題を減らせます。

名称には対象範囲を識別できる情報を含めます。複数区画を統合する場合は、区画名、取得時期、データ種別などを組み合わせ、同名ファイルや同名材質が発生しないようにします。すべてのMTLをmaterial.mtl、すべての画像をtexture.jpgとすると、個別管理では問題がなくても、統合時に衝突しやすくなります。

複数MTLを使用する必要がなければ、アップロード前に一つへ統合する運用も有効です。統合によって、検索順、複数行の解釈、二つ目以降のライブラリ無視といった不確定要素を減らせます。

統合時には、各newmtlの名称が一意であることを確認し、OBJ内のusemtlも一致させます。画像名も重複させず、map_Kdなどの参照先を更新します。単純なファイル連結だけでは、同名材質や同名画像の問題が残ります。

面テクスチャを使用する場合は、OBJのvtとfの参照も検査対象に含めます。MTLと画像を一式で保存しても、UV情報が欠けていれば画像は正しく再現されません。書き出し設定でテクスチャ座標を含めるか、アップロード用ファイルに実際にvtが出力されているかを確認します。

点群として扱う場合は、pを使うのか、頂点色拡張を使うのか、別形式へ変換するのかを決めます。作成元のビューアがv行をそのまま点表示できるからといって、受け渡し先でも同じとは限りません。点群の色を成果物要件に含めるなら、対応形式を先に決めることが重要です。

アップロード前の確認用として、材質を簡略化した版を作る方法もあります。基本色だけのMTLで正常に表示できれば、OBJからMTLへの参照が成立していると判断しやすくなります。その後、画像とUVを追加して表示が崩れた場合は、テクスチャ側へ原因を絞れます。

元データとアップロード用データを分けて保管することも大切です。原因調査のためにOBJやMTLを書き換えると、どの変更が結果へ影響したか分からなくなることがあります。変換前の原本を残し、検証用の複製に一項目ずつ変更を加えます。

材質が消えたときの切り分け手順

点群 OBJ アップロード後に材質が消えた場合は、最初からすべてのファイルを修正するのではなく、原因範囲を狭めながら確認します。

最初に、形状または点の位置が正常に表示されているかを確認します。形状も欠けている場合は、MTLだけでなく、OBJの構文、頂点番号、要素定義、ファイル容量、変換処理などを確認する必要があります。幾何情報が表示され、材質だけが再現されない場合は、MTL、画像、UV、材質対応を中心に調べます。

次に、OBJにmtllibが存在するか、参照名が実ファイルと一致するかを確認します。複数名がある場合は、すべてのMTLがアップロード対象へ含まれているか、同じ階層関係を保っているかを調べます。

その後、OBJ内のusemtlとMTL内のnewmtlを照合します。OBJで使用されている材質名が、検索対象のMTLに存在しなければ材質は適用されません。大文字と小文字、空白、文字コード、似た文字も含めて確認します。

参照関係に問題がなければ、複数MTLを一つに統合した検証用データを作ります。統合版で表示できる場合は、複数MTLの読み込み、材質検索順、同名newmtlの衝突が原因である可能性があります。

統合版でも表示できない場合は、画像参照を外し、Kdだけを設定した単純な材質へ変更します。基本色が表示される場合は、map_Kdのファイル名、画像形式、相対パス、階層構造、画像名の重複を確認します。

基本色は表示されるが画像だけが表示されない場合は、OBJ内のvtとfのテクスチャ座標参照を確認します。画像が存在してもUVがなければ正しい貼り付けはできません。面の一部だけ画像が崩れる場合は、該当するfのvt番号が範囲内か、並びが正しいかも確認します。

基本色も表示されない場合は、アップロード先がMTLを処理していないか、対象要素への材質適用に対応していない可能性があります。特に点群OBJでは、pを使った点要素、vだけの独自点群、頂点色拡張、面モデルを区別します。

この段階では、同じMTLを使った小さな面モデルを用意すると判断しやすくなります。面モデルでは表示でき、点群では表示できない場合、MTL自体よりも点群表現または点要素への材質対応が原因と考えやすくなります。

一部分だけ材質が消える場合は、その部分より前にあるusemtlを確認します。材質切り替えが抜けている、誤った名前が指定されている、データ結合時にusemtlが失われた、該当面がUVを参照していないなどの可能性があります。

別の材質へ置き換わる場合は、同名newmtlの重複を疑います。複数MTLの検索順または読み込み側の結合方法によって、意図しない定義が選ばれている可能性があります。

すべてが白や灰色になる場合は、MTLが見つからない、newmtlが一致しない、画像が読めず既定色になっている、Kdが既定値として処理されているなど複数の可能性があります。黒く見える場合も、材質だけでなく、法線、照明、透明度、両面表示などの解釈が関係するため、色だけで原因を断定しません。

切り分けでは、一度に複数項目を変更しないことが重要です。MTL統合、材質名変更、画像変換、パス変更、UV再出力を同時に行うと、どの修正が有効だったか分からなくなります。一項目ずつ変更し、同じ条件でアップロードして結果を記録します。

点群OBJの材質管理で避けたい運用

複数MTLのトラブルは、書き出し設定だけでなく、日常的なファイル管理によっても発生します。

避けたいのは、OBJだけを単独で共有する運用です。送付側では材質が表示されていても、受け取り側にMTLや画像がなければ見た目は再現されません。面テクスチャを使う場合は、OBJ内のUVも含め、必要ファイルを一式として扱います。

ファイル名を共有後に変更することも参照切れの原因になります。整理のためにMTLや画像の名前だけを変更すると、OBJやMTL内に残った参照名と一致しなくなります。名称を変更するときは、参照元の記述も同時に更新します。

複数の担当者が同じ材質名を自由に使用する運用も避けます。各担当者がDefaultやMaterialのような名称で書き出すと、統合時に重複します。作業開始前に命名規則を決め、担当範囲や用途を識別できる名称を使用します。

同名の画像を異なる内容で使用することも危険です。別フォルダーでは問題がなくても、アップロード時に階層が失われると上書きや誤参照が起こります。画像名にも区画や材質を表す識別子を入れます。

作業端末内の絶対パスに依存したまま共有することも避けます。作成時のフォルダーを参照するMTLは、別の端末やクラウド環境では利用できません。共有用データでは、受け渡し先が保持できる単純な相対構成を使用します。

作成元のビューアで見えることだけを互換性の証拠にする運用にも注意します。v行へRGBを付加する頂点色、vだけを点表示する処理、複数mtllib行の処理などは、作成元の独自対応かもしれません。成果物として渡す前に、実際のアップロード先で確認します。

元ファイルへ直接修正を重ねる運用も避けます。材質名やパスを何度も書き換えると、修正前の状態へ戻れなくなります。原本、統合前、アップロード用、検証用を区別して保存します。

表示できたかどうかだけで確認を終えることも避けたい運用です。全体表示では問題がなくても、一部の材質が別定義へ置き換わっている、画像の向きが違う、UVがずれている可能性があります。材質の切り替わる境界や、複数MTLにまたがる範囲も確認します。

現場で点群データを扱いやすくする考え方

点群OBJの材質問題を減らすには、ファイル形式の知識だけでなく、取得から共有までのデータの流れを単純にすることが重要です。

形式変換を繰り返すほど、材質名、画像名、座標、単位、ファイル階層、頂点色、UVなどが変化する可能性が高まります。取得した点群を別形式へ変換し、さらにOBJへ変換し、材質を追加し、複数MTLを参照させる流れでは、どの工程で不整合が生じたのか追跡しにくくなります。

そのため、データ取得時点から、最終的にどの環境へアップロードするかを想定します。アップロード先が必要とする情報が座標と点の位置だけであれば、複雑なMTL構成を追加する必要がない場合があります。反対に、写真に近い表面表現が重要であれば、面、UV、MTL、画像を一式で維持できる方法が必要です。

点群の色を保持したい場合は、その色がMTLによる面材質なのか、map_Kdによる面テクスチャなのか、点ごとの色情報なのかを区別します。見た目が似ていても内部の保存方法は異なります。点群表示を主目的とする環境では点属性に対応した形式を選び、面モデルを表示する環境ではMTLとUVを利用するなど、用途に合った受け渡し方法を選びます。

現場で取得した三次元データを効率よく共有するには、変換回数を減らし、取得、確認、アップロード、共有の流れを一貫させる方法が有効です。LRTK Phoneを活用する場合も、取得したデータを最終的にどの形式で書き出し、どの環境で確認するかを先に決めておくと、不要な変換や参照切れを減らしやすくなります。

どの方法を採用する場合でも、アップロード先で扱える要素、材質、画像、点色情報を事前に確認する必要があります。元データが十分な情報を持っていても、受け渡し形式と読み込み仕様が合っていなければ、材質や色情報が再現されない可能性があります。

点群OBJを成果物として使用するときは、形状や点が読み込めることだけを完了条件にしません。座標、縮尺、向き、点要素、面、材質、UV、画像、対象範囲が目的どおりに再現されているかを確認します。ファイル名や材質名の規則も、成果物の再現性を支える重要な要素です。

まとめ

点群OBJで複数のMTLを指定したときに材質が消える原因は、MTLファイルの不足だけではありません。OBJ内のmtllibとusemtlの不一致、複数MTLにおけるnewmtl名の重複、画像参照の切断、UV情報の不足、点群表現とアップロード先の対応差など、複数の要素が関係します。

最初の確認では、OBJに記述されたMTL名と実ファイル名が一致しているか、usemtlで指定された材質が参照対象のMTL内にnewmtlとして存在するかを調べます。usemtlの後に、材質を適用する面や点要素があるかも確認します。

次に、複数MTLで同じ材質名が使われていないかを確認します。usemtlはMTLファイル名まで指定しないため、同名材質があると検索順やインポーターの実装差に影響されます。材質名を全体で一意にし、必要に応じて一つのMTLへ統合します。

その後、MTLから画像への参照を確認し、ファイル名、大文字と小文字、階層、画像形式、同名画像の上書きを調べます。面テクスチャの場合は、OBJ内のvtとfのテクスチャ座標参照も欠かせません。

最後に、アップロード先が複数MTL、画像付き材質、点要素、v行の頂点色拡張などへ対応しているかを切り分けます。OBJの標準的な面材質と、点ごとの色は同じ仕組みではありません。作成元で色が見えるという理由だけで、MTLが正しく使われていると断定しないことが大切です。

原因調査を効率化するには、一つの材質だけを使った小規模版、一つのMTLへ統合した版、画像を外して基本色だけにした版、UV付きの面モデル、点要素だけの版を順に試します。一度に複数項目を変更せず、一つずつ条件を変えることで、問題が発生する地点を特定しやすくなります。

アップロード前には、OBJ、MTL、画像を一つの作業単位としてまとめ、ファイル名、材質名、画像名を一意にします。参照を単純な相対構成にし、点群として必要な色情報と、面モデルとして必要な材質情報を区別することが、環境差による不具合の防止につながります。

現場の三次元データを継続的に活用するには、取得後の形式変換だけでなく、取得から確認、共有までの流れを簡素化することが重要です。LRTK Phoneを含む取得手段を利用する場合も、最終的なアップロード先の対応形式を先に確認し、目的に合った点群または面モデルの受け渡し方法を選びます。

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

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