Splatting
-
一种体渲染方法,从3D物体渲染到2D平面
-
也叫抛雪球方法
-
核心
-
选择雪球
-
抛掷,3D投影到2D
-
合成形成最后图像
-
捏雪球
(搞定一个核形状)
选择3D高斯椭圆
仿射后高斯仍闭合
3D降2D依然为高斯(沿一个轴积分)
3D gaussian为什么是椭球?
v的概率密度函数
x的概率密度函数
把变换矩阵A转换为协方差矩阵
一维:均值和方差相关
高维:均值和协方差矩阵
协方差矩阵:
都是常数,二维时是椭圆
三维
推导公式发现 ------ 为常数时,有一个椭球面
高斯取值范围0~1,两边同时乘根号下,可知3D高斯本质是椭球面一层一层相嵌套(俄罗斯套娃)实心的椭球
各向同性
在所有方向具有相同扩散程度(球)
3d高斯分布:协方差矩阵是对角矩阵
各向异性
在不同方向具有不同扩散程度(梯度)
椭球
3d高斯分布:协方差矩阵是对角矩阵
协方差矩阵如何控制椭球形状
x是三位xyz
Σ是协方差
对于标准的高斯分布:
对角线是1,其他为0
任意高斯可以看作是标准高斯通过仿射变换得到
协方差矩阵可以通过旋转和缩放矩阵表达
R:旋转
S:缩放
b:平移
知道了Σ可以通过特征值得到R、S
计算协方差矩阵的代码
computeCov3D函数
def computeCov3D(scale, mod, rot): S = np.array([[scale[0]*mod,0,0], [0,scale[1]*mod,0], [0,0,scale[2]*mod]]) R = rot M = np.dot(S,R) cov3D = np.dot(M,M.T) return cov3Dscale: 缩放(一列数)
rot: 旋转(3×3矩阵)
mod:缩放(默认为1)
先将输入的S变成3*3的正常的矩阵
R = rot 还是原来的旋转矩阵
m =R*S
高斯协方差 cov3D = R*S *S转置 * R转置= m*m转置
抛雪球(3D到像素)
CG
-
观测变换
-
投影变换
-
视口变换
-
光栅化
观测变换
世界坐标系到相机坐标系
横看成岭侧成峰,远近高低各不同
仿射变换
w = Ax + b
投影变换
相机坐标系直接到2D的一个空间
3D到2D
正交投影,与z无关(右,没有远小近大)
透视投影,与z相关(左)
视口变换
进行拉伸,与z无关
最开始将长方体拉伸成正方体,在这一步要拉伸回来
将[-1 , 1]2的矩形变换至[0,w] × [0 ,h]
此时已经将任意3D拉伸到2D平面
光栅化
把东西画在屏幕上
连续转离散
采用方法:采样
从连续空间到离散空间
正交投影
-
立方体[l,r] * [b,t] * [f,n] 左右上下前后
-
平移到原点
-
立方体缩放至[-1,1]3的正方体
-
仿射变换
-
左:缩放 右:平移
透视投影
-
近小远大
-
先把锥体“压”成立方体
-
再正交投影
-
透视投影是非线性的,即非仿射变换
我们希望高斯椭球一直进行仿射变换(简单不复杂)
Blender仿真&代码
frame = create_canvas(700,700) //700*700的画布 angle = 0 //相机位置放在(0,0,5) eye = [0,0,5] pts = [[2,0,-2], [0,2,-2], [-2,0,-2]] //有三个点 viewport = get_viewport_matrix(700,700) //视口变换的矩阵 mvp = get_model_matrix(angle) mvp = np.dot(get_view_matrix(eye),mvp) //观测矩阵 mvp = np.dot(get_proj_matrix(45,1,0.1,50),mvp) //投影矩阵 pts_2d = [] for p in pts: //遍历每个点 p = np.array(p + [1]) p = np.dot(mvp,p) //每个点先乘变换矩阵 print(p) p/= p[3] //归一化 p = np.dot(viewport,p)[:2] //最后乘以视口变换的矩阵,拉回原有大小w*h pts_2d.append([int(p[0]),int(p[1])]) //2D层面每个点的值
3D高斯
观测变化
(均值&协方差)
投影变换
-
空间中任何一个点进行x = m(t)的变化 非线性
-
均值可以,一个点
-
协方差矩阵不行,多个点非线性变化
因此引入雅可比
从透视投影到正交投影
非线性变换,非仿射
投影变换后
此时均值和协方差在一个坐标系里吗?
均值
在NDC坐标系里([-1,1]3的立方体里)
需要做视口变换
协方差矩阵
在未缩放的的正交坐标系里
范围[l,r]×[b,t]×[f,n]
不需要视口变换
雅可比矩阵
-
泰勒展开(导+导导+导导导+......)
-
线性逼近(线性逼近一个非线性的东西)
坐标变换(x,y)
公式:
视口变换
(只对中心点有关系,均值,与协方差没关系)
-
高斯核中心 进行平移+缩放
-
足迹渲染:离散计算 与协方差有关
距离均值越近值越大
代码部分
3D高斯中心的变换
p_hom = transformPoint4x4(p_orig,projmatrix) //有一个点P通过projmatris观测、投影变换得到新的点(pro是观测变换×投影变换得到的矩阵) p_w = 1/(p_hom[3] + 0.0000001) p_proj= [p_hom[0]*p_w,p_homp[1]*p_w,p_hom[2]*p_w] //归一化 //此时这个点在正方体里 point_image = [ndc2Pix(p_proj[0],W),ndc2Pix(p_proj[1],H)] //光栅化,从NDC平面拉到像素平面
3D高斯协方差矩阵的变换
def computeCov2D(mean, focal_x, focal_y, tan_fovx, tan_fovy, cov3D, viewmatrix): t = transformPoint4x3(mean, viewmatrix) limx = 1.3 * tan_fovx limy = 1.3 * tan_fovy txtz = t[0] / t[2] tytz = t[1] / t[2] t[0] = min(limx, max(-limx, txtz)) * t[2] t[1] = min(limy, max(-limy, tytz)) * t[2] J = np.array([ [focal_x / t[2], 0, -(focal_x * t[0]) / (t[2] * t[2])], [0, focal_y / t[2], -(focal_y * t[1]) / (t[2] * t[2])], [0, 0, 0]]) W = viewmatrix[:3, :3] T = np.dot(J, W) cov = np.dot(T, cov3D) cov = np.dot(cov, T.T) cov[0, 0] += 0.3 cov[1, 1] += 0.3 return [cov[0, 0], cov[0, 1], cov[1, 1]]
-
viewmatrix : 世界坐标系转换到相机坐标系变换矩阵
-
雅可比矩阵:视锥到立方体的变化
mean是世界坐标系的中心点
focal_x,focal_y : x轴方向和y轴方向的焦距
tan_fovx,tan_fovy: 视角
cov3D:世界坐标系的3D高斯协方差矩阵
①算t:视锥里的位置
因为雅可比矩阵要求在一个点附近,才符合以线性去代替非线性的原理
这个点就是3D高斯的中心点
②雅可比矩阵
J = np.array......
此处与代码一一对应 (最后一行由于正交矩阵的时候不考虑z轴方向,不需要管,直接0就行)
③计算W、T
W是观测矩阵的前三行的值
T = J*W
④二维协方差矩阵cov = T*cov3D*cov3D的转置* T的转置
两行两列:
-
这里+0.3是为了加一个低通滤波器,把光栅的单独的离群点做一个优化
真正有效的是三个值,cov(0,0) cov(0,1) cov(1,1)
雪球颜色
基函数
-
任何一个函数都可以分解成正弦和余弦的线性组合
代码
def computeColorFromSH(deg, pos, campos, sh): dir = pos - campos dir = dir / np.linalg.norm(dir) result = SH_C0 * sh[0] if deg > 0: x, y, z = dir result = result - SH_C1 * y * sh[1] + SH_C1 * z * sh[2] - SH_C1 * x * sh[3] if deg > 1: xx, yy, zz = x * x, y * y, z * z xy, xz, yz = x * y, x * z, y * z result = (result + SH_C2[0] * xy * sh[4] + SH_C2[1] * yz * sh[5] + SH_C2[2] * (2.0 * zz - xx - yy) * sh[6] + SH_C2[3] * xz * sh[7] + SH_C2[4] * (xx - yy) * sh[8]) return result
-
deg:用了几阶球谐函数就是几
-
pos:3D高斯的中心
-
campos:相机的位置
-
sh:球谐函数的系数
dir求方向(颜色与方向有关)
从相机中心指向3D高斯的中心
第二步归一化
result是第零阶的结果
[1×3],RGB的基础颜色
只是第零阶就只有一种颜色
if deg:此时与方向有关
赋值xyz
各自的系数相乘xyz
第二阶段相乘就行
为什么球谐函数更好的表达颜色
-
一般是RGB 1*3的一个矩阵
-
球谐函数 16*3 表达更多更好
CG的角度去看
环境贴图
将一个图贴到表面上,营造出一个反射的效果,使表面看起来更光滑
这个球谐函数的球与高斯3D椭球没有关系!!这里的球是颜色空间里的球
合成图片
足迹合成
-
直观上进行α-blending
-
sheets = [] //遍历所有高斯 for g in gaussians: sheets.append(g.footprint) //每个高斯足迹函数添加到sheets列表里 alpha_blending(sheets) //对所有足迹进行α_blending操作
-
实际上G.footprint 依然对每一个像素着色(算每一个足迹的时候)
-
footprint = np.zeros(H,W,3) //空的矩阵 for i in range(H): //遍历每一个像素给颜色 for j in range(W): footprint[i,j] = ...
像素的颜色
深度排序:扔雪球有先后顺序,谁前谁后
体渲染——连续积分
-
连续积分,0~∞
-
δ(s) 在s点处它的密度
-
C(s) 在s点处的颜色
-
T(s) 一个像素点会有两个光,但我的光会特别亮遮蔽住你的光,T(s)光线没有被阻拦的概率,若被阻拦则直接为0
将一条直线分割成等份的段,进行离散化处理
高性能渲染与机器学习
GPU
-
cuda变成splatting部分
-
一个线程负责一个像素
splatting渲染
-
遍历所有像素,模拟GPU对单一像素的操作
-
遍历所有高斯,由近到远进行渲染
可重新点亮的 Gaussian Codec 头像
简介
Relightable Gaussian Codec Avatars,这是一种构建 高保真可重新照明的头部头像,可以进行动画处理以生成新颖的表情。
基于 3D 高斯的几何模型可以捕获 3D 一致的亚毫米细节
为了统一支持眼睛、皮肤和头发等人体头部的各种材料
提出一种基于可学习的辐射转移的新型可重新打光外观模型。 结合漫反射组件的全局照明感知球谐波,我们可以实现使用球形高斯进行全频反射的实时重新照明。 此外观模型可以在点光和连续光下实时高效地重新建模照明。
方法
-
RGCA以潜在为条件表达代码,凝视信息,和目标视图方向
-
底层几何体由 3D 参数化 Gaussian 的 Platting 技术可以有效地渲染
-
为了实现不同照明下的高效重照明,我们提出了一种基于漫射球谐波和镜面球高斯的可学习辐射传输方法
-
分解控件
表情
file:///C:/Users/Wanghao/Documents/Hexo/myblog/source/_posts/mp4/expression.mp4?lastModify=1729175670
目光
file:///C:/Users/Wanghao/Documents/Hexo/myblog/source/_posts/mp4/gaze.mp4?lastModify=1729175670
视图
file:///C:/Users/Wanghao/Documents/Hexo/myblog/source/_posts/mp4/view.mp4?lastModify=1729175670
照明
file:///C:/Users/Wanghao/Documents/Hexo/myblog/source/_posts/mp4/lighting.mp4?lastModify=1729175670
应用
VR 中的交互式重新照明和渲染
-
交互式点光源控制以及重新照明 自然照明
可以让VR看上去更加自然,当移动光源时,对应的VR图像也会由于渲染而变化,产生真实的阴暗变化形象
file:///C:/Users/Wanghao/Documents/Hexo/myblog/source/_posts/mp4/VR_demo.mp4?lastModify=1729175670
视频驱动动画
-
RDCA可以从视频流中实时驱动头戴式摄像头(HMC)
相当于对渲染出来的图像人物带上一个头戴式摄影机,此时在任何时候都可以监视到摄像头传出来的画面
file:///C:/Users/Wanghao/Documents/Hexo/myblog/source/_posts/mp4/driving.mp4?lastModify=1729175670
高斯头像:通过动态高斯的超高保真头部头像
介绍
-
由可控的 3D 高斯表示的高斯头部虚拟形象,用于高保真头部虚拟形象建模
-
优化了中性 3D 高斯分布和完全学习的基于 MLP 的变形场,以捕获复杂的表达式
-
完全学习的 (Fully Learned):这意味着整个模型或方法是通过机器学习(特别是深度学习)来训练和优化的,而不是通过传统的编程或手工设计的规则。
-
MLP (多层感知机):这是一个神经网络模型,由多个层组成,包括输入层、隐藏层和输出层。MLP通常用于各种任务,如分类、回归等。
-
变形场 (Deformation Field):在计算机视觉和计算机图形学中,变形场是一种表示物体形状变换的工具。例如,在图像处理领域,变形场可以用来进行图像配准、图像变形等。
完全学习的基于MLP的变形场 结合了这几个概念,具体来说,它指的是使用多层感知机(MLP)来学习和生成变形场。这个方法的步骤通常包括:
-
训练:用大量的数据来训练一个MLP网络,使其能够学习到如何将输入数据(例如,源图像)变形到目标数据(例如,目标图像)。
-
生成变形场:训练好的MLP模型可以生成变形场,这个变形场可以用来在图像之间进行对齐、配准或其他变形操作。
-
方法
-
首先在 Initialization 阶段优化了包括中性网格、变形 MLP 和彩色 MLP 在内的引导模型
-
使用它们来初始化中性高斯和动态生成器
-
通过可微渲染和超分辨率网络合成 2K RGB 图像
file:///C:/Users/Wanghao/Documents/Hexo/myblog/source/_posts/mp4/more_cross_3.mp4?lastModify=1729175670
-
不同方法对跨身份重演任务的定性比较。从左到右:NeRFBlendShape、NeRFace、HAvatar 和 Ours。我们的方法合成高保真图像,同时保证表达转移的准确性。
修剪 3D 高斯展开以实现精确的几何体表示
介绍
-
通过高斯修剪获得场景的精确 3D 几何图形
-
选择性地去除不准确的几何图形,同时保留准确的结构
-
分析单个 3D 高斯分布的贡献,并提出了一种基于贡献的修剪策略来去除冗余或不准确的高斯分布
-
相对较小的高斯尺度是表示和优化复杂细节的不可忽视的因素
-
原始 3DGS 和最先进的 2DGS 结合使用时,TrimGS 始终可产生更精确的几何图形和更高的感知质量
Trim3DGS 可以重建比 3DGS 更平滑的法线贴图
与 2DGS 相比,我们的 Trim2DGS 表现出更好的几何细节和感知质量
-
Trim比原始方法存储更小,3D会变得平滑一点,2D会让原本臃肿的画面变得细腻
-
Trim2DGS 可产生更均匀的高斯分布,同时减少存储消耗。
个人博客:https://myblog.b2wang.cn
标签:Gaussion,Splatting,矩阵,协方差,mp4,np,3D,高斯 From: https://blog.csdn.net/w574993075/article/details/143030199