こちらは「trimesh」(Pythonライブラリ)のサンプルコードについての記事となっております。
その他、3Dモデルの処理方法についての情報は下記の記事で紹介しております。
open3d/plotly/trimesh/pyvista/vedo/pytorch3d/matplotlibといったPythonライブラリや3DツールのPythonAPIであるbpy(Blender)/unreal(Unreal Engine)といったPythonライブラリについて気になる方はこちらの記事をご覧ください。
基本情報 … Basic Information
「trimesh」は、Pythonで三角形メッシュを扱うためのライブラリです。三次元オブジェクトの形状を表現するための三角形メッシュを扱うことができ、STL、OBJ、PLY、OFFなどのファイル形式をサポートしています。
「trimesh」には、3Dモデルの読み込み、編集、変換、可視化などの機能があります。三角形メッシュの基本的な操作、例えば三角形の抽出、辺や面の検索、法線の計算、境界ボックスの計算、三角形の平面方程式の計算なども簡単に行うことができます。
サンプルコード … Sample Code
001 メッシュモデルの読み込み(形式:obj)、メッシュモデルの表示
import trimesh
# メッシュモデルの読み込む
obj = trimesh.load('SAMPLE/monkeyTriCopy.obj')
# メッシュモデルを表示する
obj.show()
002 メッシュモデルの頂点情報の表示
import trimesh
import numpy as np
# メッシュモデルの読み込む
obj = trimesh.load('SAMPLE/monkeyTriCopy.obj')
# メッシュモデルの頂点情報の表示
vertices = obj.vertices
print(f"Vertices Information:")
print(np.asarray(vertices))
print(f"Vertices Number: {len(vertices)}")
頂点情報の表示
Vertices Information:
[[ 0.46875 0.242188 0.757812]
[ 0.5 0.09375 0.6875 ]
[ 0.5625 0.242188 0.671875]
…
[ 0. -0.1875 0.796875]
[ 0. -0.140625 0.742188]
[ 0. -0.195312 0.75 ]]
Vertices Number: 2845
003 メッシュモデルの辺情報の表示
import trimesh
import numpy as np
# メッシュモデルの読み込む
obj = trimesh.load('SAMPLE/monkeyTriCopy.obj')
# メッシュモデルの辺情報の表示
edges = obj.edges
print(f"Edges Information:")
print(np.asarray(edges))
print(f"Edges Number: {len(edges)}")
辺情報の表示
Edges Information:
[[ 0 1]
[ 1 2]
[ 2 0]
…
[1422 1423]
[1423 1424]
[1424 1422]]
Edges Number: 23187
004 メッシュモデルの面情報の表示
import trimesh
import numpy as np
# メッシュモデルの読み込む
obj = trimesh.load('SAMPLE/monkeyTriCopy.obj')
# メッシュモデルの辺情報の表示
faces = obj.faces
print(f"Faces Information:")
print(np.asarray(faces))
print(f"Faces Number: {len(faces)}")
面情報の表示
Faces Information:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
…
[1416 1417 1418]
[1419 1420 1421]
[1422 1423 1424]]
Faces Number: 7729
005 メッシュモデルの法線情報(頂点法線)の表示
import trimesh
import numpy as np
# メッシュモデルの読み込む
obj = trimesh.load('SAMPLE/monkeyTriCopy.obj')
# メッシュモデルの辺情報の表示
vertex_normals = obj.vertex_normals
print(f"Vertex Normals Information:")
print(np.asarray(vertex_normals))
print(f"Vertex Normals Number: {len(vertex_normals)}")
法線情報(頂点法線)の表示
Vertex Normals Information:
[[ 0.6617 -0.2026 0.7219]
[ 0.6617 -0.2026 0.7219]
[ 0.6617 -0.2026 0.7219]
…
[-1. 0. 0. ]
[-1. 0. 0. ]
[-1. 0. 0. ]]
Vertex Normals Number: 2845
006 メッシュモデルの法線情報(面法線)の表示
import trimesh
import numpy as np
# メッシュモデルの読み込む
obj = trimesh.load('SAMPLE/monkeyTriCopy.obj')
# メッシュモデルの辺情報の表示
face_normals = obj.face_normals
print(f"Face Normals Information:")
print(np.asarray(face_normals))
print(f"Face Normals Number: {len(face_normals)}")
法線情報(面法線)の表示
Face Normals Information:
[[ 0.66170539 -0.20262636 0.72186462]
[ 0.82683413 -0.30514117 0.47247665]
[ 0.40762843 -0.79054479 0.45703171]
…
[-0.73300906 0.67858131 0.04717115]
[ 0.68435783 -0.1710886 -0.70878985]
[-0.36037848 -0.82829315 -0.42901959]]
Face Normals Number: 7729
007 メッシュモデルの読み込み、メッシュモデルから点群モデルへの変換、メッシュモデルの保存、点群モデルの保存
import trimesh
# メッシュモデルの読み込み
mesh = trimesh.load("SAMPLE/monkeyTriCopy.obj")
# メッシュモデルの書き出し/保存
mesh.export("SAMPLE/trimesh_monkeyTriCopy.obj")
# メッシュモデルから点群モデルへの変換
vertices = mesh.vertices
pcd = trimesh.PointCloud(vertices)
# 点群モデルの書き出し/保存
pcd_byte = trimesh.exchange.ply.export_ply(pcd, encoding='ascii')
output_file = open("SAMPLE/trimesh_monkeyTriConv.pcd", "wb+")
output_file.write(pcd_byte)
output_file.close()
ETC
1.「trimesh」(Pythonライブラリ)で「OBJ」ファイルを読み込む
2.「trimesh」(Pythonライブラリ)で「OBJ」モデルを表示する
### Public Library ############################################################
import trimesh
###############################################################################
obj = trimesh.load('SAMPLE/monkey.obj')
print(obj.vertices)
### [[ 0.4375 0.164062 0.765625]
### [ 0.4375 0.164062 0.765625]
### [ 0.4375 0.164062 0.765625]
### ...
### [-0.859375 0.382812 -0.382812]
### [-0.859375 0.382812 -0.382812]
### [-0.859375 0.382812 -0.382812]]
print(obj.edges)
### [[ 153 0]
### [ 0 10]
### [ 10 153]
### ...
### [1220 1504]
### [1504 1953]
### [1953 1220]]
print(obj.faces)
### [[ 153 0 10]
### [ 10 145 153]
### [ 12 7 157]
### ...
### [1950 1498 1216]
### [1953 1226 1220]
### [1220 1504 1953]]
print(obj.vertex_normals)
### [[ 0.665 -0.2008 0.7194]
### [ 0.36 -0.5089 0.782 ]
### [ 0.2052 -0.8206 -0.5334]
### ...
### [ 0.4499 0.8838 -0.1285]
### [ 0.7819 0.6231 0.0197]
### [ 0.5384 -0.0098 -0.8427]]
print(obj.face_normals)
### [[ 0.6713489 -0.19708686 0.71445603]
### [ 0.66170539 -0.20262636 0.72186462]
### [-0.6713489 -0.19708686 0.71445603]
### ...
### [-0.06868406 -0.99428204 -0.08176629]
### [ 0.36037848 -0.82829315 -0.42901959]
### [ 0.06868406 -0.99428204 -0.08176629]]
###############################################################################
obj.show()
###############################################################################
上記のPythonプログラムは、trimeshパッケージを使用して3Dオブジェクトを読み込み、その頂点、エッジ、面、法線を表示します。 trimesh.load関数は、OBJファイルを読み込み、objオブジェクトに3Dモデルを格納します。 これを使用して、3Dモデルの頂点、エッジ、面、法線を表示することができます。 obj.show()関数は、3Dモデルを描画し、視覚的なフィードバックを提供します。