【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之高斯椭球的几何变换

发布于:2025-06-28 ⋅ 阅读:(18) ⋅ 点赞:(0)

【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之高斯椭球的几何变换


前言

在详细解析3DGS代码之前,首要任务是成功运行3DGS代码【理论基础及代码运行(win11下)解析参考教程】,后续学习才有意义。本博客讲解3DGS的理论基础知识之高斯椭球的几何变换,不涉及具体的模块代码。


参考:计算机图形学笔记

本博文是涉及到计算机图形学的知识,博主也是个新人,边学习边记录笔记。三维场景经历一系列几何变换(Geometric Transformations),将物体从其局部坐标系一步步转换到屏幕像素坐标。

模型变换(Model Transformation)

在3DGS中博主认为这个过程不存在,因此不作为重点。
模型变换是计算机图形学中一个关键步骤,它涉及到将对象从其局部坐标系(也称为对象坐标系或模型坐标系)转换到世界坐标系。

  • 局部坐标系定义单个模型对象的坐标系统,在设计和创建3D模型时,通常会使用这种坐标系,它以模型的中心或者某个特定的关键点作为原点。
  • 世界坐标系是一个全局的坐标系统,用于定义场景中所有物体的位置、方向和大小。

模型变换涉及到将每个单独的对象从其自身的局部坐标系转换到一个统一的世界坐标系的过程。通过模型变换,可以将各个独立的3D模型放置于这个世界坐标系中的适当位置上,将多个对象放置在虚拟场景中的不同位置、方向和大小,使它们相互关联起来构成完整的场景。

这个过程模型变换主要通过三种基本操作实现:平移、旋转和缩放。这些操作通常使用矩阵表示,并应用于对象的所有顶点上。平移、旋转和缩放操作在前面的【理论基础及代码运行(win11下)解析参考教程】中已经详细说明过了,这里做个简单回顾。
平移变换用于移动对象的位置,而不改变其大小或方向: T = [ 1 0 0 t 1 0 1 0 t 2 0 0 1 t 3 0 0 0 1 ] T = \left[ {\begin{array}{c} 1&0&0&{{t_1}}\\ 0&1&0&{{t_2}}\\ 0&0&1&{{t_3}}\\ 0&0&0&1 \end{array}} \right] T= 100001000010t1t2t31
旋转变换是改变对象姿态,允许对象绕着 x y z xyz xyz轴旋转,改变对象在空间中的朝向或位置。 R = R x ( γ ) R y ( β ) R z ( α ) R = {R_x}\left( \gamma \right){R_y}\left( \beta \right){R_z}\left( \alpha \right) R=Rx(γ)Ry(β)Rz(α),根据旋转轴的不同,旋转角度不同,旋转矩阵也会有所不同: R z ( α ) = [ cos ⁡ α − sin ⁡ α 0 0 sin ⁡ α cos ⁡ α 0 0 0 0 1 0 0 0 0 1 ] {R_{\rm{z}}}\left( \alpha \right) = \left[ {\begin{array}{c} {\cos \alpha }&{ - \sin \alpha }&0&0\\ {\sin \alpha }&{\cos \alpha }&0&0\\ 0&0&1&0\\ 0&0&0&1 \end{array}} \right] Rz(α)= cosαsinα00sinαcosα0000100001 R y ( β ) = [ cos ⁡ β 0 sin ⁡ β 0 0 1 0 0 − sin ⁡ β 0 cos ⁡ β 0 0 0 0 1 ] {R_y}\left( \beta \right) = \left[ {\begin{array}{c} {\cos \beta }&0&{\sin \beta }&0\\ 0&1&0&0\\ { - \sin \beta }&0&{\cos \beta }&0\\ 0&0&0&1 \end{array}} \right] Ry(β)= cosβ0sinβ00100sinβ0cosβ00001 R z ( γ ) = [ 1 0 0 0 0 cos ⁡ γ − sin ⁡ γ 0 0 sin ⁡ γ cos ⁡ γ 0 0 0 0 1 ] {R_z}\left( \gamma \right) = \left[ {\begin{array}{c} 1&0&0&0\\ 0&{\cos \gamma }&{ - \sin \gamma }&0\\ 0&{\sin \gamma }&{\cos \gamma }&0\\ 0&0&0&1 \end{array}} \right] Rz(γ)= 10000cosγsinγ00sinγcosγ00001
缩放变换用于改变对象的大小,通过指定沿着每个坐标轴的比例因子来完成: S = [ s 1 0 0 0 0 s 2 0 0 0 0 s 3 0 0 0 0 1 ] S = \left[ {\begin{array}{c} {{s_1}}&0&0&0\\ 0&{{s_2}}&0&0\\ 0&0&{{s_3}}&0\\ 0&0&0&1 \end{array}} \right] S= s10000s20000s300001
实际应用中,往往需要同时应用多种变换。

模型变换通过平移、旋转和缩放等操作调整对象在世界坐标系中的位置、方向和大小。


观测变换(Viewing Transformation)

观测变换通常指的是将物体从世界坐标系转换到观察者或摄像机坐标系的过程,即计算机图形学中将3D世界中的对象转换为可以从特定视角观察的形式的过程,这个过程专注于视图变换(View Transformation)和投影变换((Projection transformation)。

视图变换(View Transformation)

视图变换(也被称为相机变换)是计算机图形学中一个核心概念,用于将世界坐标系中的物体转换到相机或观察者视角下的坐标系。主要目的是重新定位和定向场景,使得虚拟相机位于原点,并且其视线方向沿着某个预定的轴(通常是负z轴)。这样做的好处是可以简化后续的投影变换计算。

简单回顾下,通常情况下世界坐标系到相机坐标系的转换过程可以表示为:
P c a m e r a = R ⋅ P w o r l d + T {P_{camera}} = R \cdot {P_{world}} + T Pcamera=RPworld+T
R R R是一个 3 × 3 3×3 3×3的旋转矩阵, T T T是一个 3 × 1 3×1 3×1的平移向量,这是都是之前系列博文中就解释过的基础知识。
使用齐次坐标来表示,构建一个4x4的变换矩阵来同时表示旋转和平移:
P c a m e r a = V ⋅ P w o r l d = [ R T 0 1 × 3 1 ] ⋅ P w o r l d {P_{camera}} = V \cdot {P_{world}} = \left[ {\begin{array}{c} R&T\\ {{0_{1 \times 3}}}&1 \end{array}} \right] \cdot {P_{world}} Pcamera=VPworld=[R01×3T1]Pworld

本节使用另一种新的方法,构建观测变换矩阵 V V V

不是经常搞三维视觉方向的读者,这里博主再回顾一个很容易忘记的超级基础的知识点:向量点乘和叉乘。
点积:结果是一个标量,而不是一个向量。这个数值可以用来表示两个向量之间的相似程度或者在一个方向上的投影大小,点乘也可用于计算两个向量之间的角度 cos ⁡ θ = A ⋅ B ∣ A ∣ ∣ B ∣ \cos \theta = \frac{{A \cdot B}}{{\left| A \right|\left| B \right|}} cosθ=ABAB
叉乘:结果是一个向量,该向量的方向垂直于原来两个向量所在的平面,并且遵循右手定则确定方向,经常被用来寻找平面或曲面的法向量。叉乘的模长等于由原始两向量构成的平行四边形的面积。即 ∣ A × B ∣ = ∣ A ∣ ∣ B ∣ sin ⁡ θ \left| {{\rm{A \times B}}} \right| = \left| {\rm{A}} \right|\left| B \right|\sin \theta A×B=ABsinθ θ \theta θ是两向量之间的夹角。

  • 确定摄像机参数
    确定相机在世界坐标系中的位置 C = ( C x , C y , C z ) C = ({C_x},{C_y},{C_z}) C=(Cx,Cy,Cz),观察目标点(即摄像机看向的目标点)在世界坐标系中的位置 T = ( T x , T y , T z ) T = ({T_x},{T_y},{T_z}) T=(Tx,Ty,Tz),以及上方向向量 u p = ( u x , u y , u z ) up = ({u_x},{u_y},{u_z}) up=(ux,uy,uz),通常为(0, 1, 0),表示世界的“上”方向。
  • 构造单位向量
    前向向量 f f f是从摄像机位置指向观察目标点的方向向量,并且需要归一化为单位向量 (相机坐标系的负z轴)
    f = T − C ∥ T − C ∥ = ( T x − C x , T y − C y , T z − C z ) ( T x − C x ) 2 + ( T y − C y ) 2 + ( T z − C z ) 2 = ( f x , f y , f z ) f = \frac{{T - C}}{{\left\| {T - C} \right\|}} = \frac{{({T_x} - {C_x},{T_y} - {C_y},{T_z} - {C_z})}}{{\sqrt {{{({T_x} - {C_x})}^2} + {{({T_y} - {C_y})}^2} + {{({T_z} - {C_z})}^2}} }} = ({f_x},{f_y},{f_z}) f=TCTC=(TxCx)2+(TyCy)2+(TzCz)2 (TxCx,TyCy,TzCz)=(fx,fy,fz)
    右向向量 s s s是通过前向向量 f f f和上方向向量 u p up up的叉积计算得到的,并且也需要归一化为单位向量 (相机坐标系的x轴)
    s = f × u p ∥ f × u p ∥ = ( f y u z − f z u y , f z u x − f x u z , f x u y − f y u z ) ( f y u z − f z u y ) 2 + ( f z u x − f x u z ) 2 + ( f x u y − f y u z ) 2 = ( s x , s y , s z ) s = \frac{{f \times up}}{{\left\| {f \times up} \right\|}} = \frac{{({f_y}{u_z} - {f_z}{u_y},{f_z}{u_x} - {f_x}{u_z},{f_x}{u_y} - {f_y}{u_z})}}{{\sqrt {{{\left( {{f_y}{u_z} - {f_z}{u_y}} \right)}^2} + } {{\left( {{f_z}{u_x} - {f_x}{u_z}} \right)}^2} + {{\left( {{f_x}{u_y} - {f_y}{u_z}} \right)}^2}}}= ({s_x},{s_y},{s_z}) s=f×upf×up=(fyuzfzuy)2+ (fzuxfxuz)2+(fxuyfyuz)2(fyuzfzuy,fzuxfxuz,fxuyfyuz)=(sx,sy,sz)
    上向向量 u u u是通过右向向量 s s s和前向向量 f f f的叉积重新计算得到的 (相机坐标系的y轴)
    u = s × f = ( s y f z − s z f y , s z f x − s x f z , s x f y − s y f z ) = ( u x , u y , u z ) u = s \times f = ({s_y}{f_z} - {s_z}{f_y},{s_z}{f_x} - {s_x}{f_z},{s_x}{f_y} - {s_y}{f_z}) = ({u_x},{u_y},{u_z}) u=s×f=(syfzszfy,szfxsxfz,sxfysyfz)=(ux,uy,uz)

    单位向量 f f f s s s u u u分别是相机坐标下的负z轴、x轴和y轴,因此,在相机坐标下它们的向量分别是 ( 0 , 0 , − 1 ) (0,0,-1) (0,0,1) ( 1 , 0 , 0 ) (1,0,0) (1,0,0) ( 0 , 1 , 0 ) (0,1,0) (0,1,0)。但回到世界坐标系下,它们的向量则为 ( f x , f y , f z ) ({f_x},{f_y},{f_z}) (fx,fy,fz) ( s x , s y , s z ) ({s_x},{s_y},{s_z}) (sx,sy,sz) ( u x , u y , u z ) ({u_x},{u_y},{u_z}) (ux,uy,uz),博主在这强调一下,希望读者不要搞混了。

  • 构造变换矩阵 V V V
    三个正交单位向量 s s s u u u f f f,可以构造视图变换矩阵 V V V
    V = [ s x s y s z − s ⋅ C u x u y u z − u ⋅ C − f x − f y − f z f ⋅ C 0 0 0 1 ] = [ R T 0 1 × 3 1 ] V = \left[ {\begin{array}{c} {{s_x}}&{{s_y}}&{{s_z}}&{ - s \cdot C}\\ {{u_x}}&{{u_y}}&{{u_z}}&{ - u \cdot C}\\ { - {f_x}}&{ - {f_y}}&{ - {f_z}}&{f \cdot C}\\ 0&0&0&1 \end{array}} \right]= \left[ {\begin{array}{c} R&T\\ {{0_{1 \times 3}}}&1 \end{array}} \right] V= sxuxfx0syuyfy0szuzfz0sCuCfC1 =[R01×3T1]
    其中:
    s ⋅ C {s \cdot C} sC表示向量 s s s C C C的点积: − s ⋅ C = − ( s x C x + s y C y + s z C z ) - s \cdot C = - ({s_x}{C_x} + {s_y}{C_y} + {s_z}{C_z}) sC=(sxCx+syCy+szCz)
    u ⋅ C {u \cdot C} uC表示向量 s s s C C C的点积: − u ⋅ C = − ( u x C x + u y C y + u z C z ) - u \cdot C = - ({u_x}{C_x} + {u_y}{C_y} + {u_z}{C_z}) uC=(uxCx+uyCy+uzCz)
    f ⋅ C {f \cdot C} fC表示向量 s s s C C C的点积: f ⋅ C = f x C x + f y C y + f z C z f \cdot C = {f_x}{C_x} + {f_y}{C_y} + {f_z}{C_z} fC=fxCx+fyCy+fzCz

世界坐标系到相机坐标系的转换过程同样可以表示为:
P c a m e r a = V ⋅ P w o r l d {P_{camera}} = V \cdot {P_{world}} Pcamera=VPworld

这里博主根据自己的理解,解释下构建的 V V V为什么可以作为变换矩阵使用。如下图所示,实线表示世界坐标系下的坐标轴和向量,虚线表示相机坐标系下的坐标轴和向量。博主这里相机坐标系只画了一个x轴举例简单讲解。

在世界坐标下下,存在一个向量 N ( x 1 , y 1 , z 1 ) N({x_1},{y_1},{z_1}) N(x1,y1,z1),其在单位向量 s s s的上的投影: x 2 = x 1 s x + y 1 s y + z 1 s z {{\rm{x}}_2} = {x_1}{s_x} + {y_1}{s_y} + {z_1}{s_z} x2=x1sx+y1sy+z1sz。这个值 x 2 x_2 x2就是向量 N N N在相机坐标系下x轴上的取值,向量 M M M是向量 N N N在相机坐标系下x轴方向的分量。同理,向量 N N N在单位向量 u u u的上的投影: y 2 = x 1 u x + y 1 u y + z 1 u z {{\rm{y}}_2} = {x_1}{u_x} + {y_1}{u_y} + {z_1}{u_z} y2=x1ux+y1uy+z1uz,值 y 2 y_2 y2就是向量 N N N在相机坐标系下y轴上的取值;向量 N N N在单位向量 f f f的上的投影: z 2 = x 1 f x + y 1 f y + z 1 f z {{\rm{z}}_2} = {x_1}{f_x} + {y_1}{f_y} + {z_1}{f_z} z2=x1fx+y1fy+z1fz,值 − z 2 -z_2 z2就是向量 N N N在相机坐标系下z轴上的取值。
因此,向量 N N N在相机坐标系下向量为 ( x 2 , y 2 , z 2 ) ({x_2},{y_2},{z_2}) (x2,y2,z2),完成了旋转变换:
P c a m e r a = [ s x s y s z u x u y u z − f x − f y − f z ] ⋅ P w o r l d {P_{camera}} = \left[ {\begin{array}{c} {{s_x}}&{{s_y}}&{{s_z}}\\ {{u_x}}&{{u_y}}&{{u_z}}\\ { - {f_x}}&{ - {f_y}}&{ - {f_z}} \end{array}} \right] \cdot {P_{world}} Pcamera= sxuxfxsyuyfyszuzfz Pworld
平移变换理解类似,在世界坐标系下计算点的坐标在单位向量 s s s u u u f f f的投影,就是相机坐标系下的新坐标,不再详细阐述。


投影变换(Projection transformation)

投影变换是通过设置近/远剪裁面(近/远平面)和左右上下边界来限定视锥体,定义摄像机的可视空间(三维空间范围),并将摄像机视锥体内的三维坐标映射到标准化设备坐标(Normalized Device Coordinates, NDC),也就是一个 [-1, 1]³ 的立方体空间中。
投影变换主要分为两种类型:正交投影(Orthographic Projection)和透视投影(Perspective Projection)。图像展示了两种不同的投影方式:

图像中都标有“Near clip plane”和“Far clip plane”分别代表近平面和远平面,这两个平面与视点(通常位于原点)共同定义了一个四面体形状的空间区域,即视锥体。在这个区域内的一切都将被投影到屏幕上并最终显示出来。视锥体的形状和大小可以通过调整近平面和远平面的距离以及视角的角度来控制,从而影响最终图像的深度感和范围。

透视投影模拟了人眼或相机的视觉效果,远处的物体看起来比近处的物体小。这种投影方式会产生深度感和真实感;正交投影不考虑距离,所有物体无论远近都以相同的大小显示,这种投影方式缺乏深度感,但保持了物体的比例和形状。

正交投影:

如下图所示,将一个视锥体长方体 [ l , r ] [ b , t ] [ f , n ] {\rm{[l,r][b,t][f,n]}} [l,r][b,t][f,n]移到坐标原点,并规范化成一个正方体 [ − 1 , 1 ] [ − 1 , 1 ] [ − 1 , 1 ] {\rm{[ - 1,1][ - 1,1][ - 1,1]}} [1,1][1,1][1,1]

l l l r r r 分别代表左右边界, b b b t t t分别代表底边和顶边,而 n n n f f f分别代表近剪裁面和远剪裁面的距离。

  • 平移:计算出长方体的中心点,将中心点移动到原点,平移矩阵为:
    M t = [ 1 0 0 − l + r 2 0 1 0 − t + b 2 0 0 1 − n + f 2 0 0 0 1 ] {M_t} = \left[ {\begin{array}{c} 1&0&0&{ - \frac{{{\rm{l + r}}}}{2}}\\ 0&1&0&{ - \frac{{{\rm{t + b}}}}{2}}\\ 0&0&1&{ - \frac{{{\rm{n + f}}}}{2}}\\ 0&0&0&1 \end{array}} \right] Mt= 1000010000102l+r2t+b2n+f1
  • 缩放:计算出长方体各边长的缩放系数,将边长都缩放到 [ − 1 , 1 ] {\rm{[ - 1,1]}} [1,1],缩放矩阵为:
    M s = [ 2 r − l 0 0 0 0 2 t − b 0 0 0 0 2 n − f 0 0 0 0 1 ] {M_s} =\left[ {\begin{array}{c} {\frac{2}{{{\rm{r - l}}}}}&0&0&0\\ 0&{\frac{2}{{{\rm{t - b}}}}}&0&0\\ 0&0&{\frac{2}{{{\rm{n - f}}}}}&0\\ 0&0&0&1 \end{array}} \right] Ms= rl20000tb20000nf200001

综上,正交投影矩阵为:
M o r t h o = M s M t = [ 2 r − l 0 0 − r + l r − l 0 2 t − b 0 − t + b t − b 0 0 2 n − f − n + f n − f 0 0 0 1 ] {M_{ortho}} = {M_s}{M_t} = \left[ {\begin{array}{c} {\frac{2}{{{\rm{r - l}}}}}&0&0&{ - \frac{{{\rm{r + l}}}}{{{\rm{r - l}}}}}\\ 0&{\frac{2}{{{\rm{t - b}}}}}&0&{ - \frac{{{\rm{t + b}}}}{{{\rm{t - b}}}}}\\ 0&0&{\frac{2}{{{\rm{n - f}}}}}&{ - \frac{{{\rm{n + f}}}}{{{\rm{n - f}}}}}\\ 0&0&0&1 \end{array}} \right] Mortho=MsMt= rl20000tb20000nf20rlr+ltbt+bnfn+f1

透视投影

如下图所示,透视投影矩阵的视锥体是截头金字塔形状,先把截头金字塔压缩成一个长方体,然后再通过正交投影矩阵变换成正方体。

截头金字塔的压缩矩阵为:
M p e r s p − > o r t h o = [ n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ] {M_{persp - > ortho}} = \left[ {\begin{array}{c} n&0&0&0\\ 0&n&0&0\\ 0&0&{n + f}&{ - nf}\\ 0&0&1&0 \end{array}} \right] Mpersp>ortho= n0000n0000n+f100nf0
透视投影矩阵为:
M p e r s p = M o r t h o M p e r s p − > o r t h o = [ 2 r − l 0 0 − r + l r − l 0 2 t − b 0 − t + b t − b 0 0 2 n − f − n + f n − f 0 0 0 1 ] [ n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ] = [ 2 n r − l 0 − r + l r − l 0 0 2 n t − b − t + b t − b 0 0 0 n + f n − f − 2 n f n − f 0 0 1 0 ] {M_{persp}} = {M_{ortho}}{M_{persp - > ortho}} = \left[ {\begin{array}{c} {\frac{2}{{{\rm{r - l}}}}}&0&0&{ - \frac{{{\rm{r + l}}}}{{{\rm{r - l}}}}}\\ 0&{\frac{2}{{{\rm{t - b}}}}}&0&{ - \frac{{{\rm{t + b}}}}{{{\rm{t - b}}}}}\\ 0&0&{\frac{2}{{{\rm{n - f}}}}}&{ - \frac{{{\rm{n + f}}}}{{{\rm{n - f}}}}}\\ 0&0&0&1 \end{array}} \right]\left[ {\begin{array}{c} n&0&0&0\\ 0&n&0&0\\ 0&0&{n + f}&{ - nf}\\ 0&0&1&0 \end{array}} \right] = \left[ {\begin{array}{c} {\frac{{2n}}{{{\rm{r - l}}}}}&0&{ - \frac{{{\rm{r + l}}}}{{{\rm{r - l}}}}}&0\\ 0&{\frac{{2n}}{{{\rm{t - b}}}}}&{ - \frac{{{\rm{t + b}}}}{{{\rm{t - b}}}}}&0\\ 0&0&{\frac{{{\rm{n + f}}}}{{{\rm{n - f}}}}}&{\frac{{{\rm{ - 2nf}}}}{{{\rm{n - f}}}}}\\ 0&0&1&0 \end{array}} \right] Mpersp=MorthoMpersp>ortho= rl20000tb20000nf20rlr+ltbt+bnfn+f1 n0000n0000n+f100nf0 = rl2n0000tb2n00rlr+ltbt+bnfn+f100nf2nf0

截头金字塔压缩矩阵的求解
如下图所示,根据三角形的相似关系,对于视锥体内的任意一个坐标为 ( x , y , z ) \left( {{\rm{x,y,z}}} \right) (x,y,z)的点P与近平面上坐标为 ( x ′ , y ′ , z ′ ) \left( {{\rm{x\prime,y\prime,z\prime}}} \right) (x′,y′,z′)的点G存在对应的关系,点P压缩以后的 x x x y y y坐标应该于点G的 x ′ x\prime x y ′ y\prime y相同: x ′ = n z x x\prime = \frac{n}{{\rm{z}}}x x=znx y ′ = n z y y\prime = \frac{n}{{\rm{z}}}y y=zny。因此,点P压缩后变成后的点Q坐标为 ( x ′ , y ′ , ? ) \left( {{\rm{x\prime,y\prime,?}}} \right) (x′,y′,?),Z轴上的值未知,暂时不作讨论。

点Q的三维坐标换成齐次坐标表示: [ x ′ , y ′ , ? ] ⇔ [ x ′ , y ′ , ? , 1 ] ⇔ [ n z x , n z x , ? , 1 ] ⇔ [ n x , n x , ? , z ] [x\prime ,y\prime ,?]\Leftrightarrow[x\prime ,y\prime ,? ,1]\Leftrightarrow[\frac{n}{z}x,\frac{n}{z}x,?,1]\Leftrightarrow[nx,nx,?,z] [x,y,?][x,y,?,1][znx,znx,?,1][nx,nx,?,z]
解释一下:对任意非零常数 k ≠ 0 {\rm{k}} \ne 0 k=0,齐次坐标 [ k x , k y , k z , k ] {\rm{[kx, ky, kz,k] }} [kx,ky,kz,k]对应的三维坐标为 [ k x k , k y k , k z k ] [\frac{{{\rm{kx}}}}{{\rm{k}}},\frac{{{\rm{ky}}}}{{\rm{k}}},\frac{{{\rm{kz}}}}{{\rm{k}}}] [kkx,kky,kkz],因此与三维坐标 [ x , y , z ] {\rm{[x, y, z] }} [x,y,z] 等价。
M p e r s p − > o r t h o {M_{persp - > ortho}} Mpersp>ortho所有元素设为未知数:
M p e r s p − > o r t h o = [ A B C D E F G H I J K L M N O P ] {M_{persp - > ortho}} = \left[ {\begin{array}{c} A&B&C&D\\ E&F&G&H\\ I&J&K&L\\ M&N&O&P \end{array}} \right] Mpersp>ortho= AEIMBFJNCGKODHLP
点P坐标与压缩后的点Q坐标存在以下等式:
M p e r s p − > o r t h o [ x y z 1 ] = [ n x n y ? z ] {M_{persp - > ortho}}\left[ {\begin{array}{c} x\\ y\\ z\\ 1 \end{array}} \right] = \left[ {\begin{array}{c} {nx}\\ {ny}\\ ?\\ z \end{array}} \right] Mpersp>ortho xyz1 = nxny?z
将式子展开:
A x + B y + C z + D = n x E x + F y + G z + H = n x M x + N y + Q z + P = z \begin{array}{l} Ax + By + Cz + D = nx\\ Ex + Fy + Gz + H = nx\\ Mx + Ny + Qz + P = z \end{array} Ax+By+Cz+D=nxEx+Fy+Gz+H=nxMx+Ny+Qz+P=z
计算之后, M p e r s p − > o r t h o {M_{persp - > ortho}} Mpersp>ortho矩阵还剩 I I I J J J K K K L L L四个未知数:
M p e r s p − > o r t h o = [ n 0 0 0 0 n 0 0 I J K L 0 0 1 0 ] {M_{persp - > ortho}} = \left[ {\begin{array}{c} n&0&0&0\\ 0&n&0&0\\ I&J&K&L\\ 0&0&1&0 \end{array}} \right] Mpersp>ortho= n0I00nJ000K100L0
在截头金字塔压缩成长方体的过程中,存在以下三个规则:1.近平面的所有点坐标不变;2.远平面的所有点坐标 z z z值不变,即全为 f f f;3.远平面的中心点坐标值不变,依旧为 ( 0 , 0 , f ) {\rm{(0,0,f)}} (0,0,f)
根据第一个原则,近平面的所有点坐标不变,对于近平面上的任意一点 ( x , y , n , 1 ) \left( {{\rm{x,y,n,1}}} \right) (x,y,n,1)
[ n 0 0 0 0 n 0 0 I J K L 0 0 1 0 ] [ x y n 1 ] = [ n x n y n ∗ n z ] \left[ {\begin{array}{c} n&0&0&0\\ 0&n&0&0\\ I&J&K&L\\ 0&0&1&0 \end{array}} \right]\left[ {\begin{array}{c} x\\ y\\ n\\ 1 \end{array}} \right] = \left[ {\begin{array}{c} {nx}\\ {ny}\\ {n*n}\\ z \end{array}} \right] n0I00nJ000K100L0 xyn1 = nxnynnz
将式子展开:
I x + J y + K n + L = n ∗ n Ix + Jy + Kn + L = n * n Ix+Jy+Kn+L=nn
计算之后, M p e r s p − > o r t h o {M_{persp - > ortho}} Mpersp>ortho矩阵还剩 K K K L L L四个未知数:
M p e r s p − > o r t h o = [ n 0 0 0 0 n 0 0 0 0 K L 0 0 1 0 ] {M_{persp - > ortho}} = \left[ {\begin{array}{c} n&0&0&0\\ 0&n&0&0\\ 0&0&K&L\\ 0&0&1&0 \end{array}} \right] Mpersp>ortho= n0000n0000K100L0
根据第三个原则,远平面的中心点坐标值不变为 ( 0 , 0 , f , 1 ) {\rm{(0,0,f,1)}} (0,0,f,1)
[ n 0 0 0 0 n 0 0 0 0 K L 0 0 1 0 ] [ 0 0 f 1 ] = [ 0 0 f ∗ f f ] \left[ {\begin{array}{c} n&0&0&0\\ 0&n&0&0\\ 0&0&K&L\\ 0&0&1&0 \end{array}} \right]\left[ {\begin{array}{c} 0\\ 0\\ f\\ 1 \end{array}} \right] = \left[ {\begin{array}{c} 0\\ 0\\ {f*f}\\ f \end{array}} \right] n0000n0000K100L0 00f1 = 00fff
将式子展开:
K f + L = f ∗ f Kf + L = f * f Kf+L=ff
结合上面的式子
K n + L = n ∗ n Kn+ L = n * n Kn+L=nn
计算之后,最终的 M p e r s p − > o r t h o {M_{persp - > ortho}} Mpersp>ortho矩阵:
M p e r s p − > o r t h o = [ n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ] {M_{persp - > ortho}} = \left[ {\begin{array}{c} n&0&0&0\\ 0&n&0&0\\ 0&0&n+f&-nf\\ 0&0&1&0 \end{array}} \right] Mpersp>ortho= n0000n0000n+f100nf0


视口变换(Viewport transformation)

视口变换是指将经过规范化设备坐标(NDC)空间中的点映射到最终显示图像的屏幕窗口的像素坐标上。视口变换是将虚拟的标准化坐标转化为真实屏幕像素坐标的桥梁,能够精确控制3D图形在2D屏幕上的呈现方式。这个过程对于最终确定物体在屏幕上的位置和大小至关重要。
视口变换矩阵(齐次坐标系):
M v i e w p o r t = [ w i d t h 2 0 0 w i d t h 2 0 h e i g h t 2 0 h e i g h t 2 0 0 1 0 0 0 0 1 ] {M_{viewport}} = \left[ {\begin{array}{c} {\frac{{width}}{2}}&0&0&{\frac{{width}}{2}}\\ 0&{\frac{{height}}{2}}&0&{\frac{{height}}{2}}\\ 0&0&1&0\\ 0&0&0&1 \end{array}} \right] Mviewport= 2width00002height0000102width2height01
w i d t h width width h e i g h t height height分别是窗口的宽度和高度。
缩放部分: 矩阵的对角线元素 w i d t h 2 {\frac{{width}}{2}} 2width h e i g h t 2 {\frac{{height}}{2}} 2height负责将NDC范围从 [ − 1 , 1 ] [−1,1] [1,1]缩放到窗口的实际尺寸。

  • X轴缩放: w i d t h 2 {\frac{{width}}{2}} 2width将NDC的X坐标从 [ − 1 , 1 ] [−1,1] [1,1]映射到 [ − w i d t h 2 , w i d t h 2 ] [−{\frac{{width}}{2}},{\frac{{width}}{2}}] [2width,2width]
  • Y轴缩放: h e i g h t 2 {\frac{{height}}{2}} 2height将NDC的X坐标从 [ − 1 , 1 ] [−1,1] [1,1]映射到 [ − h e i g h t 2 , h e i g h t 2 ] [−{\frac{{height}}{2}},{\frac{{height}}{2}}] [2height,2height]

平移部分: 矩阵的第4列的前两个元素 w i d t h 2 {\frac{{width}}{2}} 2width h e i g h t 2 {\frac{{height}}{2}} 2height负责将经过缩放后的坐标平移到屏幕的左下角。

  • X轴平移: w i d t h 2 {\frac{{width}}{2}} 2width将NDC的X坐标从 [ − w i d t h 2 , w i d t h 2 ] [−{\frac{{width}}{2}},{\frac{{width}}{2}}] [2width,2width]平移到 [ 0 , w i d t h ] [0,width] [0,width]
  • Y轴平移: h e i g h t 2 {\frac{{height}}{2}} 2height将NDC的X坐标从 [ − h e i g h t 2 , h e i g h t 2 ] [−{\frac{{height}}{2}},{\frac{{height}}{2}}] [2height,2height]平移到 [ 0 , h e i g h t ] [0,height] [0,height]

正交投影将一个视锥体长方体 [ l , r ] [ b , t ] [ f , n ] {\rm{[l,r][b,t][f,n]}} [l,r][b,t][f,n]的长度(深度)、宽度和高度规范化到 [ − 1 , 1 ] [ − 1 , 1 ] [ − 1 , 1 ] {\rm{[-1,1][-1,1][-1,1]}} [1,1][1,1][1,1],变成了一个正方体。视口变换就是为了拉伸恢复回原始的宽度和高度,解决了从长方体到正方体的形变问题。


局部仿射逼近

局部仿射逼近:本质上是在某点附近用一个仿射函数去近似原函数。这种方法的核心思想是利用函数在该点的导数、梯度或者雅可比矩阵来构建这个线性近似。

  • 一元数量函数的导数与局部线性逼近: 对于一个一元函数 f ( x ) {\rm{f}}\left(x\right) f(x),在其定义域内的某一点 x 0 {x_0} x0处进行局部线性逼近,可以表示为:
    f ( x ) ≈ f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) {\rm{f}}\left( x \right) \approx {\rm{f}}\left( {{x_0}} \right) + {\rm{f}}\prime \left( {{x_0}} \right)\left( {x - {x_0}} \right) f(x)f(x0)+f(x0)(xx0)
    f ′ ( x 0 ) {\rm{f}}\prime \left( {{x_0}} \right) f(x0)是函数 f f f x 0 {x_0} x0点的导数。
    对于只有一个自变量的函数(一元函数),其导数是一个标量值,表示该函数在某一点上的瞬时变化率,也就是该点处切线的斜率。

    应用示例
    假设有一个函数 f ( x ) = x 2 {\rm{f}}\left( x \right) = {x^2} f(x)=x2,在点 x 0 = 1 {x_0} = 1 x0=1附近对其进行局部线性逼近。
    计算 f ( 1 ) = 1 2 = 1 {\rm{f}}\left( 1 \right) = {1^2} = 1 f(1)=12=1;计算导数 f ′ ( x ) = 2 x {\rm{f}}\prime \left( x \right) = 2x f(x)=2x,因此 f ′ ( 1 ) = 2 {\rm{f}}\prime \left( 1 \right) = 2 f(1)=2
    那么,在点 x 0 = 1 {x_0} = 1 x0=1附近的局部线性逼近公式为: f ( x ) ≈ 1 + 2 ( x − 1 ) = 2 x − 1 {\rm{f}}\left( x \right) \approx 1 + 2\left( {x - 1} \right) = 2x - 1 f(x)1+2(x1)=2x1

  • 多元数量函数的梯度与局部线性逼近: 对于一个多元函数 f ( x ) f\left( x \right) f(x),其中 x = ( x 1 , x 2 , . . . , x n ) x = \left( {{x_1},{x_2},...,{x_{\rm{n}}}} \right) x=(x1,x2,...,xn)是输入向量,在其定义域内的某一点 x 0 = ( x 01 , x 02 , . . . , x 0 n ) {x_0} = \left( {{x_{01}},{x_{02}},...,{x_{{\rm{0n}}}}} \right) x0=(x01,x02,...,x0n) 处进行局部线性逼近,可以表示为:
    f ( x ) ≈ f ( x 0 ) + ∇ f ( x 0 ) ( x − x 0 ) f\left( x \right) \approx f\left( {{x_0}} \right) + \nabla f\left( {{x_0}} \right)\left( {x - {x_0}} \right) f(x)f(x0)+f(x0)(xx0)
    ∇ f ( x 0 ) {\rm{\nabla f}}\left( {{x_0}} \right) ∇f(x0)是函数 f f f x 0 {x_0} x0点的梯度向量,包含了所有偏导数信息:
    ∇ f ( x 0 ) = [ ∂ f ∂ x 1 ( x 0 ) , ∂ f ∂ x 2 ( x 0 ) , . . . , ∂ f ∂ x n ( x 0 ) ] \nabla f\left( {{x_0}} \right) = \left[ {\frac{{\partial f}}{{\partial {x_1}}}({x_0}),\frac{{\partial f}}{{\partial {x_2}}}({x_0}),...,\frac{{\partial f}}{{\partial {x_n}}}({x_0})} \right] f(x0)=[x1f(x0),x2f(x0),...,xnf(x0)]
    对于有多个自变量的函数(多元函数),其导数不再是一个简单的标量,而是一个梯度向量,每个分量 ∂ f ∂ x i ( x 0 ) {\frac{{\partial f}}{{\partial {x_i}}}({x_0})} xif(x0)表示变量 x i {x_i} xi在点 x 0 {x_0} x0处的偏导数,它指出了函数值增长最快的方向。

    应用示例
    假设有一个函数 f ( x , y ) = x 2 + y 2 f(x,y) = {x^2} + {y^2} f(x,y)=x2+y2,在点 ( x 0 , y 0 ) = ( 1 , 1 ) ({x_0},{y_0}) = (1,1) (x0,y0)=(1,1)附近对其进行局部线性逼近。
    计算 f ( 1 , 1 ) = 1 2 + 1 2 = 2 f(1,1) = {1^2} + {1^2}=2 f(1,1)=12+12=2;计算梯度 ∇ f ( x , y ) = [ 2 x , 2 y ] \nabla {\rm{f}}\left( {x,y} \right) = \left[ {2x,2y} \right] f(x,y)=[2x,2y],因此 ∇ f ( 1 , 1 ) = [ 2 , 2 ] \nabla {\rm{f}}\left( {1,1} \right) = \left[ {2,2} \right] f(1,1)=[2,2]
    那么,在点 ( x 0 , y 0 ) = ( 1 , 1 ) ({x_0},{y_0}) = (1,1) (x0,y0)=(1,1)附近的局部线性逼近公式为: f ( x , y ) ≈ 2 + [ 2 , 2 ] ⋅ [ ( x − 1 ) , ( y − 1 ) ] = 2 + 2 ( x − 1 ) + 2 ( y − 1 ) = 2 x + 2 y − 2 f\left( {x,y} \right) \approx 2 + \left[ {2,2} \right] \cdot \left[ {(x - 1),(y - 1)} \right] = 2 + 2(x - 1) + 2(y - 1) = 2x + 2y - 2 f(x,y)2+[2,2][(x1),(y1)]=2+2(x1)+2(y1)=2x+2y2

  • 多元向量值函数的雅可比矩阵与局部线性逼近: 对于一个从 R n {R^n} Rn映射到 R m {R^m} Rm的多元向量值函数 f ( x ) f\left( x \right) f(x),其中 x = ( x 1 , x 2 , . . . , x n ) x = \left( {{x_1},{x_2},...,{x_{\rm{n}}}} \right) x=(x1,x2,...,xn)是输入向量,而 f ( x ) = ( f 1 ( x ) , f 2 ( x ) , . . . f m ( x ) ) f\left( x \right) = \left( {{f_1}\left( x \right),{f_2}\left( x \right),...{f_m}\left( x \right)} \right) f(x)=(f1(x),f2(x),...fm(x))是输出向量,在其定义域内的某一点 x 0 = ( x 01 , x 02 , . . . , x 0 n ) {x_0} = \left( {{x_{01}},{x_{02}},...,{x_{{\rm{0n}}}}} \right) x0=(x01,x02,...,x0n) 处进行局部线性逼近,可以表示为:
    f ( x ) ≈ f ( x 0 ) + J ( x 0 ) ( x − x 0 ) f\left( x \right) \approx f\left( {{x_0}} \right) + J\left( {{x_0}} \right)\left( {x - {x_0}} \right) f(x)f(x0)+J(x0)(xx0)
    J ( x 0 ) J\left( {{x_0}} \right) J(x0)是函数 f f f x 0 {x_0} x0点的雅可比矩阵,描述了各输出分量相对于输入变量的变化率:
    J ( x 0 ) = [ ∂ f 1 ∂ x 1 ( x 0 ) ∂ f 1 ∂ x 2 ( x 0 ) . . . ∂ f 1 ∂ x n ( x 0 ) ∂ f 2 ∂ x 1 ( x 0 ) ∂ f 2 ∂ x 2 ( x 0 ) . . . ∂ f 3 ∂ x n ( x 0 ) . . . . . . . . . . . . ∂ f m ∂ x 1 ( x 0 ) ∂ f m ∂ x 2 ( x 0 ) . . . ∂ f m ∂ x n ( x 0 ) ] J\left( {{x_0}} \right) = \left[ {\begin{array}{c} {\frac{{\partial {f_1}}}{{\partial {x_1}}}({x_0})}&{\frac{{\partial {f_1}}}{{\partial {x_2}}}({x_0})}&{...}&{\frac{{\partial {f_1}}}{{\partial {x_n}}}({x_0})}\\ {\frac{{\partial {f_2}}}{{\partial {x_1}}}({x_0})}&{\frac{{\partial {f_2}}}{{\partial {x_2}}}({x_0})}&{...}&{\frac{{\partial {f_3}}}{{\partial {x_n}}}({x_0})}\\ {...}&{...}&{...}&{...}\\ {\frac{{\partial {f_m}}}{{\partial {x_1}}}({x_0})}&{\frac{{\partial {f_m}}}{{\partial {x_2}}}({x_0})}&{...}&{\frac{{\partial {f_m}}}{{\partial {x_n}}}({x_0})} \end{array}} \right] J(x0)= x1f1(x0)x1f2(x0)...x1fm(x0)x2f1(x0)x2f2(x0)...x2fm(x0)............xnf1(x0)xnf3(x0)...xnfm(x0)
    对于有多元向量值函数,它的导数是 m × n m×n m×n雅可比矩阵(Jacobian),其中每个元素 ∂ f i ∂ x j ( x 0 ) \frac{{\partial {f_i}}}{{\partial {x_j}}}({x_0}) xjfi(x0)表示第 i i i个输出分量关于第 j j j个输入变量在点 x 0 {x_0} x0处的偏导数,它描述了函数在某一点上如何局部地变换空间。

    应用示例
    假设有一个函数 f ( x , y ) = [ x 2 , x y ] f(x,y) = [{x^2},xy] f(x,y)=[x2,xy],在点 ( x 0 , y 0 ) = ( 1 , 1 ) ({x_0},{y_0}) = (1,1) (x0,y0)=(1,1)附近对其进行局部线性逼近。
    计算 f ( 1 , 1 ) = [ 1 2 , 1 × 1 ] = [ 1 , 1 ] f(1,1) = \left[ {{1^2},1 \times 1} \right] = \left[ {1,1} \right] f(1,1)=[12,1×1]=[1,1];计算梯度 J ( x , y ) = [ 2 x 0 y x ] J\left( {x,y} \right) = \left[ {\begin{array}{c} {2x}&0\\y&x\end{array}} \right] J(x,y)=[2xy0x],因此 J ( x , y ) = [ 2 0 1 1 ] J\left( {x,y} \right) = \left[ {\begin{array}{c} {2}&0\\1&1\end{array}} \right] J(x,y)=[2101]
    那么,在点 ( x 0 , y 0 ) = ( 1 , 1 ) ({x_0},{y_0}) = (1,1) (x0,y0)=(1,1)附近的局部线性逼近公式为: f ( x , y ) ≈ [ 1 , 1 ] + [ 2 0 1 1 ] [ x − 1 y − 1 ] = [ 2 x − 1 x + y − 1 ] f\left( {x,y} \right) \approx [1,1] + \left[ {\begin{array}{c}2&0\\1&1\end{array}} \right]\left[ {\begin{array}{c}{x - 1}\\{y - 1}\end{array}} \right] = \left[ {\begin{array}{c}{2x - 1}\\{x + y - 1}\end{array}} \right] f(x,y)[1,1]+[2101][x1y1]=[2x1x+y1]


3DGS中几何变换变化过程

3DGS的视图变换

之前的基础知识讲解已经说明了什么是仿射变换,视图变换本质上是一种仿射变换。
世界坐标系下:高斯核中心(均值): t c = [ t x , t y , t z ] {{\rm{t}}_c} = [{t_x},{t_{\rm{y}}},{t_z}] tc=[tx,ty,tz];高斯函数: G ( x ; t c , Σ ) G\left( {x;{t}_c ,\Sigma } \right) G(x;tc,Σ)
相机坐标系下:高斯核中心(均值): u c = R t c + T = [ u x , u y , u z ] {u_c} = R{{\rm{t}}_c} + T = [{u_x},{u_{\rm{y}}},{u_z}] uc=Rtc+T=[ux,uy,uz];协方差矩阵: Σ ′ = R Σ R T \Sigma \prime = R\Sigma {R^T} Σ′=RΣRT;高斯函数: G ( x ; u c , Σ ′ ) G\left( {x;{u}_c ,\Sigma \prime} \right) G(x;uc,Σ′)

为什么协方差没有 + T + T +T,在协方差矩阵控制椭球那篇博文中已经做了证明。

3DGS的投影变换

正交投影是一种仿射变换,但是透视投影不是仿射变换,因为透视投影到正交投影的压缩过程是非线性的的。3DGS引入雅可比近似矩阵解决这个问题。

