点群OBJアップロードで起きる面の頂点順の逆転とは
点群から生成したOBJをクラウド環境や3D閲覧システムへアップロードしたとき、特定の面だけが消えたり、モデルの内側が表に見えたりすることがあります。正面から見えるはずの面が表示されず、反対側へ回り込むと見える場合は、面を構成する頂点の巡回順が読み込み側の表面判定と合っていない可能性があります。
OBJでは、頂点座標を表すv行と、複数の頂点を参照して面を構成するf行を分けて記録できます。面を構成する頂点番号の並びは、形状の接続関係だけでなく、面の幾何学的な向きを求める基準にもなります。一般的なポリゴン描画では、画面へ投影した頂点が時計回りか反時計回りかによって表面と裏面を区別し、裏面を描画しない設定では反対向きの面が消えたように見えます。
たとえば、三角形が頂点1、頂点2、頂点3の順で定義されているとします。この並びを頂点1、頂点3、頂点2へ変更すると、三つの頂点座標は同じでも巡回方向が逆になり、外積で求められる幾何学的な面方向も反転します。ただし、どちらの巡回方向を表面と扱うか、読み込み時に座標軸を変換するか、両面を描画するかは閲覧環境によって異なるため、特定の表示結果だけで断定しないことが重要です。
点群OBJアップロードという表現は、点要素だけを含むOBJと、点群から表面を生成したメッシュOBJの両方に使われることがあります。頂点順による面の表裏が問題になるのは、f行を含むポリゴンメッシュです。点を表すp行だけを含み、面を表すf行がないOBJでは、面の巡回順や裏面カリングの問題は発生しません。
なお、v行が並んでいるだけのファイルを点群として表示できるかは、読み込み側の実装によって異なります。OBJの点要素として明示する場合は、頂点を参照するp行が使われます。利用者が点群として扱っているつもりでも、変換工程でf行が追加され、細かな三角形メッシュになっていることもあります。問題を切り分ける最初の作業は、対象OBJにf行が存在するかを確認することです。
面の頂点順が表示結果に影響する仕組み
OBJの幾何頂点はvから始まる行で記録され、通常はX、Y、Zの座標値が続きます。ファイル内に記述された順番に基づいて頂点番号が割り当てられ、f行はその番号を参照して面を定義します。OBJのインデックスは1から始まるため、最初の頂点は1です。
三角形の面であれば三つの参照が並び、四角形やそれ以上の多角形では四つ以上の参照が並ぶことがあります。f 1 2 3のように位置頂点だけを参照する形式のほか、f 1/1/1 2/2/2 3/3/3のように位置、テクスチャ座標、法線を別々の番号で参照する形式もあります。位置、テクスチャ座標、法線の各インデックスは独立しているため、面の頂点順を修正するときは法線やUVの対応を壊さないように扱う必要があります。
多くの描画環境では、面の表裏判定は投影後の頂点の巡回方向を基準に行われます。OBJに保存された頂点法線は主に陰影計算に使われ、通常の裏面カリング判定そのものを決める情報ではありません。そのため、面の巡回順が逆で法線だけが外向きでも、裏面カリングが有効なら面が非表示になることがあります。反対に、巡回順が正しく法線だけが逆なら、面は表示されても照明や陰影が不自然になる場合があります。
面の表裏が逆転していても、両面描画が有効であれば形状は見えることがあります。しかし、その状態では陰影が反転する、表裏で材質の見え方が変わる、断面や選択処理で意図しない結果になるなど、別の問題が残る可能性があります。両面表示は原因確認には役立ちますが、元データの修正とは分けて考える必要があります。
また、モデル全体が一括して反転する場合と、一部の連結面だけが反転する場合では、疑う工程が異なります。全体が裏返ったように見える場合は、負の拡大率や鏡像を含む座標変換が有力です。一部だけが逆向きなら、点群からの面生成、局所的な面編集、インデックスの再割り当て、異なるメッシュの結合などを確認します。
原因1 座標系変換で一部の軸が反転している
モデル全体の面方向が反転する代表的な原因は、座標系変換の途中で鏡像変換が入ることです。たとえば、X軸だけにマイナスを掛ける、一つの軸へ負の倍率を設定する、軸の入れ替えと符号変更を組み合わせた結果として左右が反転するといった処理が該当します。
三次元の回転や平行移動だけでは、面の巡回方向は通常維持されます。一方、変換行列の向きを反転させる鏡像変換では、空間の左右性が変わります。見た目の位置や寸法が合っていても、元のf行をそのまま使うと、変換後の幾何学的な面方向が反対になります。
点群や測量データの工程では、現場座標、ローカル座標、描画用座標などを経由することがあります。上方向として使う軸を変更したり、画面表示に合わせて座標の符号を変えたりする処理自体は珍しくありません。ただし、単なる軸の交換なのか、回転なのか、鏡像を含むのかを区別せずに設定すると、面方向だけが合わなくなることがあります。
特に注意したいのは、頂点座標だけへ変換を適用し、面の巡回順と法線を元のまま残すケースです。鏡像変換後には、面の巡回順を反転するか、変換方法を鏡像にならない構成へ変更し、法線も同じ座標変換に合わせて更新する必要があります。
モデル全体が反転している場合は、個々の面を手作業で直す前に変換式を確認します。どの軸を入れ替えたか、どの軸の符号を変えたか、拡大縮小率に負の値が含まれていないかを追跡します。座標変換を修正できるなら、最終OBJだけを後処理するより、変換元から正しい向きで書き出し直す方が再発を防ぎやすくなります。
原因2 書き出し時の面再構成で頂点順が乱れている
点群からメッシュを生成するとき、処理側は近接する点や推定した表面を基に三角形を構成します。元の点群に一貫した法線方向がない場合、どちら側を外側とするかを推定する必要があり、薄い部材、穴の周辺、近接する二つの面、密度差の大きい箇所では向きがそろわないことがあります。
点群の法線推定では、近傍点から局所的な面を求めても、その法線ベクトルには正負二つの候補があります。視点位置、センサー位置、連結関係、閉じた形状の内外などを利用して向きをそろえますが、観測位置が複雑に変わるデータや欠測が多いデータでは、一部の法線が逆向きのまま残ることがあります。その法線を基準に面を生成すると、局所的に巡回方向の異なる三角形が作られる可能性があります。
ノイズや孤立点が多い点群では、本来つながるべきでない点が接続されることもあります。極端に細長い三角形、面積がほぼゼロの三角形、折り返した面が生じると、陰影や裏面非表示で局所的な欠落として現れます。ただし、この場合は単純な頂点順の逆転だけでなく、形状そのものの誤接続が含まれているため、向きを反転するだけでは直らないことがあります。
書き出し後の軽量化や修復も確認対象です。頂点の統合、重複削除、面の再番号付け、連結成分の分割などで、位置頂点、UV、法線の参照関係を正しく更新できていないと、面が別の頂点を参照したり、属性だけがずれたりします。これは頂点順の反転とは別の破損ですが、見た目が似るため切り分けが必要です。
点群から最初に生成したメッシュは正常で、軽量化や結合後のOBJだけに異常が出る場合は、各処理直後の中間ファイルを比較します。元データから最終ファイルまでを段階ごとに保存しておくと、どの工程で面方向または参照関係が変わったかを確認しやすくなります。
原因3 多角形の三角形化結果が環境間で異なる
OBJでは三角形だけでなく、四角形やそれ以上の頂点を持つ多角形もf行で記述できます。多くの閲覧環境は描画時に多角形を三角形へ分割しますが、OBJに分割方法そのものが固定して保存されていない場合、書き出し側と読み込み側で異なる三角形化が行われることがあります。
正常な平面上の凸多角形で、頂点が輪郭に沿って一貫した順序に並んでいれば、通常の三角形化で面全体の巡回方向が突然逆になるとは限りません。問題になりやすいのは、頂点が同一平面上にない多角形、内側へへこんだ多角形、自己交差する多角形、重複頂点を含む面、輪郭順に並んでいない面です。このような面は、分割アルゴリズムによって対角線や生成される三角形が変わり、ねじれ、欠落、重なりとして見えることがあります。
書き出し元では独自の三角形化結果を使って表示している一方、OBJには元の多角形を保存している場合、アップロード先で別の結果になることがあります。その結果を利用者が面の反転と認識することはありますが、実際には多角形の非平面性や不正な頂点列が主因である場合もあります。
点群から生成したメッシュでは、穴埋め処理によって大きな多角形が残ることがあります。広い範囲を一枚の多角形で覆うほど、非平面性や凹形状の影響を受けやすくなります。アップロード後だけ面が乱れる場合は、書き出し前に三角形化を確定し、その三角形の巡回方向と形状を検証する方法が有効です。
三角形化は互換性を高める手段ですが、元の多角形が自己交差している、輪郭順が壊れている、面積がほぼゼロであるといった問題を自動的に解決するとは限りません。三角形化前の形状検査と、三角形化後の面方向確認を組み合わせます。
原因4 法線情報と面の頂点順が食い違っている
OBJには、位置頂点とは別にvn行で頂点法線を保存し、f行から位置、テクスチャ座標、法線を別々に参照できます。法線は主に照明計算や滑らかな陰影に利用されます。
面の頂点順から求められる幾何学的な方向と、保存された法線の方向が一致していれば、通常は自然な陰影になります。しかし、面を反転した後に法線の参照を更新していない、鏡像変換後に法線を適切に変換していない、異なる法線規則のデータを結合したといった場合は、面と法線が逆向きになります。
ここで重要なのは、一般的な裏面カリングが保存済みの頂点法線だけで決まるわけではないことです。面の巡回順が逆なら、法線が外向きでも裏面として除外される場合があります。一方、面の巡回順が正しく法線だけが逆なら、面は表示されても照明が暗くなる、光が当たる側が不自然になる、継ぎ目が目立つといった症状が出ます。
読み込み側がOBJの法線をそのまま使うか、読み込み時に再計算するかによって見え方は変わります。ある環境では正常で、別の環境では陰影が異常になる場合、OBJ内部の法線と面方向の不整合が環境差によって表面化している可能性があります。
負の倍率を使った反転、鏡像コピー、面の巡回順変更、複数モデルの結合後は、面方向と法線を別々に確認します。面が消える症状は巡回順とカリング設定を優先して調べ、陰影だけがおかしい症状は法線を優先して調べると、原因を混同しにくくなります。
原因5 複数データの結合や変換を重ねている
複数のOBJや点群由来のメッシュを一つに結合すると、一部だけ面方向が異なる状態になることがあります。各データが異なる軸方向、外側の定義、法線の向き、三角形化設定で作成されていると、単純に連結しただけでは表裏がそろいません。
一つ目のデータでは外側へ向くように面が構成され、二つ目では逆向きに構成されている場合、それぞれを両面表示で確認している間は問題に気付きにくいことがあります。結合後に裏面非表示の環境へアップロードすると、片方だけが欠落して見える可能性があります。
変換回数が多い運用も注意が必要です。点群形式から中間形式へ変換し、編集後に別形式へ保存し、さらにOBJへ戻す工程では、各段階で軸、単位、面方向、法線、UVの扱いが変わる可能性があります。中間形式が持つ情報とOBJが持つ情報が同じとは限らないため、変換のたびに属性が再生成されることもあります。
OBJの面参照には、ファイル先頭から数える正のインデックスだけでなく、現在位置から相対的に参照する負のインデックスも仕様上利用できます。したがって、負の値があるだけで不正とは判断できません。ただし、すべての変換ツールが相対参照を同じように扱うとは限らないため、互換性を重視する場合は書き出し先の対応状況を確認し、必要に応じて正の絶対参照へ正規化します。インデックス0はOBJの頂点参照として有効ではありません。
結合モデルを一括して反転すると、正常な部分まで逆向きになるおそれがあります。元データごと、部材ごと、連結した面のまとまりごとに方向を確認し、問題のある範囲だけを修正します。結合前に各データを同じ座標系と面方向へそろえる方が、後から全体を直すより安全です。
修正法1 軸反転と座標変換の設定を見直す
最初の修正法は、OBJを書き出す前後で行っている座標変換を確認することです。モデル全体が同じ向きに反転している場合は、個別の面編集より先に座標系の問題を調べます。
まず、元データのX、Y、Z軸が何を表しているかを整理します。次に、アップロード先で期待される上方向、横方向、奥行き方向との対応を確認します。軸の入れ替えだけなのか、回転が必要なのか、符号反転を含むのかを分けて考えます。
単純な回転と鏡像変換は、特定の方向から見ると似ている場合があります。しかし、面方向への影響は異なります。回転だけであれば、通常は面の巡回順を反転する必要はありません。一方、一つの軸へ負の倍率を掛ける鏡像変換では空間の向きが反転するため、面の巡回順と法線も整合させる必要があります。
座標変換を複数回実行している場合は、処理内容を一覧化します。軸入れ替え、原点移動、単位調整、回転、符号反転を別々に適用していると、反転の重複や打ち消しが分かりにくくなります。可能であれば、検証済みの一つの変換として管理します。
修正後は、位置と寸法だけでなく向きも確認します。上下が正しい、左右が鏡像になっていない、基準座標と合っている、外側から想定する面が見えるという観点で確認します。軸を示す非対称の検証モデルを同じ変換へ通すと、鏡像の有無を見つけやすくなります。
修正法2 面インデックスの巡回順を反転する
座標値が正しく、面の表裏だけが逆になっている場合は、面を構成する位置頂点の巡回順を反転します。三角形がf 1 2 3なら、f 1 3 2のように二つの頂点を入れ替えることで方向を反転できます。
四角形以上の面では、輪郭をたどる順番全体を逆にします。たとえばf 1 2 3 4は、始点を保つならf 1 4 3 2のように変更できます。番号を無作為に並べ替えると、自己交差やねじれた面になるため、単なる並べ替えではなく巡回方向の反転として処理します。
f行に位置、UV、法線が併記されている場合は、各面頂点の組を保ったまま順番を反転します。たとえば1/5/9という一組を分解して位置だけ入れ替えると、テクスチャや法線の対応が壊れます。面頂点単位で並びを逆にするか、編集ソフトの面反転機能を利用します。
モデル全体が反転している場合は、すべての面へ同じ処理を適用できます。一部だけが反転している場合は、問題のある連結成分や面群を選びます。閉じた立体では外側を推定できる機能が役立つことがありますが、地表のように開いた一枚面では外側を一意に決められません。その場合は上向き、観測側、利用者側など用途上の基準を決めます。
面の巡回順を修正した後は、法線とUVを確認します。法線を再計算する場合も、鋭い角と滑らかな面の扱いが変わることがあるため、形状だけでなく陰影とテクスチャも確認します。
修正法3 三角形化してからOBJを書き出し直す
多角形の解釈差が疑われる場合は、アップロード前に面を三角形へ分割し、分割結果をOBJへ保存します。三角形は三つの位置頂点で構成されるため、四角形以上の多角形と比べて読み込み側が独自に分割する余地が少なくなります。
三角形化前には、重複頂点、重複面、自己交差、輪郭順の乱れ、極端に短い辺、面積がほぼゼロの面を可能な範囲で整理します。壊れた多角形をそのまま三角形化すると、細長い面、重なった面、折り返した面が大量に生成されることがあります。
点群から作られた地形や構造物では、穴埋めによって大きな多角形ができている場合があります。書き出し前に三角形化を確定し、不自然に長い辺、境界をまたぐ面、裏向きの三角形がないかを確認します。三角形化後に面方向をそろえ、その状態を最終OBJへ保存します。
三角形化後は、表面方向を確認できる表示、陰影を確認する表示、ワイヤーフレーム表示を切り替えて検証します。形状のねじれ、面の向き、法線の不整合は症状が似るため、複数の表示方法で分けて確認します。
三角形化により面数が増えることがあります。アップロード容量や表示負荷を抑えるために面数削減を行う場合は、削減後にもう一度、境界、穴、面方向、法線、UVを確認します。面数削減が必ず面を反転させるわけではありませんが、再構成を伴う処理では結果検証が必要です。
修正法4 法線を再計算して面との整合を取る
面の巡回順や座標変換を修正した後は、必要に応じて法線を再計算します。面法線は位置頂点の巡回順から求められ、頂点法線は周囲の面法線を基に生成されることがあります。
閉じた立体モデルでは、連結した面を外側へそろえた後に法線を再計算する方法が有効です。ただし、穴があるモデル、地表のように閉じていないモデル、薄い一枚面では、自動的な内外判定が期待どおりにならない場合があります。その場合は、上向き、構造物の外向き、観測側など用途に合わせた基準を設定します。
法線を再計算する前に、同じ位置へ重なった重複面を削除します。反対向きの面が同じ場所に重なると、角度によってちらつく、材質が競合する、法線の平均が不安定になるといった症状が出ることがあります。これは頂点順だけを直しても解消しない場合があります。
頂点法線を使って滑らかに見せる場合は、平均化する範囲にも注意します。地形のような連続面では滑らかな法線が適することがありますが、建物や部材の角まで一律に平均化すると輪郭が丸く見えます。面方向の修正と、陰影の平滑化設定は別の作業として確認します。
最終OBJで法線を保存するのか、アップロード先で再計算させるのかも統一します。検証環境では再計算し、アップロード先では保存済み法線を使うと、確認時と公開後の見え方が変わることがあります。最終利用環境に近い条件で確認します。
修正法5 小さな検証データで変換工程を切り分ける
面の逆転を確実に直すには、大容量の本番データを何度も変換するより、小さな検証モデルで工程を確認する方法が有効です。単純な三角形、四角形、箱形状など、表裏と軸方向を判断しやすいモデルを用意し、本番と同じ手順でOBJを書き出します。
検証モデルは左右、前後、上下が区別できる非対称形状にします。対称な箱だけでは鏡像になっても気付きにくいため、片側だけに突起を付ける、上面だけ形を変える、軸方向ごとに長さを変えるなどの工夫が役立ちます。
最初に変換前のモデルを確認し、次に座標変換だけを適用した状態、三角形化した状態、法線を再計算した状態、軽量化した状態、最終OBJへ書き出した状態を順番に保存します。各段階で面方向表示と両面表示を切り替えれば、どの工程で巡回順や法線が変わったかを特定しやすくなります。
本番データでしか問題が起こらない場合は、異常箇所の周辺だけを切り出します。重複頂点、重複面、穴、非多様体の辺、極端に細い三角形、自己交差、複数面の重なりを調べます。単純な面反転で直るのか、形状修復が必要なのかを分けて判断します。
検証結果は、入力形式、軸対応、単位、変換順、三角形化、法線、面数削減、OBJ書き出し設定とともに記録します。同じ種類の点群OBJを継続して扱う場合、正常にアップロードできた条件を標準化することで、担当者や作業環境が変わっても結果をそろえやすくなります。
アップロード前に確認したい実務上のポイント
点群OBJアップロード前には、見た目だけでなくファイル構造も確認します。最初に、v行に加えてf行が存在するかを調べます。点要素だけのOBJと面を持つメッシュOBJでは、確認すべき項目が異なります。
面を含む場合は、すべてのf行が有効な位置頂点を参照しているかを確認します。OBJの頂点参照は1から始まり、0は有効な頂点番号ではありません。正の番号は先頭からの絶対参照、負の番号はその時点からさかのぼる相対参照として使用できます。ただし、負の相対参照への対応状況は読み込み環境によって差があり得るため、アップロード先の仕様を確認します。
f行にスラッシュ区切りがある場合は、位置、テクスチャ座標、法線のどれが省略されているかを確認します。v/vt/vn、v//vn、v/vtなどの形式があり、位置番号だけを見て機械的に置換すると属性参照を壊す可能性があります。
次に、極端に大きな座標値や、全体から離れた外れ頂点がないかを確認します。外れ頂点があると表示範囲が広がり、モデル本体が小さく見えるため、面が消えたと誤認することがあります。クリッピング範囲やカメラ位置の問題も、面方向の問題とは分けて確認します。
裏面表示を一時的に有効にして形状が現れるなら、面の巡回方向またはカリング設定が関係している可能性が高まります。ただし、両面表示でも見えない場合は、頂点参照の破損、面積ゼロ、クリッピング、透過、材質、表示上限など別の原因も検討します。
複数部材を結合したモデルでは、部材ごとに面方向を確認します。地表、壁、配管、薄板などが混在すると、自動的な外向き判定が一意にならない場合があります。用途ごとに上向きや外向きの基準を決め、連結成分単位でそろえます。
アップロード後は、正面だけで判断せず、上面、下面、側面、内部、断面を確認します。照明条件を変えたときに陰影が反転しないか、角度によって面が消えないか、テクスチャの表裏が入れ替わっていないかも確認します。
元ファイルは上書きせず、変換前、修正後、アップロード用を分けて保存します。問題が起きたときに一つ前の状態へ戻れるため、原因の切り分けと再現確認が容易になります。
点だけのOBJでは面の頂点順を確認できない
点群OBJアップロードのトラブルを調べる際は、対象ファイルに面が含まれているかを最初に確認します。OBJではv行で頂点を定義し、p行で一つ以上の頂点を点要素として参照できます。f行が存在しないファイルでは、ポリゴン面の巡回順、面法線、裏面カリングという問題は定義されません。
v行だけを含むOBJを点群として表示する実装もありますが、これはすべての読み込み環境で同じとは限りません。点要素としての互換性を確認する場合は、p行の有無とアップロード先のOBJ対応範囲を確認します。
点だけのOBJがアップロード後に一部見えなくなる場合は、面の頂点順ではなく、点サイズ、表示距離、間引き、座標範囲、クリッピング、描画上限、色情報、透過、点要素への対応などを調べます。
一方、点群から表面生成したOBJでは、見た目が点群に近くてもf行が含まれていることがあります。非常に細かな三角形で構成されていると点の集まりのように見えるため、利用者が面の存在に気付かない場合があります。
ファイルの先頭部分だけで判断せず、全体からf行を検索します。大量のv行の後に面がまとめて記述されていることが多いためです。f行があれば、本記事で説明した座標変換、巡回順、三角形化、法線、結合工程を確認します。
入力データを点要素、三角形メッシュ、多角形メッシュに分け、それぞれの検査手順を用意すると、不要な面反転や誤った修復を防ぎやすくなります。
まとめ
点群OBJアップロードで面が消える、内側が表に見える、角度によって表示が変わる場合は、f行の頂点巡回順と、アップロード先の表面判定が合っていない可能性があります。同じ三つの頂点でも、参照順を逆にすると幾何学的な面方向は反転します。
主な原因は、鏡像を含む座標変換、点群からの面生成で生じた局所的な向きの不整合、不正または非平面な多角形の三角形化差、面方向と保存済み法線の不整合、異なる条件で作られたデータの結合です。モデル全体が反転しているのか、一部の連結面だけが反転しているのかを確認すると、原因を絞り込みやすくなります。
修正するときは、最初に座標変換の内容を確認し、必要な面だけ巡回順を反転します。多角形が含まれる場合は形状を検査してから三角形化し、面方向をそろえた後に法線を再計算します。小さな非対称の検証モデルを本番と同じ工程へ通せば、どの処理で問題が起きたかを効率よく特定できます。
保存済みの頂点法線は主に陰影へ影響し、通常の裏面カリングは面の頂点巡回順を基に判定されます。法線だけを直して面の欠落が解消するとは限らないため、面方向と法線を別々に確認することが重要です。また、OBJの負のインデックスは相対参照として有効であり、負数があるだけで破損とは判断できません。
裏面を表示する設定は原因確認には役立ちますが、元データの表裏を修正するものではありません。別の閲覧環境や後工程でも安定して利用するには、OBJ内部の面巡回順、法線、UV、座標変換を整合させた状態でアップロードします。
現場で取得した点群の確認、整理、共有を一連の流れとして効率化する方法の一つとして、LRTK Phoneを用いた運用も検討できます。ただし、OBJの面方向やアップロード先との互換性は、使用する書き出し条件と閲覧環境に応じて個別に確認してください。