三维模型的表示方法
常见的模型表示法有:多边形网格、点云、体素、参数模型、隐式表面
Polygon mesh
一般特指三角形网格
三角形网格由两部分组成:
- 一个个离散的顶点
- 顶点间的拓扑关系
图形渲染中最常见的方法是光栅化和光追,都适用于三角形
方便进行深度测试、UV映射
方便进行模型细分和简化、布尔建模
美术行业长期使用该格式,存在很强的惯性
Voxel
与2D的像素类似,我们使用体素填充3D空间,就能表示一个三维模型
体素对空间的描述是均匀的,想要达到和三角网格相近的精度,需要占用更大的存储空间,这也意味着相同存储空间下体素的精度更差
下图左为2MB的三角网格,图右为13MB的SDF体素
SDF体素具有非常好的光追性能,很容易进行相交测试和求出光线移动的距离
体素可以进行离散化,就像Clipmap那样,大片连续的体素会被合成为一个大体素,以降低存储空间(但还是比三角网格空间大)
不过为了保持边缘柔顺,我们需要在边缘处保留大量细小的体素,这种边缘处理会影响光追性能,一个好的模型数据结构应该能够表示软硬边,而非专门浪费性能来实现光滑
我们仍需要使用贴图映射,体素颜色不能替代UV,体素UV可能会出现接缝问题
Point cloud
多边形网格某种程度上就是有拓扑关系的点云
点云记录了模型表面顶点的坐标
点云渲染会带来巨大的overdraw,为此我们需要进行填洞、做深度剔除,而填洞的难度很大
点云的一大优点是更适合通过扫描获得(三角形网格扫描容易出现破面)
点云的另一大优点是数据的顺序无关,我们可以任意调整顶点存储的顺序,但这其实也是一种缺点,我们不好比较两个点云的差异
Implicit field
使用一组连续函数的零水平集来表示3D模型
连续函数的零水平集:使函数值=0的输入取值的集合
SDF就是一种隐式场,通过定义一组距离值函数,将点的坐标带入函数可以求得点到物体表面的距离
可以快速进行碰撞检测、UV生成
但制作难度过高,难以表达所有的模型,对于复杂模型,计算复杂度过高
难以进行编辑、布尔操作、细分