解释: 协方差矩阵表示的是分布的形状和方向信息,是一个二阶张量(矩阵),直接对协方差矩阵应用透视投影,会破坏其几何意义,因为透视投影是非线性的,会导致形变,需要用雅可比矩阵来正确传播其变换。但是均值向量(点)可以,因为只是对一个点做变换,不需要考虑形变、方向或尺度变化。

对于任意一点进行投影变换:
M p e r s p − > o r t h o [ x y z 1 ] = [ n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ] [ x y z 1 ] = [ n x n y ( n + f ) z − n f z ] = [ n z x n z y ( n + f ) − n f z 1 ] {M_{persp - > ortho}}\left[ {\begin{array}{c} {\rm{x}}\\ {\rm{y}}\\ {\rm{z}}\\ 1 \end{array}} \right] = \left[ {\begin{array}{c} n&0&0&0\\ 0&n&0&0\\ 0&0&{n + f}&{ - nf}\\ 0&0&1&0 \end{array}} \right]\left[ {\begin{array}{c} {\rm{x}}\\ {\rm{y}}\\ {\rm{z}}\\ 1 \end{array}} \right] = \left[ {\begin{array}{c} {{\rm{nx}}}\\ {{\rm{ny}}}\\ {{\rm{(}}n + f{\rm{)z}} - nf}\\ z \end{array}} \right] = \left[ {\begin{array}{c} {\frac{{\rm{n}}}{{\rm{z}}}{\rm{x}}}\\ {\frac{{\rm{n}}}{{\rm{z}}}{\rm{y}}}\\ {{\rm{(}}n + f{\rm{)}} - \frac{{{\rm{nf}}}}{{\rm{z}}}}\\ 1 \end{array}} \right] Mpersp>ortho xyz1 = n0000n0000n+f100nf0 xyz1 = nxny(n+f)znfz = znxzny(n+f)znf1
高斯核中心(均值点) μ c = [ μ x , μ y , μ z ] \mu_c = [{\mu _x},{\mu _y},{\mu _z}] μc=[μx,μy,μz]的投影变换为 μ c ′ = [ n z μ x , n z μ y , ( n + f ) − n f μ z ] \mu_c\prime =[\frac{{\rm{n}}}{{\rm{z}}}{\mu _{\rm{x}}},\frac{{\rm{n}}}{{\rm{z}}}{\mu _y},{\rm{(}}n + f{\rm{)}} - \frac{{{\rm{nf}}}}{{{\mu _z}}}] μc=[znμx,znμy,(n+f)μznf]
简化一下投影变换的形式:
[ f 1 ( x ) f 2 ( x ) f 3 ( x ) ] = [ n z x n z y ( n + f ) − n f z ] \left[ {\begin{array}{c} {{f_1}(x)}\\ {{f_2}(x)}\\ {{f_3}(x)} \end{array}} \right] = \left[ {\begin{array}{c} {\frac{{\rm{n}}}{{\rm{z}}}x}\\ {\frac{{\rm{n}}}{{\rm{z}}}y}\\ {{\rm{(}}n + f{\rm{)}} - \frac{{{\rm{nf}}}}{z}} \end{array}} \right] f1(x)f2(x)f3(x) = znxzny(n+f)znf
雅可比矩阵:
J = [ ∂ f 1 ∂ x ∂ f 1 ∂ y ∂ f 1 ∂ z ∂ f 2 ∂ x 1 ∂ f 2 ∂ y ∂ f 2 ∂ z ∂ f 3 ∂ x ∂ f 3 ∂ y ∂ f 3 ∂ z ] = [ n z 0 − n x z 2 0 n z − n y z 2 0 0 − n f z 2 ] J = \left[ {\begin{array}{c} {\frac{{\partial {f_1}}}{{\partial x}}}&{\frac{{\partial {f_1}}}{{\partial y}}}&{\frac{{\partial {f_1}}}{{\partial z}}}\\ {\frac{{\partial {f_2}}}{{\partial {x_1}}}}&{\frac{{\partial {f_2}}}{{\partial y}}}&{\frac{{\partial {f_2}}}{{\partial z}}}\\ {\frac{{\partial {f_3}}}{{\partial x}}}&{\frac{{\partial {f_3}}}{{\partial y}}}&{\frac{{\partial {f_3}}}{{\partial z}}} \end{array}} \right] = \left[ {\begin{array}{c} {\frac{n}{z}}&0&{ - \frac{{nx}}{{{z^2}}}}\\ 0&{\frac{n}{z}}&{ - \frac{{ny}}{{{z^2}}}}\\ 0&0&{ - \frac{{nf}}{{{z^2}}}} \end{array}} \right] J= xf1x1f2xf3yf1yf2yf3zf1zf2zf3 = zn000zn0z2nxz2nyz2nf
在高斯椭球中心点附近去做雅可比矩阵局部线性逼近!!!
协方差矩阵: Σ ′ ′ = J Σ ′ J T = J R Σ R T J T \Sigma \prime \prime = J\Sigma \prime {J^T} = JR\Sigma {R^T} {J^T} Σ′′=JΣ′JT=JRΣRTJT
高斯函数: G ( x ; u c ′ , Σ ′ ′ ) G\left( {x;{u}_c \prime ,\Sigma \prime \prime} \right) G(x;uc,Σ′′)

