网格和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
构造函数中。目前,我们支持加载整个网格只有一个纹理贴图的网格的纹理贴图,例如:
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])