GoogleColbでメッシュファイル(OBJ)をtrimeshでとpyplotで表示
ご無沙汰しています。
banhmiloveはなかなか進んでいないのですが
その間にかなり私自身プロンプトプログラマーとしては進化しています。
サボっていたわけではなく、業務に使うテンプレートをたくさん作っていました。
これでモックアップを爆速で作れます。
それはさておき、今回はLiDARスキャンしたデータをなんとか軽くできないかというお題です。エンジニアに宿題としてお願いしているのですが自分でも概要理解などのためにやっておきたいというのが動機です。
自分のPCでやったらうまくいかなかったのでgoogle colabのGPUを使ってトライしました。といってもまずは表示するだけ。
複雑にすると、環境やらライブラリの干渉やらでメンドくさいんですね。
少しづつ進めましょう。
これも結構重要なノウハウ。
さて始めましょう。
データの準備
スキャンしたデータをexportしました。
Google Driveをマウントして、そこにミッツのファイルを入れました。
mesh.objとmes.mtlとtexuture.jpg
from google.colab import drive
drive.mount('/content/drive')
3つのファイルの役割
1. mesh.obj
役割: OBJファイルは、3Dモデルのジオメトリ情報を格納するファイル形式です。このファイルには、モデルの頂点(vertices)、エッジ(edges)、面(faces)などの情報が含まれています。
内容:
頂点座標: 3D空間内の各頂点の位置 (v x y z)。
法線ベクトル: 各面の向きや光の反射方向を表すための法線 (vn x y z)。
テクスチャ座標: テクスチャ画像がどのようにメッシュに貼り付けられるかを指定するための2D座標 (vt u v)。
面情報: 各面がどの頂点、法線、テクスチャ座標で構成されているかを定義するインデックス (f v/vt/vn)。
2. mesh.mtl
役割: MTLファイルは、OBJファイルに関連するマテリアル情報を格納するためのファイル形式です。このファイルには、モデルの表面特性、色、テクスチャマッピングに関する情報が含まれています。OBJファイル内で参照されることによって、メッシュに対して適切なマテリアルやテクスチャが適用されます。
内容:
マテリアル名: 特定のマテリアルを識別するための名前 (newmtl material_name)。
拡散反射色: メッシュの基本色 (Kd r g b)。
環境反射色: 周囲光に対するメッシュの反射色 (Ka r g b)。
鏡面反射色: 光源からの反射の際のメッシュの光沢 (Ks r g b)。
テクスチャマップ: テクスチャ画像のファイルパスを指定するための設定 (map_Kd texture.jpg)。
3. texture.jpg
役割: このファイルは、メッシュに対して適用されるテクスチャ画像を含んでいます。テクスチャ画像は、3Dモデルの外観をよりリアルにするために使用され、色や模様、ディテールを提供します。MTLファイル内で指定され、OBJファイルに読み込まれることで、3Dモデルに適用されます。
内容: 一般的な画像ファイル(JPEG形式の場合texture.jpg)であり、モデルの表面にマッピングされる画像データが含まれています。
まとめると:
mesh.obj: 3Dモデルの形状や構造(頂点、エッジ、面など)を定義するファイル。
mesh.mtl: モデルに適用されるマテリアルやテクスチャに関する情報を定義するファイル。
texture.jpg: モデルの表面に適用される具体的なテクスチャ画像。
これら3つのファイルが組み合わさることで、3Dオブジェクトが正しく表示され、見た目がリアルに再現されるようになります。
今回はOGJファイルを表示することをゴールにするので
mesh.objを表示させます。
OBJファイルを表示してみる
使用するライブラリ
trimesh: 3Dメッシュデータの読み込み、操作、表示を行うためのPythonライブラリ。多くの3Dフォーマットに対応しており、簡単に3Dデータを処理できます。
scipy: 科学計算用のライブラリ。trimeshの内部で使用されます。
matplotlib: 2Dおよび3Dのプロットを作成するためのライブラリ。trimeshでの3Dメッシュ表示に加え、プロットを通じたデバッグにも利用できます。
pyglet: Pythonでのクロスプラットフォームなウィンドウシステム。trimeshの3Dビューアで使用されます。
GoogleColabに上記をインストールします。
!pip install trimesh scipy matplotlib pyglet
Google driveからmesh.objを読み込みます。
import os
import trimesh
# ファイルパスを設定
file_path = os.path.join('/content/drive/MyDrive/Colab_Notebooks', 'mesh.obj')
# ファイルが存在するか確認
if os.path.exists(file_path):
print(f"File found at: {file_path}")
# メッシュの読み込み
mesh = trimesh.load(file_path)
print("Mesh loaded successfully.")
print(f"Number of vertices: {len(mesh.vertices)}")
print(f"Number of faces: {len(mesh.faces)}")
else:
print(f"File not found at: {file_path}")
Mesh loaded successfully.
Number of vertices: 69386
Number of faces: 107882
Number of vertices: 69386
メッシュモデルには69386個の頂点(ポイント)が含まれていることを示しています。各頂点は3D空間内の座標を持ちます。Number of faces: 107882
メッシュモデルには107882個の面(ポリゴン)が含まれていることを示しています。各面は複数の頂点によって構成されます(通常は三角形や四角形)。
Meshを表示
# メッシュの表示
mesh.show()
matplotlibを使用した描画
matplotlibを使ってメッシュの頂点を3Dで表示することもできます。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# メッシュの頂点をプロット
ax.plot_trisurf(mesh.vertices[:, 0], mesh.vertices[:, 1], mesh.vertices[:, 2], triangles=mesh.faces, cmap='viridis', edgecolor='none')
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('3D Mesh Plot')
plt.show()
まとめ
Google Colabでmesh.objファイルを描画してみました。
今回はtrimeshとmatplotlibのpypplotでやってみました。
meshやpointcloud処理を色々試したいと思います。