- 使用重心坐标可以较为方便的基于三角面片顶点的属性插值(首先计算顶点属性,其次用顶点属性插值得到Gaussian属性)。
- 使用重心坐标可以较为方便的判断Gaussian是否在三角面片内,进而可以让Gaussian在三角面片上“行走”(改变Gaussian所对应的三角面片)。
- 基于C++实现三角面片“行走”代码,效率很高(3.5ms),同时3DGS可以用Unity渲染。
提出一种基于3DGS的虚拟人表示方法SplattingAvatar,在3090Ti/iPhone13上实现300FPS/30FPS渲染;
形变策略
SplatttingAvatar定义了一套新的Gaussians和FLAME绑定方法:
- SplattingAvatar通过FLAME驱动Gaussians,Gaussian的形变由所对应的三角面片计算。
- Gaussian位置通过
定义,其中k代表Gaussian所对应的三角面片,(u, v)是Gaussian在三角面片上的重心坐标,d表示Gaussian沿着法向量的位移。
- Gaussian的其他变量定义为
,分别表示Gaussian的旋转四元数、缩放系数、不透明度和颜色。
- Gaussian与三角面片的对应关系并不固定,可能会移动到其他三角面片。
具体来说,任意Gaussians可以表示为:
- 坐标:miu = P + d * n,P是Gaussians在三角面片上的位置(根据重心坐标和所在三角面片的三个顶点位置插值计算),n是在该位置上的法向量,d是沿着法向量的位移。具体计算如下,其中V1, V2和V3表示三角面片三个顶点的坐标,n1, n2和n3表示顶点的法向量。
- 旋转:1)计算标定空间和形变空间中三角面片的旋转矩阵(公式4);2)对任意顶点,以顶点相邻三角面片的面积作为权重系数,对顶点相邻三角面片的四元素做加权和,求得顶点的四元数(公式5);3)Gaussians的四元数根据重心坐标和所在三角面片三个顶点四元数插值计算(公式6和公式7)。
- 缩放:分别计算标定空间和形变空间中三角面片的面积,通过面积变化计算缩放系数。
- 初始化:在标定姿势下随机选择10k个三角面片对,d初始化为0,也即所有Gaussians都附着在表面。
损失函数
- 包括图片监督损失和高斯缩放约束损失
- 图片监督损失包括渲染图像和GT图像间的L1和perceptual loss;
- 高斯缩放约束损失,其中
和
是最大和最小放缩系数,如果太长(大于
)或太细(大于
),则会施加约束:
动态绑定策略
- 包含两个操作:WalkOnTriangles和ReExpress;
- WalkOnTriangles首先根据当前所在位置P和更新值,计算更新后所在位置Q。如果Q在三角面片内,则返回Q,如果Q不在三角面片内,则执行ReExpress;
- ReExpress更新Gaussian对应的三角面片,返回新的位置P和更新值。