如果不理解其中一些参数的意义,不要担心,我将在本教程的后面部分解释它们!
加载超参数通过以下方式完成:
params = Params(“params_demo.json”)
# Access batch size parameter
print(params.elevation)
初始化 params 对象后,你还可以使用 params.update('your_other_params.json') 方法使用另一个 .json 文件更新它。
好的,现在我们导入了库并声明了参数,可以加载网格了。
2、加载3D网格有几种方法可以表示 3D 数据,例如点云、网格或体素 。在本教程中,我们将重点介绍 3D 网格,尽管 PyTorch3D 中的相同过程也适用于点云。
有关 3D 纹理网格的信息通常存储在以下文件中:
- .obj 文件,用于存储顶点和面
- .mtl 文件,用于存储材料属性
- .jpg或.png纹理图像
在本教程中,我们将使用存储在 data/capsule文件夹中的 3D 胶囊对象。示例文件是从此处托管的公共存储库获得的。为了可视化我们正在使用的网格,我们可以使用 Blender:
PyTorch3D 包含多个用于加载 .obj 文件的函数,例如 load_obj 或 load_objs_as_meshes。我们将使用第一个,并使用以下语句加载 .obj 文件:
verts, faces, aux = load_obj(filename)
在这里, verts是顶点的 (V, 3) 张量,`faces.verts_idx`是每个面顶点索引的 (F, 3) 张量, aux 存储有关网格的辅助信息,例如 UV 坐标、材质颜色或纹理。然后,我们将这些 verts、 faces.verts_idx和 aux传递到 Meshes 构造函数中,该构造函数创建一个名为 capsule_mesh 的对象:
最后,第 33 行检查胶囊网格中的面和顶点数。这将返回:
We have 5252 vertices and 10200 faces.
这是我们通过检查 .obj 文件结构所期望的。
如果你想了解更多,可以在这里找到 Meshes对象的官方文档。
3、创建渲染器这可能是最重要的一步。现在我们成功读取了胶囊网格,我们需要使用 MeshRenderer 类创建一个渲染器。查看 MeshRenderer 的文档 ,我们看到它由 2 个组件组成:
- rasterizer:光栅器
- shader:着色器
因此,让我们将此任务分解为两个步骤,最后将它们放在一起。
3.1 创建光栅器栅格化是指采用以多边形或三角形(.obj 文件)描述的图像表示,并将其转换为以像素(.png或.jpg文件)描述的光栅图像。
我们的光栅器是使用一个名为 MeshRasterizer 的类创建的,该类还具有多个子组件,例如 cameras和 raster_setting 参数。基本上,相机负责将3D坐标从世界空间转换为屏幕空间。要初始化相机,我们需要 3 个重要参数。这些是:1) 距离,2) 方位角和 3) 仰角。如果这听起来很多,请不要担心,我将逐步介绍它们。
- 距离( distance)是指相机与物体之间的距离。
- 仰角( elevation angle)是指从物体到相机的矢量与水平面y=0(平面xz)之间的角度。 elevation基本上指的是我们从多高的地方看物体。
- 方位角( azimuth angle)是指从物体到相机的矢量被投射到水平面y=0上。方位角是投影矢量与参考平面(水平面)上 (0, 0, 1) 处的参考矢量之间的角度。方位角取值范围为 0º 到 360º。它基本上告诉我们从哪一侧(例如左侧大小,右侧,前视图,后视图等)查看对象。
在我们的 params.json 文件中,我们声明距离为 3,仰角为 0,方位角为 90,因此如果我们渲染此网格,我们应该直接从 3 个单位的距离查看它。
关于栅格设置,最重要的参数是生成的 2D 图像的大小。尺寸越小,图像的像素化程度就越高。
3.2 创建着色器PyTorch3D提供多种类型的着色器,包括 SoftPhongShader或 HardPhongShader。在这里,我们将使用预定义的 SoftPhongShader 并传入相机和要初始化默认参数的设备。
最后但并非最不重要的一点是,我们将光栅器和着色器结合起来: