当前位置: 首页 > news >正文

【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之高斯椭球的颜色表达

【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之高斯椭球的颜色表达

文章目录

  • 【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之高斯椭球的颜色表达
  • 前言
  • 球谐函数
    • 泰勒展开原理
    • 傅里叶级数原理
    • 球谐函数原理
  • 3D高斯中的球谐函数
  • 总结


前言

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


球谐函数

球谐函数可以类比泰勒展开,傅里叶级数,都是通过一组不同阶的基函数线性组合而成。泰勒展开的基函数是幂函数,傅里叶级数的基函数是三角函数,而球谐函数的基函数是球函数,即正交基为球函数,极坐标即球函数系数。

下面博主就按顺序简单讲解泰勒展开,傅里叶级数以及球谐函数的原理,帮助大家有个直观的感性认知。。

泰勒展开原理

泰勒展开的核心思想是: 用无穷级数(多项式)逼近一个函数,使其在某一点的附近与原函数尽可能接近。
数学表达:
f ( x ) = f ( a ) + f ′ ( a ) ( x − a ) + f ′ ′ ( a ) 2 ! ( x − a ) 2 + f ′ ′ ′ ( a ) 3 ! ( x − a ) 3 + . . . f(x) = f(a) + f'(a)(x - a) + \frac{f''(a)}{2!}(x - a)^2 + \frac{f'''(a)}{3!}(x - a)^3 + ... f(x)=f(a)+f(a)(xa)+2!f′′(a)(xa)2+3!f′′′(a)(xa)3+...

  • f ( a ) , f ′ ( a ) , f ′ ′ ( a ) , f ′ ′ ′ ( a ) f(a) ,f'(a),f''(a) ,f'''(a) f(a)f(a)f′′(a)f′′′(a)分别是函数 f f f及其各阶导数在点 a a a处的值, n ! n! n!是n的阶乘(所有从1到n的正整数的乘积);
  • 常数项: f ( a ) f(a) f(a)给出的是函数在 a a a点的值,代表了多项式与原函数在该点相等的基础;
  • 线性项: f ′ ( a ) ( x − a ) f'(a)(x - a) f(a)(xa)描述了函数在 a a a点附近的变化率(斜率),这使得多项式能够反映原函数在该点附近的趋势;
  • 高阶项: f ′ ′ ( a ) 2 ! ( x − a ) 2 \frac{f''(a)}{2!}(x - a)^2 2!f′′(a)(xa)2 f ′ ′ ′ ( a ) 3 ! ( x − a ) 3 \frac{f'''(a)}{3!}(x - a)^3 3!f′′′(a)(xa)3等高阶导数的信息使得多项式能更好地逼近原函数,不仅考虑变化率,还包括曲线的弯曲程度等。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from math import factorial# 设置中文字体和解决负号显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 创建x轴数据(-3到3,500个点)
x = np.linspace(-3, 3, 500)# 定义原函数 e^x
exp_x = np.exp(x)# 计算不同阶数的泰勒展开
def taylor_expansion(x, n):"""计算e^x在x=0处的n阶泰勒展开"""result = np.zeros_like(x)for k in range(n+1):result += x**k / factorial(k)return result# 计算不同阶数的泰勒展开结果
taylor_0 = taylor_expansion(x, 0)  # 0阶:1
taylor_1 = taylor_expansion(x, 1)  # 1阶:1 + x
taylor_2 = taylor_expansion(x, 2)  # 2阶:1 + x + x²/2
taylor_3 = taylor_expansion(x, 3)  # 3阶:1 + x + x²/2 + x³/6
taylor_5 = taylor_expansion(x, 5)  # 5阶# 创建图形和坐标轴
fig, ax = plt.subplots(figsize=(10, 7))# 绘制原函数 e^x
ax.plot(x, exp_x, label=r'原函数: $e^x$', color='black', linewidth=3, zorder=10)# 绘制不同阶数的泰勒展开
ax.plot(x, taylor_0, label=r'0阶: $1$', color='blue', alpha=0.7, linestyle='-')
ax.plot(x, taylor_1, label=r'1阶: $1 + x$', color='green', alpha=0.7, linestyle='--')
ax.plot(x, taylor_2, label=r'2阶: $1 + x + \frac{x^2}{2}$', color='purple', alpha=0.7, linestyle='-.')
ax.plot(x, taylor_3, label=r'3阶: $1 + x + \frac{x^2}{2} + \frac{x^3}{6}$', color='orange', alpha=0.7, linestyle=':')
ax.plot(x, taylor_5, label=r'5阶泰勒展开', color='red', linewidth=2.5)# 添加标题和坐标轴标签
ax.set_title('泰勒展开:$e^x$ 在 $x=0$ 处的近似', fontsize=16, pad=20)
ax.set_xlabel('x', fontsize=12)
ax.set_ylabel('f(x)', fontsize=12)# 设置坐标轴范围
ax.set_xlim(-3, 3)
ax.set_ylim(-1, 8)# 添加网格线和图例
ax.grid(True, linestyle='--', alpha=0.4)
ax.legend(loc='upper left', fontsize=10, framealpha=0.9)# 在展开点x=0处添加垂直线和标注
ax.axvline(0, color='gray', linestyle='-', alpha=0.5)# 添加误差区域说明
ax.fill_between(x, exp_x, taylor_5, color='red', alpha=0.1,label='5阶近似误差')# 添加关键点标注
for x_val in [-2, -1, 0, 1, 2]:y_val = np.exp(x_val)ax.plot([x_val], [y_val], 'ko', markersize=4)ax.text(x_val+0.1, y_val+0.2, f'$e^{{{x_val}}}={y_val:.2f}$', fontsize=9)# 调整布局并显示
plt.tight_layout()
plt.show()

傅里叶级数原理

傅里叶级数的核心思想: 任何一个周期函数都可以表示为一系列不同频率的正弦波和余弦波的叠加。
数学表达:
f ( t ) = a 0 + ∑ n = 1 ∞ ( a n cos ⁡ ( n t ) + b n sin ⁡ ( n t ) ) f(t) = a_0 + \sum_{n=1}^{\infty} (a_n \cos(nt) + b_n \sin(nt)) f(t)=a0+n=1(ancos(nt)+bnsin(nt))

  • a 0 a_0 a0代表直流分量,或者说平均值;
  • 周期函数:傅里叶级数适用于周期函数,函数 f ( t ) f(t) f(t)是满足 f ( t + T ) = f ( t ) f(t + T) = f(t) f(t+T)=f(t)的周期函数,周期 T = 2 π T=2π T=2π
  • 正弦和余弦波形:傅里叶级数的基础是一系列不同频率、幅度和相位的正弦和余弦波形(称为谐波), n n n是谐波序号, n = 1 n=1 n=1时对应基波(基频), n > 1 n>1 n>1时对应高次谐波, a n a_n an b n b_n bn分别是决定对应第 n n n次谐波的余弦和正弦幅度的系数;
  • 合成:通过适当地选择每个谐波的幅度和相位,并将它们加在一起,可以逼近或完全重建原始的周期函数。
import numpy as np
import matplotlib.pyplot as plt# 设置中文字体和解决负号显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 创建时间轴数据(0到2π,1000个点)
t = np.linspace(0, 2 * np.pi, 1000)# 计算不同频率的正弦波
omega = 1  # 基频
sin_t = np.sin(omega * t)         # 基波
sin_2t = np.sin(2 * omega * t)    # 二次谐波
sin_3t = np.sin(3 * omega * t)    # 三次谐波# 计算叠加后的结果
sum_sines = sin_t + sin_2t + sin_3t# 创建图形和坐标轴
fig, ax = plt.subplots(figsize=(10, 7))# 绘制不同频率的正弦波(设置透明度)
ax.plot(t, sin_t, label=r'基波: $\sin(\omega t)$',color='blue', alpha=0.7, linestyle='-')
ax.plot(t, sin_2t, label=r'二次谐波: $\sin(2\omega t)$',color='green', alpha=0.7, linestyle='--')
ax.plot(t, sin_3t, label=r'三次谐波: $\sin(3\omega t)$',color='purple', alpha=0.7, linestyle=':')# 突出显示叠加波形(红色粗线)
ax.plot(t, sum_sines, label=r'合成波: $\sum_{n=1}^{3}\sin(n\omega t)$',color='red', linewidth=2.5)# 添加标题和坐标轴标签
ax.set_title('傅里叶级数:时域波形合成演示', fontsize=16, pad=20)
ax.set_xlabel('时间 [弧度]', fontsize=12)
ax.set_ylabel('振幅', fontsize=12)# 设置坐标轴范围
ax.set_xlim(0, 2*np.pi)
ax.set_ylim(-3.5, 3.5)# 添加网格线和图例
ax.grid(True, linestyle='--', alpha=0.4)
ax.legend(loc='upper right', fontsize=10, framealpha=0.9)# 添加相位标记点
for phase in [0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi]:ax.axvline(phase, color='gray', linestyle=':', alpha=0.3)ax.text(phase, -3.7, f'{phase:.1f}', ha='center', fontsize=8)# 调整布局并显示
plt.tight_layout()
plt.show()

球谐函数原理

球谐函数的核心思想: 利用一组定义在球面上的正交基函数来表示或逼近任意球面函数,通过不同阶次的组合捕捉从简单到复杂的球面分布特征。
数学表达:
f ( t ) ≈ ∑ l = 0 ∞ ∑ m = − l l c l m Y l m ( θ , ϕ ) f(t) \approx \sum_{l=0}^{\infty} \sum_{m=-l}^{l} c_l^m Y_l^m(\theta, \phi) f(t)l=0m=llclmYlm(θ,ϕ)

  • 球谐函数系数 c l m c_l^m clm:一组常数,用于表示基函数在球谐函数的权重;
  • 方向向量输入 ( θ , ϕ ) (\theta ,\phi ) (θ,ϕ):球坐标系中的两个角度变量,分别表示极角和方位角,确定了球面上任意一点的位置;
  • 基函数 Y l m ( θ , ϕ ) Y_l^m(\theta ,\phi ) Ylm(θ,ϕ):球谐函数的具体形式 Y l m ( θ , ϕ ) = K l m P l m ( cos ⁡ θ ) e i m ϕ Y_l^m(\theta, \phi) = K_l^m P_l^m(\cos \theta) e^{im\phi} Ylm(θ,ϕ)=KlmPlm(cosθ)eimϕ,由确保了函数模长为1的归一化系数 K l m K_l^m Klm、描述了极角方向变化的连带勒让德多项式 P l m ( cos ⁡ θ ) P_l^m(\cos \theta) Plm(cosθ),和描述了方位角方向变化的复指数项 e i m ϕ e^{im\phi} eimϕ组成。

基函数:
Y l m ( θ , ϕ ) = K l m P l m ( cos ⁡ θ ) e i m ϕ = { 2 K l m cos ⁡ ( m ϕ ) P l m ( cos ⁡ θ ) , m > 0 2 K l m sin ⁡ ( − m ϕ ) P l − m ( cos ⁡ θ ) , m < 0 K l 0 P l 0 ( cos ⁡ θ ) , m = 0 Y_l^m(\theta, \phi)= K_l^m P_l^m(\cos \theta) e^{im\phi} = \begin{cases} \sqrt{2} K_l^m \cos(m \phi) P_l^m(\cos \theta), & m > 0 \\ \sqrt{2} K_l^m \sin(-m \phi) P_l^{-m}(\cos \theta), & m < 0 \\ K_l^0 P_l^0(\cos \theta), & m = 0 \end{cases} Ylm(θ,ϕ)=KlmPlm(cosθ)eimϕ= 2 Klmcos(mϕ)Plm(cosθ),2 Klmsin(mϕ)Plm(cosθ),Kl0Pl0(cosθ),m>0m<0m=0
其中:
P n ( x ) = 1 2 n ⋅ n ! d n d x n [ ( x 2 − 1 ) n ] P l m ( x ) = ( − 1 ) m ( 1 − x 2 ) m / 2 d m d x m ( P l ( x ) ) K l m = ( 2 l + 1 ) ( l − ∣ m ∣ ) ! 4 π ( l + ∣ m ∣ ) ! \begin{aligned} P_n(x) &= \frac{1}{2^n \cdot n!} \frac{d^n}{dx^n} [(x^2 - 1)^n] \\ P_l^m(x) &= (-1)^m (1 - x^2)^{m/2} \frac{d^m}{dx^m} (P_l(x)) \\ K_l^m &= \sqrt{\frac{(2l + 1)(l - |m|)!}{4\pi (l + |m|)!}} \end{aligned} Pn(x)Plm(x)Klm=2nn!1dxndn[(x21)n]=(1)m(1x2)m/2dxmdm(Pl(x))=4π(l+m)!(2l+1)(lm)!

对于球谐函数,博主其实也是现学现卖,读者不需要纠结原理看不看得懂,只需要有个大概的认识就好了,知道球谐函数是什么,做什么就行,欢迎有数学功底夯实的读者能指点一二。


基函数的线性组合来表示更复杂的函数,随着阶数的增加,球谐函数能够表示更复杂的形状和细节:

import numpy as np
from scipy.special import sph_harm
import matplotlib.pyplot as plt
from matplotlib.colors import Normalize
from matplotlib.cm import ScalarMappable
import matplotlib.font_manager as fm# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'WenQuanYi Micro Hei']  # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题# 生成球面网格
theta = np.linspace(0, np.pi, 100)
phi = np.linspace(0, 2 * np.pi, 100)
theta, phi = np.meshgrid(theta, phi)# 将球坐标转换为笛卡尔坐标
x = np.sin(theta) * np.cos(phi)
y = np.sin(theta) * np.sin(phi)
z = np.cos(theta)# 球谐函数参数
l_values = [0, 1, 2, 3]  # 阶数 l
m_values = [0, -1, 1, -2]  # 模式 m# 创建图形和子图
fig = plt.figure(figsize=(16, 8), facecolor='#f5f5f5')
fig.suptitle('球谐函数基函数可视化', fontsize=20, y=0.95)  # 修改标题
axes = []
for i in range(len(l_values)):axes.append(fig.add_subplot(1, len(l_values), i + 1, projection='3d'))# 设置统一的视角
view_elev = 25  # 仰角
view_azim = -45  # 方位角# 使用更清晰的颜色映射
cmap = plt.cm.coolwarm  # 能更好区分正负值的颜色映射for idx, (l, m) in enumerate(zip(l_values, m_values)):ax = axes[idx]# 计算球谐函数Y_lm = sph_harm(abs(m), l, phi, theta)if m < 0:Y_lm = np.sqrt(2) * (-1) ** m * Y_lm.imagelif m > 0:Y_lm = np.sqrt(2) * (-1) ** m * Y_lm.realelse:  # m=0Y_lm = Y_lm.real# 计算半径和颜色值r = np.abs(Y_lm)  # 半径表示振幅r_normalized = r / np.max(r)  # 归一化振幅# 计算笛卡尔坐标X = r_normalized * xY = r_normalized * yZ = r_normalized * z# 创建颜色映射(基于实部值)facecolors = cmap((Y_lm.real - Y_lm.real.min()) / (Y_lm.real.max() - Y_lm.real.min()))# 绘制曲面surf = ax.plot_surface(X, Y, Z, facecolors=facecolors,rcount=50, ccount=50,linewidth=0.5, edgecolor='#333333',antialiased=True)# 设置标题(明确表示为基函数)ax.set_title(f'球谐基函数 $Y_{{{l}}}^{{{m}}}$', fontsize=18, pad=15, color='#333333')ax.view_init(elev=view_elev, azim=view_azim)# 添加坐标轴指示(中文标签)ax.quiver(0, 0, 0, 1.2, 0, 0, color='r', arrow_length_ratio=0.1, linewidth=1)ax.quiver(0, 0, 0, 0, 1.2, 0, color='g', arrow_length_ratio=0.1, linewidth=1)ax.quiver(0, 0, 0, 0, 0, 1.2, color='b', arrow_length_ratio=0.1, linewidth=1)ax.text(1.3, 0, 0, "X轴", color='r')ax.text(0, 1.3, 0, "Y轴", color='g')ax.text(0, 0, 1.3, "Z轴", color='b')# 设置轴范围max_range = 1.2ax.set_xlim(-max_range, max_range)ax.set_ylim(-max_range, max_range)ax.set_zlim(-max_range, max_range)# 隐藏原始坐标轴ax.set_axis_off()# 添加颜色条(中文标签)norm = Normalize(vmin=Y_lm.real.min(), vmax=Y_lm.real.max())sm = ScalarMappable(cmap=cmap, norm=norm)sm.set_array([])cbar = fig.colorbar(sm, ax=ax, shrink=0.6, pad=0.1)cbar.set_label('函数值', fontsize=10)# 添加全局中文说明(修正描述)
plt.figtext(0.5, 0.05,"半径表示基函数的振幅大小,颜色表示相位(红色为正,蓝色为负)",ha='center', fontsize=14, color='#555555')plt.tight_layout(rect=[0, 0.05, 1, 0.92])  # 为标题和脚注留出空间
plt.subplots_adjust(wspace=0.1)  # 调整子图间距
plt.show()

3D高斯中的球谐函数

根据3DGS原始论文《3D Gaussian Splatting for Real-Time Radiance Field Rendering》及其官方实现代码,默认使用3阶球谐函数,因此,球谐函数为:
f ( t ) ≈ ∑ l = 0 ∞ ∑ m = − l l c l m = Y l m ( θ , ϕ ) = c 0 0 y 0 0 + c 1 − 1 y 1 − 1 + c 1 0 y 1 0 + c 1 1 y 1 1 + c 2 − 2 y 2 − 2 + c 2 − 1 y 2 − 1 + c 2 0 y 2 0 + c 2 1 y 2 1 + c 2 2 y 2 2 + c 3 − 3 y 3 − 3 + c 3 − 2 y 3 − 2 + c 3 − 1 y 3 − 1 + c 3 0 y 3 0 + c 3 1 y 3 1 + c 3 2 y 3 2 + c 3 3 y 3 3 \begin{aligned} f(t) &\approx \sum_{l=0}^{\infty} \sum_{m=-l}^{l} c_l^m =Y_l^m(\theta, \phi) \\ &= c_0^0 y_0^0 + \\ &\quad c_1^{-1} y_1^{-1} + c_1^0 y_1^0 + c_1^1 y_1^1 + \\ &\quad c_2^{-2} y_2^{-2} + c_2^{-1} y_2^{-1} + c_2^0 y_2^0 + c_2^1 y_2^1 + c_2^2 y_2^2 + \\ &\quad c_3^{-3} y_3^{-3} + c_3^{-2} y_3^{-2} + c_3^{-1} y_3^{-1} + c_3^0 y_3^0 + c_3^1 y_3^1 + c_3^2 y_3^2 + c_3^{3} y_3^{3} \\ \end{aligned} f(t)l=0m=llclm=Ylm(θ,ϕ)=c00y00+c11y11+c10y10+c11y11+c22y22+c21y21+c20y20+c21y21+c22y22+c33y33+c32y32+c31y31+c30y30+c31y31+c32y32+c33y33
3DGS利用球谐函数的核心思想建立了颜色与观察角度之间的联系:将每个高斯椭球的颜色表示为一个定义在观察方向球面上的连续函数,而不仅仅是一个固定值。通过为每个高斯关联一组可学习的球谐函数系数 c l m c_l^m clm,并在渲染时根据当前具体的观察方向实时计算球谐函数基函数值并进行加权求和,高效且紧凑地实现了颜色对观察角度的依赖。

球谐基函数 Y l m ( θ , ϕ ) Y_l^m(\theta, \phi) Ylm(θ,ϕ)是预先定义且固定的数学函数,给定一个方向向量,纯数学计算对应的 Y l m ( θ , ϕ ) Y_l^m(\theta, \phi) Ylm(θ,ϕ)值;需要学习的是每个高斯点对应的球谐系数 c l m c_l^m clm,优化器不断地调整这些系数 c l m c_l^m clm的值,使得当用这些系数乘以对应方向上的基函数值 Y l m ( θ , ϕ ) Y_l^m(\theta, \phi) Ylm(θ,ϕ)并求和后,得到的预测颜色能够最好地匹配所有训练视角下观察到的该点,或其影响区域的实际颜色。

下表是3DGS中所需的16个基函数的值,在实际使用中,常常只使用球谐函数的实数部分(可以省略下表中带有 i i i的虚数部分),以便简化计算并提高效率。

l l l m m m基函数 y l m ( θ , ϕ ) y_l^m(\theta, \phi) ylm(θ,ϕ)在直角坐标中的表达式
00 Y 0 0 ( θ , ϕ ) = 1 4 π Y_0^0(\theta, \phi) = \sqrt{\frac{1}{4\pi}} Y00(θ,ϕ)=4π1
1-1 Y 1 − 1 ( θ , ϕ ) = − 3 2 π sin ⁡ θ sin ⁡ ϕ = 1 2 3 2 π ⋅ x − i y r Y_1^{-1}(\theta, \phi) = -\sqrt{\frac{3}{2\pi}} \sin\theta \sin\phi = \frac{1}{2}\sqrt{\frac{3}{2\pi}} \cdot \frac{x-iy}{r} Y11(θ,ϕ)=2π3 sinθsinϕ=212π3 rxiy
10 Y 1 0 ( θ , ϕ ) = 3 4 π cos ⁡ θ = 1 2 3 π ⋅ z r Y_1^0(\theta, \phi) = \sqrt{\frac{3}{4\pi}} \cos\theta = \frac{1}{2}\sqrt{\frac{3}{\pi}} \cdot \frac{z}{r} Y10(θ,ϕ)=4π3 cosθ=21π3 rz
11 Y 1 1 ( θ , ϕ ) = 3 2 π sin ⁡ θ cos ⁡ ϕ = − 1 2 3 2 π ⋅ x + i y r Y_1^1(\theta, \phi) = \sqrt{\frac{3}{2\pi}} \sin\theta \cos\phi = -\frac{1}{2}\sqrt{\frac{3}{2\pi}} \cdot \frac{x+iy}{r} Y11(θ,ϕ)=2π3 sinθcosϕ=212π3 rx+iy
2-2 Y 2 − 2 ( θ , ϕ ) = − 15 32 π sin ⁡ 2 θ sin ⁡ ( 2 ϕ ) = − 1 2 15 2 π ⋅ x y r 2 Y_2^{-2}(\theta, \phi) = -\sqrt{\frac{15}{32\pi}} \sin^2\theta \sin(2\phi) = -\frac{1}{2}\sqrt{\frac{15}{2\pi}} \cdot \frac{xy}{r^2} Y22(θ,ϕ)=32π15 sin2θsin(2ϕ)=212π15 r2xy
2-1 Y 2 − 1 ( θ , ϕ ) = − 15 8 π sin ⁡ θ cos ⁡ θ sin ⁡ ϕ = 1 2 15 2 π ⋅ ( x − i y ) z r 2 Y_2^{-1}(\theta, \phi) = -\sqrt{\frac{15}{8\pi}} \sin\theta \cos\theta \sin\phi = \frac{1}{2}\sqrt{\frac{15}{2\pi}} \cdot \frac{(x-iy)z}{r^2} Y21(θ,ϕ)=8π15 sinθcosθsinϕ=212π15 r2(xiy)z
20 Y 2 0 ( θ , ϕ ) = 5 16 π ( 3 cos ⁡ 2 θ − 1 ) = 1 4 5 π ⋅ 2 z 2 − x 2 − y 2 r 2 Y_2^0(\theta, \phi) = \sqrt{\frac{5}{16\pi}} (3\cos^2\theta - 1) = \frac{1}{4}\sqrt{\frac{5}{\pi}} \cdot \frac{2z^2-x^2-y^2}{r^2} Y20(θ,ϕ)=16π5 (3cos2θ1)=41π5 r22z2x2y2
21 Y 2 1 ( θ , ϕ ) = 15 8 π sin ⁡ θ cos ⁡ θ cos ⁡ ϕ = − 1 2 15 2 π ⋅ ( x + i y ) z r 2 Y_2^1(\theta, \phi) = \sqrt{\frac{15}{8\pi}} \sin\theta \cos\theta \cos\phi = -\frac{1}{2}\sqrt{\frac{15}{2\pi}} \cdot \frac{(x+iy)z}{r^2} Y21(θ,ϕ)=8π15 sinθcosθcosϕ=212π15 r2(x+iy)z
22 Y 2 2 ( θ , ϕ ) = 15 32 π sin ⁡ 2 θ cos ⁡ ( 2 ϕ ) = 1 4 15 π ⋅ x 2 − y 2 r 2 Y_2^2(\theta, \phi) = \sqrt{\frac{15}{32\pi}} \sin^2\theta \cos(2\phi) = \frac{1}{4}\sqrt{\frac{15}{\pi}} \cdot \frac{x^2-y^2}{r^2} Y22(θ,ϕ)=32π15 sin2θcos(2ϕ)=41π15 r2x2y2
3-3 Y 3 − 3 ( θ , ϕ ) = − 35 16 π sin ⁡ 3 θ sin ⁡ ( 3 ϕ ) = − 1 8 35 π ⋅ ( x − i y ) 3 r 3 Y_3^{-3}(\theta, \phi) = -\sqrt{\frac{35}{16\pi}} \sin^3\theta \sin(3\phi) = -\frac{1}{8}\sqrt{\frac{35}{\pi}} \cdot \frac{(x-iy)^3}{r^3} Y33(θ,ϕ)=16π35 sin3θsin(3ϕ)=81π35 r3(xiy)3
3-2 Y 3 − 2 ( θ , ϕ ) = − 105 16 π cos ⁡ θ sin ⁡ 2 θ sin ⁡ ( 2 ϕ ) = − 1 4 105 2 π ⋅ x y z r 3 Y_3^{-2}(\theta, \phi) = -\sqrt{\frac{105}{16\pi}} \cos\theta \sin^2\theta \sin(2\phi) = -\frac{1}{4}\sqrt{\frac{105}{2\pi}} \cdot \frac{xyz}{r^3} Y32(θ,ϕ)=16π105 cosθsin2θsin(2ϕ)=412π105 r3xyz
3-1 Y 3 − 1 ( θ , ϕ ) = − 21 32 π ( 15 cos ⁡ 2 θ − 3 ) sin ⁡ θ sin ⁡ ϕ = 1 4 21 2 π ⋅ ( x − i y ) ( 5 z 2 − r 2 ) r 3 Y_3^{-1}(\theta, \phi) = -\sqrt{\frac{21}{32\pi}} (15\cos^2\theta - 3)\sin\theta \sin\phi = \frac{1}{4}\sqrt{\frac{21}{2\pi}} \cdot \frac{(x-iy)(5z^2-r^2)}{r^3} Y31(θ,ϕ)=32π21 (15cos2θ3)sinθsinϕ=412π21 r3(xiy)(5z2r2)
30 Y 3 0 ( θ , ϕ ) = 7 16 π ( 5 cos ⁡ 3 θ − 3 cos ⁡ θ ) = 1 8 7 π ⋅ 5 z 3 − 3 z ( x 2 + y 2 ) r 3 Y_3^0(\theta, \phi) = \sqrt{\frac{7}{16\pi}} (5\cos^3\theta - 3\cos\theta) = \frac{1}{8}\sqrt{\frac{7}{\pi}} \cdot \frac{5z^3-3z(x^2+y^2)}{r^3} Y30(θ,ϕ)=16π7 (5cos3θ3cosθ)=81π7 r35z33z(x2+y2)
31 Y 3 1 ( θ , ϕ ) = 21 32 π ( 15 cos ⁡ 2 θ − 3 ) sin ⁡ θ cos ⁡ ϕ = − 1 4 21 2 π ⋅ ( x + i y ) ( 5 z 2 − r 2 ) r 3 Y_3^1(\theta, \phi) = \sqrt{\frac{21}{32\pi}} (15\cos^2\theta - 3)\sin\theta \cos\phi = -\frac{1}{4}\sqrt{\frac{21}{2\pi}} \cdot \frac{(x+iy)(5z^2-r^2)}{r^3} Y31(θ,ϕ)=32π21 (15cos2θ3)sinθcosϕ=412π21 r3(x+iy)(5z2r2)
32 Y 3 2 ( θ , ϕ ) = 105 16 π cos ⁡ θ sin ⁡ 2 θ cos ⁡ ( 2 ϕ ) = 1 4 105 2 π ⋅ ( x 2 − y 2 ) z r 3 Y_3^2(\theta, \phi) = \sqrt{\frac{105}{16\pi}} \cos\theta \sin^2\theta \cos(2\phi) = \frac{1}{4}\sqrt{\frac{105}{2\pi}} \cdot \frac{(x^2-y^2)z}{r^3} Y32(θ,ϕ)=16π105 cosθsin2θcos(2ϕ)=412π105 r3(x2y2)z
33 Y 3 3 ( θ , ϕ ) = 35 16 π sin ⁡ 3 θ cos ⁡ ( 3 ϕ ) = 1 8 35 π ⋅ ( x + i y ) 3 r 3 Y_3^3(\theta, \phi) = \sqrt{\frac{35}{16\pi}} \sin^3\theta \cos(3\phi) = \frac{1}{8}\sqrt{\frac{35}{\pi}} \cdot \frac{(x+iy)^3}{r^3} Y33(θ,ϕ)=16π35 sin3θcos(3ϕ)=81π35 r3(x+iy)3

根据方向向量 d = ( x , y , z ) d=(x,y,z) d=(x,y,z)与俯仰角 θ θ θ和偏航角 ϕ ϕ ϕ之间的转换关系,上述表格中 c o s ( θ ) , s i n ( θ ) , c o s ( ϕ ) , s i n ( ϕ ) cos(\theta),sin(\theta),cos(\phi),sin(\phi) cos(θ),sin(θ),cos(ϕ),sin(ϕ)可以用 r , x , y , z r,x,y,z r,x,y,z替代。

假设方向向量 d d d的模为 r r r,则有:
z = r cos ⁡ ( θ ) y = r sin ⁡ ( θ ) sin ⁡ ( ϕ ) x = r sin ⁡ ( θ ) cos ⁡ ( ϕ ) \begin{align*} z &= r \cos(\theta) \\ y &= r \sin(\theta) \sin(\phi) \\ x &= r \sin(\theta) \cos(\phi) \end{align*} zyx=rcos(θ)=rsin(θ)sin(ϕ)=rsin(θ)cos(ϕ)


总结

尽可能简单、详细的介绍了高斯椭球的颜色表达原理。

http://www.lryc.cn/news/579900.html

相关文章:

  • 替代MT6701,3D 霍尔磁性角度传感器芯片
  • Python 机器学习核心入门与实战进阶 Day 2 - KNN(K-近邻算法)分类实战与调参
  • PyTorch实战(14)——条件生成对抗网络(conditional GAN,cGAN)
  • vue-39(为复杂 Vue 组件编写单元测试)
  • MySQL分布式ID冲突详解:场景、原因与解决方案
  • FFmpeg、WebAssembly 和 WebGL 在 Web 端的结合应用
  • GO 语言学习 之 结构体
  • 【深度学习新浪潮】如何使用大模型等技术基于序列预测蛋白质的结构,功能和靶点?
  • 韩顺平之第九章综合练习-----------房屋出租管理系统
  • hive中2种常用的join方式
  • 基于 PyTorch 的猫狗图像分类实战
  • 【HarmonyOS Next之旅】DevEco Studio使用指南(四十) -> 灵活定制编译选项
  • 判断文件是否有硬链接
  • 类图+案例+代码详解:软件设计模式----单例模式
  • 【基础算法】贪心 (二) :推公式
  • PHP:从入门到进阶的全面指南
  • SRE - - PV、UV、VV、IP详解及区别
  • Ubuntu安装ClickHouse
  • 基于探索C++特殊容器类型:容器适配器+底层实现原理
  • 设计模式之代理模式--数据库查询代理和调用日志记录
  • 【C++复习2】内存篇
  • 计算机网络笔记(不全)
  • linux系统安全
  • Rovo Dev CLI Windows 安装与使用指南
  • Word和Excel批量转PDF新方法,操作简单
  • Selenium 安装使用教程
  • Java SE线程的创建
  • 怎么处理[TOO_MANY_REQUESTS/12/disk usage exceeded flood-stage watermark
  • 通道密度与安全性的突破:SiLM5768LCG-DG 六通道互锁隔离器如何重构高可靠系统?
  • Unity HDRP + Azure IoT 的 Python 后端实现与集成方案