MeshCNN——A Network with an Edge

alt text

这篇文章是Siggraph 2019年的一篇文章,标题为MeshCNN: A Network with an Edge,顾名思义,便是利用网格的边定义卷积操作。

前导内容

在介绍文章工作之前,首先讲讲相关的前导知识。

obj文件的组成如下:

# "#"号开头是注释行
# v(vertex)数据段: 模型顶点列表
# 顶点位置信息,是xyz三维坐标
# v开头的每一行描述一个顶点,行数等于顶点数。
v  1.00  -1.00  -1.00
v  1.00  1.00  1.00
......
# vt(vertex texture)数据段:模型顶点的纹理坐标列表
# 顶点的纹理坐标信息,是xy二维坐标
# vt开头的每一行描述一个纹理坐标,行数大于等于顶点数,因为一个模型顶点在贴图的UV坐标系中很可能对应多个顶点/纹理坐标。且坐标值范围是在0~1之间。
vt  0.74  0.75
vt  0.29  0.55
......
# vn(vertex normal)数据段:顶点法线列表
# 三维法向量,xyz
# vn开头的每一行描述一个法向量,行数大于等于顶点数。法线是与面相关的概念,但是现在的面是靠顶点来描述,所以一个顶点可能对应多条法线
# 共面顶点的法向量的方向是相同的,也就是说这里面的数据会重复,所以在建模软件导出obj文件时有个优化的选项,勾选后的导出的法线列表数据中就不会有重复项
vn  -1.00 0.00 0.00 
vn  1.00 0.00 0.00
vn  0.00 1.00 0.00
......
# f(face):模型的三角面列表
# f开头的每一行描述一个面 ,关键的来了,三个点组成一个面,怎样拿到这三个点呢?通过从1开始的索引,去前面的v、vt、vn列表中去取。
# 总结一下就是:每一行定义1个面,1个面包含3个点,1个点具有“顶点/纹理坐标/法线”3个索引值,索引的是前面3个列表的信息。
f  1/1/1  2/2/1  3/3/1      # 顶点1、顶点2、顶点3 组成的面
f  2/2/1  3/3/1  4/4/1      # 顶点2、顶点3、顶点4 组成的面
f  1/1/1  5/10/1  8/14/6    # 顶点1、顶点5、顶点8 组成的面
......

其中,纹理坐标(vt)和法线坐标(vn)是可选项,但一个mesh必须具备顶点(v)以及记录拓扑信息的面(f),一个基本的obj mesh组成如下:

v  1.00  -1.00  -1.00
v  1.00  1.00  1.00
v  1.00  -1.00  1.00
......
f  1  2  3
f  2  3  4
f  1  5  8
......

核心思想