前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >UE(5):投影、傅里叶变换与球谐函数

UE(5):投影、傅里叶变换与球谐函数

作者头像
Peter Lu
发布2022-12-22 15:05:16
9040
发布2022-12-22 15:05:16
举报
文章被收录于专栏:LETLET

我需要一块二向箔,清理用 --- 《三体》

本篇系统介绍了个人对投影的理解,包括投影的数学概念和主要应用,以及如何在频域(傅里叶变换)和球面(球谐)上进行投影的相关内容。最后介绍了UE中球谐函数的实现细节。

投影

写作第一准则,“每增加一条公式便减少一半的读者”。虽然我百般的不舍,但还是得把事情说清楚,只好洒脱的安慰自己,我将失去活成一种获得。

Conformal Map

这样,只需要找到一个合适的目标函数,通过投影矩阵求解该函数的最小值,则可以解决很多现实中的应用,比如下图的地图投影,我们定义的目标函数是在三维空间投影到二维平面时,保持角度不变(conformal)。

地图投影

傅里叶变换

傅里叶变换

傅里叶级数

2D傅里叶变换

点到中心的距离和方向分别代表了频率和平面波方向,而计算过程则和一维傅里叶没有差别。正如之前所说,傅里叶变换实现了空域,时域和频域的转换,数据有了一种新的表达方式。基于这种方式,可以实现数据的分析,压缩,以及预处理等各类应用。

球谐函数

傅里叶变换让我们实现了函数投影到正弦函数(频域)上,那投影在球面上会是什么效果呢?

球谐函数基函数

球谐函数还原

问题来了,数学家是怎么想到的,是先有了形状,还是先有的勒让德多项式。答案要从拉普拉斯方程说起(该部分不感兴趣的可以忽略,并不影响对球谐的理解)。

假设存在一个标量场,每一点对应一个数值,可以代表该点的温度,或者任何物理意义,拉普拉斯方程描述了该点对应梯度的散度。梯度容易理解,就是该点和临近点的变化情况,在三维空间中是一个的向量(下图)。

梯度

我们在该点无限小的空间构建一个微表面,散度(Divergence)则描述了在该表面流入和流出的变换情况。

散度

拉普拉斯方程则是先求一个标量场的梯度(向量场),然后求解该梯度的散度。如上图,梯度表达了该点的趋势,而梯度的散度则可以追溯这个趋势的源头(正)和尽头(负)。当拉普拉斯方程的值为零时,则代表了一种状态上的均衡,和谐,这也是Harmonics的由来。

如上是对一个标量场某一点x方向的二阶导的计算方式,y和z方向计算方式相同。当我们求解球面坐标系下的拉普拉斯方程,则得到球面上的谐和函数(Spherical Harmonics)。

下面,我们看一下UE中球谐函数对应的实现。

TSHVector

UE中的球谐函数封装在TSHVector模板类中,支持2阶和3阶,分别对应4个和9个基函数。

代码语言:javascript
复制
// SHMath.cpp
static int32 InitSHTables()

在初始化时,会构建BasisLBasisMNormalizationConstants三个全局变量。BasisLBasisM对应每一个基函数BasisIndex对应的L和M,而NormalizationConstants表示标准化因子(时还需乘以):

上面的部分是固定不变的,而一组完整的球谐基函数则调用SHBasisFunction方法实现,输入参数是世界坐标系下的方向Vector,主要方法是LegendrePolynomial

代码语言:javascript
复制
// SHMath.h
static TSHVector SHBasisFunction(const FVector& Vector)

这样,我们获取了一组基函数对象TSHVector,对应最终的因子是积分下的内积,分别对应求和和乘法操作,分别调用如下的方法实现,因为参数是一个颜色,所以最终返回的是TSHVectorRGB,包括R,G,B三个分量。

代码语言:javascript
复制
// SHMath.h
TSHVectorRGB<Order> operator*(const TSHVector<Order>& A,const FLinearColor& B)
TSHVectorRGB operator+(const TSHVectorRGB& A,const TSHVectorRGB& InB)

返回的结果TSHVectorRGB,里面存储了一组基函数对应的所有。

如上就是UE中球谐函数如何变换,生成基函数因子的过程。只要我们理解了球谐的原理,可以发现,UE中关于球谐的实现算法上并不复杂,属于无脑套公式的操作;主要还是在接口封装以及模板设计上的理解。

另外,ApplyWindowing方法用于解决球谐函数的振铃效应(ringing artifacts),这个和傅里叶变换中的原因一样,无论是球谐还是傅里叶,缺点就是无法保留高频部分的信息,因此在边界等高频区域,则无法真实还原。但我搜了一遍,该方法仅在Volume中调用。

这里仅介绍了UE中如何创建球谐函数,而如何使用球谐函数,属于lightmap的范畴。

总结

本文介绍了我对投影的理解,从基本的投影概念,最小二乘法,然后延伸到频域的傅里叶变换,以及球面的球谐函数。阐述了我对投影,傅里叶变换以及球谐函数的理解。最后给出了UE中球谐函数生成基函数因子的实现方法。似乎,我们还可以投影到导数上,你是否想到了另一位数学家呢?

写到这,突然想起了很久前看的电子书《Heros in my heart》,介绍了很多数学家的故事。借作者的话来做结尾:美丽有两种,一是深刻又动人的方程,一是你泛着倦意淡淡的笑容。

参考资料

[1]

3D Modelling Lecture 5 - Linear Algebra 3: https://www.cs.uu.nl/docs/vakken/ddm/2019-2020/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-08-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 LET 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 投影
  • 傅里叶变换
  • 球谐函数
    • TSHVector
    • 总结
      • 参考资料
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档