メッシュとIO
Meshesオブジェクトは、三角形分割されたメッシュのバッチを表し、PyTorch3Dの多くの機能の中核です。バッチ内の各メッシュが同じ数の頂点または面を持つ必要はありません。利用可能な場合は、面法線、面領域、テクスチャなど、メッシュに関連する他のデータを格納できます。
単一のメッシュを格納するための一般的なファイル形式には、".obj"ファイルと".ply"ファイルがあり、PyTorch3Dにはこれらのファイルを読み込むための関数があります。
OBJ
Objファイルには、メッシュに関する追加情報を格納するための標準的な方法があります。objファイルが与えられた場合、次のようにして読み込むことができます。
verts, faces, aux = load_obj(filename)
これにより、verts
は頂点の(V,3)テンソルになり、faces.verts_idx
は各面の角の頂点インデックスの(F,3)テンソルになります。三角形でない面は三角形に分割されます。aux
は、法線、uv座標、マテリアルカラー、テクスチャが存在する場合にそれらを格納できるオブジェクトであり、faces
はさらに、そのNamedTuple構造内で、これらの法線、テクスチャ、マテリアルへのインデックスを含めることができます。単一のメッシュを含むMeshesオブジェクトは、頂点と面だけを使用して作成できます。
meshes = Meshes(verts=[verts], faces=[faces.verts_idx])
.obj
にテクスチャ情報がある場合は、Textures
クラスを初期化するために使用でき、これはMeshes
コンストラクターに渡されます。現在、メッシュ全体に1つのテクスチャマップを持つメッシュのテクスチャマップのロードをサポートしています。例:
verts_uvs = aux.verts_uvs[None, ...] # (1, V, 2)
faces_uvs = faces.textures_idx[None, ...] # (1, F, 3)
tex_maps = aux.texture_images
# tex_maps is a dictionary of {material name: texture image}.
# Take the first image:
texture_image = list(tex_maps.values())[0]
texture_image = texture_image[None, ...] # (1, H, W, 3)
# Create a textures object
tex = Textures(verts_uvs=verts_uvs, faces_uvs=faces_uvs, maps=texture_image)
# Initialise the mesh with textures
meshes = Meshes(verts=[verts], faces=[faces.verts_idx], textures=tex)
load_objs_as_meshes
関数がこの手順を提供します。
PLY
Plyファイルは、追加情報を格納する方法において柔軟性があります。PyTorch3Dは、plyファイルから頂点と面を読み取るだけの関数を提供しています。呼び出し
verts, faces = load_ply(filename)
により、verts
は頂点の(V,3)テンソルになり、faces
は各面の角の頂点インデックスの(F,3)テンソルになります。三角形でない面は三角形に分割されます。このデータから単一のメッシュを含むMeshesオブジェクトを作成できます。
meshes = Meshes(verts=[verts], faces=[faces])