雅可比矩阵局部线性逼近公式: f ( x ) ≈ f ( x 0 ) + J ( x 0 ) ( x − x 0 ) f\left( x \right) \approx f\left( {{x_0}} \right) + J\left( {{x_0}} \right)\left( {x - {x_0}} \right) f(x)f(x0)+J(x0)(xx0)。同理,为什么协方差没有 + f ( x 0 ) + f\left(x_0 \right) +f(x0),在协方差矩阵控制椭球那篇博文中已经做了证明。

3DGS的视口变换

在3DGS中:对均值点正常使用投影变换,范围在 [ − 1 , 1 ] [ − 1 , 1 ] [ − 1 , 1 ] {\rm{[-1,1][-1,1][-1,1]}} [1,1][1,1][1,1],因此后续需要做视口变换;而对协方差矩阵则使用雅可比矩阵,范围在 [ l , r ] [ b , t ] [ f , n ] {\rm{[l,r][b,t][f,n]}} [l,r][b,t][f,n],不需要视口变换。
高斯核中心(均值): u c ′ ′ = M v i e w p o r t u c ′ {u_c}\prime \prime= {M_{viewport}}{{u_c}\prime} uc′′=Mviewportuc
协方差矩阵: Σ ′ ′ = J Σ ′ J T = J R Σ R T J T \Sigma \prime \prime = J\Sigma \prime {J^T} = JR\Sigma {R^T} {J^T} Σ′′=JΣ′JT=JRΣRTJT
高斯函数: G ( x ; u c ′ ′ , Σ ′ ′ ) G\left( {x;{u}_c\prime \prime ,\Sigma \prime \prime} \right) G(x;uc′′,Σ′′)
这里不再过多的赘述。


总结

尽可能简单、详细的介绍了高斯椭球的几何变换原理。


网站公告

今日签到

点亮在社区的每一天
去签到