协方差(世界空间)梯度计算
在上一篇文章中,我们完成了相机坐标系下的协方差梯度计算。在这篇文章中,我们继续完成世界坐标系下的协方差梯度计算。
为了进行反向求导,我们需要先理清前向传播中的变量映射关系:
- 3D 高斯在世界空间中的协方差矩阵为
\Sigma\in\mathbb{R}^{3\times3} 。 - 投影到 2D 屏幕空间后的协方差矩阵为
\Sigma'\in\mathbb{R}^{2\times2} 。 - 两者的投影映射关系为
\Sigma'=JR_{cw}\Sigma R_{cw}^\top J^\top 。其中R_{cw} 是将坐标从世界空间转换到相机空间的旋转矩阵,J 是透视投影的雅可比矩阵 。 - 为了简化表达,文档定义了一个复合变换矩阵
T=JR_{cw}\in\mathbb{R}^{2\times3} 。基于此,投影公式可以简写为\Sigma'=T\Sigma T^\top 。
世界坐标系下的协方差梯度矩阵为:
先直接拿来用。如何推导留作问题。
代码实现和验证
依据公式实现的代码如下。
- T_tile = T_onscreen[ids_tile]
- tile_grad_sigma = T_tile.transpose(1, 2) @ tile_grad_sigma_camera @ T_tile
- grad_sigma.scatter_add_(
- 0,
- orig_ids_tile.unsqueeze(1).unsqueeze(2).expand(-1, 3, 3),
- tile_grad_sigma
- )
接下来我们将协方差矩阵加入优化流程。完整的可视化代码可查看 Commit e9c03e4:verify_optim.py。
从可视化结果中可以看到,加入协方差矩阵之后引入了各向异性,点从圆形变成了椭圆。