網格和 I/O
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])
從頂點和面建立。
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)
如果 .obj
中有紋理資訊,可以使用來初始化 Textures
類別,然後傳遞給 Meshes
建構函式。目前我們支援載入整個網格僅有一個紋理貼圖的網格紋理貼圖,例如
load_objs_as_meshes
函數提供此步驟。
PLY
verts, faces = load_ply(filename)
將verts
設定為一個 (V,3) 的頂點張量,並將 faces
設定為一個 (F, 3) 的張量,每個張量包含各個面部角落的頂點索引。不是三角形的表面會被切分成三角形。可以使用此資料透過建立含有一個網格的 Meshes 物件
meshes = Meshes(verts=[verts], faces=[faces])