0%

3D gaussian splatting中的坐标系

render.py中的坐标系

x轴向左,y轴向上,z轴向外,显然这是一个左手坐标系

SIBR中的坐标系

x轴向左,y轴朝下,z轴朝里,是一个左手坐标系

如何确定离轴渲染

离轴渲染是指观察者在视锥体上的投影位置不位于近平面的中心点,此时投影矩阵不能假设近平面的左边界与右边界互为相反数,同样地不能假设近平面的上边界和下边界互为相反数,即 \[ r \neq l \\ t \neq b \] img

要使用render.py实现对于3D gaussian的离轴渲染,首先要从camera.json文件中选取一个合适的正对目标物体的机位。camera.json中的相机位姿与render.py中的坐标系需要转换: \[ R=R_{json} \\ T=-R_{json}^TT_{json} \] 然后确定以选出的[R|T]作为相机坐标系,确定离轴渲染的不动点p,一般设置为[0, 0, r],即位于相机坐标系中心轴上距离相机坐标系原点深度为r距离的点。

image-20240207152236603

如图所示,以右手坐标系为例,点O为中心相机所在位置,O'为离轴渲染相机所在位置,新相机的旋转矩阵与中心相机一样,所以关键是确认位移\(\vec{OO'}\)

根据几何关系,\(\vec{PG'}\)可以通过\(\vec{PO}\)绕y轴\(\theta\)得到 \[ \vec{PG'}=\vec{PO}R_y(\theta) \] 如何从\(\vec{PG}\)得到\(\vec{PO'}\)呢?它们只有模长有差别,PG与OP等长,而PO‘的长度可以通过\(\theta\)角和PO确定,于是我们可以求得向量\(\vec{PO'}\) \[ ||\vec{PO'}||=||\vec{PO}||/ cos(\theta) \\ \vec{PO'} = \vec{PG'}/cos(\theta) \] 于是我们可以得到相机坐标系下的位移\(\vec{OO'}\) \[ \vec{OO'}=\vec{OP}+\vec{PO'} \\ =(P-O)+(P-O)R_y(\theta)/cos(\theta) \] 从而,我们可以得到其在相机坐标系下位姿 \[ Rt'=[I|\vec{OO'}]Rt \] 上面为右手坐标系,假如是左手坐标系就 \[ Rt'=Rt[\frac{I}{\vec{OO'}}] \]