- 抛雪球是从3D到像素的过程
- NeRF中使用了一个相机模型进行坐标系转换:
- 世界坐标系
- 相机坐标系
- 归一化坐标系
- 像素坐标系
- CG中有一个更常用的转换:
- 观测变换
- 世界坐标系 -> 相机坐标系
- 投影变换
- 相机坐标系 -> 2D空间
- 视口变换
- 光栅化
- 观测变换
1. 观测变换
假设有一个高斯椭球,我们从不同的角度去看它可能有不同的形态,这个过程的本质还是一个仿射变换


- 从世界坐标系到相机坐标系
- 横看成岭侧成峰,远近高低各不同
- 仿射变换
-
2. 投影变换
变换到相机角度之后,我们需要将高斯椭球映射到成像平面上,映射方法有两个:正交投影,透视投影

- 3D到2D
- 正交投影,与z无关
- 与深度无关,没有远小近大(图右)
- 透视投影,与z相关
2.1 正交投影
- 立方体
- 平移到原点
- 立方体缩放至
的正方体 - 仿射变换

2.2 透视投影
-
远小近大
-
先把锥体(视锥)“压”程立方体
-
再做正交投影

-
问题:
- 透视投影是非线性的,即非仿射变换,我们希望高斯椭球一直进行仿射变换
可以发现投影变换将一个立方体压成了一个正方体,这个过程中w和h的缩放比是不同的,肯定是有一个形变的,这个形变在后面视口变换会解决。
3. 视口变换
经过投影变换之后我们得到了一个
范围的正方体,我们再把它拉伸回最开始的 大小
-
进行拉伸:
-
与z无关
-
将
的举行变换至
-
3.1 光栅化
但是还有一个问题:比如mesh中的一个面片他是连续的,但是我们想把这个东西画到屏幕的时候,屏幕是离散的,这时就需要光栅化
-
定义:
-
把东西画在屏幕上
-
连续转离散
-
使用的方法:采样,看像素的中心点有没有落在面片里


-
光栅化中经常听到一个词叫形变(Aliasing),比如上图左下角那个像素有点离群,那我们的采样方式可能有点问题,可以采取其他的采样方式使他更自然。
1 | # 对空间中的三个点做光栅化 |
4. 对3d高斯进行变换
4.1 3d高斯的观测变换
-
在物理坐标系中,一个3d高斯有如下要素:
- 高斯核中心(均值):
- 协方差矩阵:
- 高斯核:
- 高斯核中心(均值):
-
观测变换将3d高斯从世界坐标系变到相机坐标系,这是一个仿射变换:
- 高斯核中心:
- 均值:
- 协方差矩阵:
- 高斯核:
- 高斯核中心:
4.2 3d高斯的投影变换
投影变换将锥体压成立方体,然后压成正方体:
,这个过程是非线性的,且有形变
-
上一步:
- 均值:
- 协方差:
- 均值:
-
高斯核中心:
-
高斯核:
-
均值:
- 对均值来说,它可以这样做,因为它只是一个点他不会形变
-
协方差矩阵?
- 协方差矩阵不能直接用投影变换得到,因为投影变换是非线性变换,非仿射变换
- 因此需要引入雅可比矩阵
- 这里可以理解成拆成两步:
- 通过雅可比矩阵实现近似的压缩(从视锥压缩成立方体
- 再做正交投影
- 这里可以理解成拆成两步:
4.2.1 雅可比矩阵
-
泰勒展开
-
线性逼近
-
例子:
-
假设有一个坐标(x,y),对他进行一个非仿射变换:
-
这样导致从一个横平竖直的坐标系变成了一个带弯曲的坐标系:(关注某一个点,比如(-2,1)这个点变到了黄色框这个位置,展开这个小框,中心点是(-2,1),其他附近的变换是非线性变化,


-
假设把黄色框框进一步缩小,它附近的变换可以近似成一个线性的变换:


-
也就是说确定了一个点
,在他附近就可以通过导数去进行线性的逼近了。具体就叫雅可比矩阵:
-
4.2.2 基于雅可比矩阵的投影变换
-
协方差矩阵:
-
已知对于投影变换中的一个点,第一步进行压缩:
-
我们发现变换关系是:
-
因此可以求雅可比矩阵(通常带入的是3d高斯的中心点):
变换之后,均值和协方差在一个坐标系里吗?
- 均值在NDC坐标系中,[-1,1]的立方体中
- 对于协方差矩阵来说,上面的操作只是将锥体压缩到立方体的一个过程,还没有放到[-1,1]立方体中,所以后面还原的时候,均值需要做视口变换,而协方差不需要
4.3 3d高斯的视口变换
视口变换只需要对高斯核的中心去做,不用对协方差做,因为前面对协方差做投影变换的时候其实没做完
- 投影变换之后:
- 高斯核中心:
- 高斯核:
- 足迹函数
- 高斯核中心:
- 像素坐标系:
- 高斯核中心:
- 平移+缩放
- 对协方差:足迹渲染:离散计算(距离均值越近它的值就越大)
-
- 高斯核中心: