# 谐函数

谐函数就是满足 拉普拉斯方程 的函数,这个方程的数学意义是梯度的散度为 0,物理意义是稳定,集合形状上像椭圆

2u=0\nabla^2u=0

  • 一个不与外界做能量交换的系统,它的总能量是稳定的,尽管他内部可能进行着能量交换
  • 一个不受外力的系统,它的整体加速度是 0,尽管内部的物体可能在运动
  • 一个震动的理想弹簧、一个没有组里的理想钟摆,他们将一直规律运动下去

这些都是稳定状态

三维直角坐标系下的 拉普拉斯方程

2u=2ux2+2uy2+2uz2=0 \nabla^2u=\frac{\partial^2u}{\partial x^2}+\frac{\partial^2u}{\partial y^2}+\frac{\partial^2u}{\partial z^2} = 0

# 球坐标下的拉普拉斯方程

球坐标转换成的三维直角坐标系参数方程代入

{x=rsinθcosϕy=rsinθsinϕz=rcosθ\left\{\begin{matrix} x=r\text{sin}\theta\text{cos}\phi \\ y=r\text{sin}\theta\text{sin}\phi \\ z=r\text{cos}\theta \end{matrix}\right.

得到球坐标下的拉普拉斯方程如下:

2u=1r2r(r2ur)+1r2sinθθ(sinθuθ)+1r2sin2θθ2uϕ2=0 \nabla^2u=\frac{1}{r^2}\frac{\partial}{r}(r^2\frac{\partial u}{\partial r})+\frac{1}{r^2\text{sin}\theta}\frac{\partial}{\partial \theta}(\text{sin}\theta\frac{\partial u}{\partial \theta})+\frac{1}{r^2\text{sin}^2\theta}\frac{\partial}{\partial \theta}\frac{\partial^2 u}{\partial \phi^2} = 0

# 球谐函数

对于任意一个球坐标系下的函数:u(r,θ,ϕ)u(r,\theta,\phi),分离变量:

u(r,θ,ϕ)=R(r)Y(θ,ϕ)u(r,\theta,\phi)=R(r)Y(\theta,\phi)

  • R® 表示距离部分
  • Y (\theta,\phi) 表示方向部分,即球谐函数

# 球谐函数表达式的推导

将 R 和 Y 代入拉普拉斯方程

Yr2ddr(r2dRdr)+Rr2sinθθ(sinθYθ)+Rr2sin2θ2Yϕ2=0\frac{Y}{r^2}\frac{d}{dr}(r^2\frac{dR}{dr})+\frac{R}{r^2\text{sin}\theta}\frac{\partial}{\partial \theta}(\text{sin}\theta\frac{\partial Y}{\partial \theta})+\frac{R}{r^2\text{sin}^2\theta}\frac{\partial^2 Y}{\partial \phi^2}=0

移项化简:

1Rddr(r2dRdr)=1sinθYθ(sinθYθ)1Y1sin2θ2Yϕ2\frac{1}{R}\frac{d}{dr}(r^2\frac{dR}{dr})=-\frac{1}{\text{sin}\theta Y}\frac{\partial}{\partial \theta}(\text{sin}\theta\frac{\partial Y}{\partial \theta})-\frac{1}{Y}\frac{1}{\text{sin}^2\theta}\frac{\partial^2 Y}{\partial \phi^2}

假设两边函数同时等于一个常数,设为 l (l+1),得到两个新方程:

ddr(r2dRdr)l(l+1)R=01sinθθ(sinθYθ)+1sin2θ2Yϕ2+l(l+1)Y=0\frac{d}{dr}(r^2\frac{dR}{dr})-l(l+1)R=0 \\ \frac{1}{\text{sin}\theta}\frac{\partial}{\partial\theta}(\text{sin}\theta\frac{\partial Y}{\partial \theta})+\frac{1}{\text{sin}^2\theta}\frac{\partial^2 Y}{\partial \phi^2}+l(l+1)Y=0

其中第二个方程被称为 球函数方程

进一步分离变量,令Y(θ,ϕ)=Θ(θ)Φ(ϕ)Y(\theta,\phi)=\varTheta(\theta)\varPhi(\phi)

可以得到两个常微分方程,只记第二个

sinθddθ(sinθdΘdθ)+[l(l+1)sin2θλ]Θ=0 \text{sin}\theta\frac{d}{d\theta}(\text{sin}\theta\frac{d\varTheta}{d\theta})+[l(l+1)\text{sin}^2\theta-\lambda]\varTheta=0

经过一系列转换可以得到 l 阶连带勒让德方程

(1x2)d2Θdx22xdΘdx+[l(l+1)m21x2]Θ=0(1-x^2)\frac{d^2\varTheta}{dx^2}-2x\frac{d\varTheta}{dx}+[l(l+1)-\frac{m^2}{1-x^2}]\varTheta=0

上面方程的解,Θ\varTheta 即为连带勒让德函数,记为Plm(x)P^m_l(x)

Plm(x)=Θ=(1x2)m2Pl[m](x)P^m_l(x) = \varTheta=(1-x^2)^\frac{m}{2}P^\text{[m]}_l(x)

  • Pl[m](x)P^\text{[m]}_l(x)Pl(x)P_l(x) 的 m 阶导数
  • Pl(x)P_l(x) 是勒让德函数,它的前几阶为

0 1
1 x
2 12(3x21)\frac{1}{2}(3x^2-1)
3 12(5x33x)\frac{1}{2}(5x^3-3x)

Y 对 l 的 m 阶导数表达式为:

Ylm(θ,ϕ)=(1)m2l+14π(lm)!(1+m)!Plm(cosθ)eimϕY^m_l(\theta,\phi)=(-1)^m\sqrt{\frac{2l+1}{4\pi}\frac{(l-|m|)!}{(1+|m|)!}}P^m_l(\text{cos}\theta)e^{im\phi}

同理结合 P 可以求出 Y 的前两阶表达式,然后可以得到其直角坐标系的表达式,下面链接可以看到
而 Unity 或者通常游戏开发中是直接将一二阶的球谐函数近似值的实际公式求出,然后直接将参数代入求出的

比如下列:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//由颜色转成参数
SH9 CalculateCoefficients(float3 normal)
{
float A0 = Pi;
float A1 = (2.0f * Pi) / 3.0f;
float A2 = Pi * 0.25f;

SH9 sh;
//球谐函数l=0,m=0
sh.c[0] = 0.282095 * A0;
//m=-1,l=1
sh.c[1] = 0.488603 * normal.x * A1;
//m=0,l=1
sh.c[2] = 0.488603 * normal.z * A1;
sh.c[3] = 0.488603 * normal.y * A1;
sh.c[4] = 1.092548 * normal.x * normal.z * A2;
sh.c[5] = 1.092548 * normal.y * normal.z * A2;
sh.c[6] = 1.092548 * normal.y * normal.x * A2;
sh.c[7] = (0.946176 * normal.z * normal.z - 0.315392) * A2;
sh.c[8] = 0.546274 * (normal.x * normal.x - normal.y * normal.y) * A2;

return sh;
}
//由SH转回颜色
float3 CalculateColor(SH9 coeffs)
{
float3 color = coeffs.c[0] * _SHData[0].rgb

+ coeffs.c[1] * _SHData[1].rgb
+ coeffs.c[2] * _SHData[2].rgb
+ coeffs.c[3] * _SHData[3].rgb

+ coeffs.c[4] * _SHData[4].rgb
+ coeffs.c[5] * _SHData[5].rgb
+ coeffs.c[6] * _SHData[6].rgb
+ coeffs.c[7] * _SHData[7].rgb
+ coeffs.c[8] * _SHData[8].rgb;
return color;
}
更新于

请我喝[茶]~( ̄▽ ̄)~*

Solvarg 微信支付

微信支付

Solvarg 支付宝

支付宝

Solvarg 贝宝

贝宝