微分立体角与辐射度量学

微分立体角(Differential Solid Angle) 是立体角的一个微小变化量,用于描述空间中某一方向上的微小立体角范围。

微分立体角在辐射度量学(Radiometry)中是必不可少的,因为它参与了辐射度量单位的定制。

所以,我们要想研究辐射度量学,微分立体角是必须要完全掌握的。

1-立体角

我们应该学过二维世界里的角。

角是由两条具有公共端点的射线组成的图形。

通常,我们可以说∠A 等于90°,或者∠A 的弧度等于π/2。

它之所以是二维世界里的角,是因为构成这种角的两条射线必然共面。

那有没有三维空间里的角呢?

答案是:有的,这种角就是立体角(Solid Angle)。

三维空间里的立体角不再是由两条射线围成夹角,它是由一种扇形面围成的夹角,你可以将这种扇形面理解为由无数条射线围成的面。

立体角既然是由扇形面围成的夹角,那它必然是有大小之分的,因此我们能否像说∠A 的弧度等于π/2一样形容立体角的大小呢?

答案是:能。

我们可以通过扇形面围成的夹角在半径为1的单位球面上截取的面积来形容立体角的大小。

这时候,我们就需要制定一种单位,来表示这种度量立体角的方式。

这种单位就叫球面度。

2-球面度

球面度(Steradian,简称sr)是立体角的计量单位。

球面度可以理解为三维世界里的弧度,当然它不叫弧度,它就叫球面度。

一个单位圆的弧度就是这个单位圆的周长,即2π。

一个单位球的球面度就是这个单位球的面积,即4π。

因此,当我们用扇形面围成的立体角在半径为r 的球体上截取一块面积为A 的球面时,那此立体角的球面度就是:

3-单位立体角

单位立体角(Unit Solid Angle) 就是单位球上面积为1的球面所对应的立体角,即1球面度的立体角。

在辐射度量学中,会把单位立体角作为度量光线power的一种方式,这种方式就叫做radiant intensity。

power 是光源在单位时间中散发的能量,它决定了光源的亮度。

举个例子,已知光源在单位立体角ω 中散发出的power 是1,那我们就说光源的Radiant intensity 是1。

Radiant intensity 是power 在单位立体角中的能量。

再举个例子,已知点光源的power是Φ,它可以均匀的向四面八方发光,那这个光源射出的光线在每个方向上的radiant intensity 是多少呢?

答案是:光源的power除以整个球体的球面度。

公式如下:

然而,一个光源并不一定会均匀的向四面八方发光,因此它在各个方向上的radiant intensity 就不一定相等。这时候我们就需要以微分的方式表示光源在各个方向上的radiant intensity。

公式如下:

  • I(ω):光源在某一方向上的radiant intensity
  • ω:某一方向上的单位立体角
  • dΦ:微分power
  • dω:微分立体角

接下来咱们详细解释一下微分立体角概念。

4-微分立体角

微分立体角(Differential Solid Angle)是立体角的一个微小变化量,你可以将其理解为单位球面中,趋向于0的面积对应的立体角。

微分立体角的定义通常与球坐标系中的角度变化相关联。

在球坐标系中,一个点可以用半径r、极角θ和方位角ϕ来表示。

我们可以将θ和ϕ方向的极小变换量分别写做dθ和dϕ。

dθ 在球面上纵向截出的弧长是:

解释一下其原理。

θ和ϕ都是弧度,这种弧度可以理解为单位圆里的弧长。

当单位圆不是单位圆,而是任意半径为r的圆时,那之前单位圆里的弧度所对应的弧长就需要再乘以r。

同理,ϕ 在球面上横向截出的弧长是:

因此,dθ和dϕ在球面上截出的面积dA 就是:

因为dθ和dϕ都是趋向于0的极小值,所以dA 就是趋向于0的极小面积。

把dA投影到单位球上后的投影面积所对应的立体角就是微分立体角。

微分立体角通常用dω 表示,其公式如下:

到了这里,你可能会想,我为什么要知道微分立体角?为什么要知道radiant intensity?

接下来咱们举个简单的例子说一下其用法。

5-Lambert 材质的BRDF

Lambert材质是一种简化的光照模型,它只受漫反射影响,当光线打到Lambert物体表面的时候,会被均匀的散射,不会形成高光,没有镜面效果。

Lambert材质的漫反射可以理解为物体表面反射的power和吸收的power的比值。

接下来咱们把这个物体表面具化为一个单位面积。

这个单位面积吸收的power 就叫irradiance。

当然,你也可以说power在单位面积中的能量就叫irradiance。

漫反射的公式如下。

  • Eo:单位面积反射出的power
  • Ei:单位面积吸收的power

因为Lambert 材质会均匀散射入射光,所以我们假设单位面积向任意方向反射的radiant intensity 都是Lr。

接下来,我们可以根据Lr 和微分立体角的关系积分出Eo。

  • Lr:单位面积向任意方向反射的radiant intensity
  • H²:半球范围
  • cosθ:反射光线与单位面积所在平面的法线的夹角的cos值,θ∈[0,π/2]
  • dω:微分立体角
  • cosθdω:不同方向的radiant intensity 所消耗的单位面积里的power

在此我们要清楚一个问题,单位面积反射出去的radiant intensity 的和并不等于单位面积所能反射出去的总power。

这是因为单位面积所在的表面并不是一个半球,它无法毫无保留的反射出Lr2π 的power。

单位面积反射出去的radiant intensity 为单位面积贡献了多少的反射能量,会受反射光线和单位面积所在平面的法线的夹角影响。

在下图所示,反射光线的长度体现了反射光线为单位面积提供的反射能量与cosθ 的关系。

这就为什么我们要在Eo的微积分公式中用cosθ乘以微分立体角dω。

接下来咱们详细说一下Eo 的计算过程。

把微分立体角dω 展开:

  • θ∈[0,π/2]
  • Φ∈[0,2π]

整理微积分公式:

根据三角函数的倍角公式,可以对上式中的cosθsinθ 进行简化:

所以:

接下来,我们进行换元,令 u =2θ,则 du*=2*dθ,即 dθ=(1/2)du。

同时,当 θ =0 时,u =0;当 θ =2π 时,u =π

将上述换元代入原积分,得到:

最终的Eo 公式如下:

我们可以利用微积分第二基本定理计算Eo。

微积分第二基本定理:假设函数小f 是定义于[a,b] 闭区间的连续函数,则其在[a,b]区间的定积分可由某个函数大F 在上界b 点的数值,减去其在下界a 点的数值,大F 是小f 的反导函数,也就是大F的倒数等于小f。

接下来,我们根据上面的定理,先计算Eo里的反导函数。

dΦ 实际上是1dΦ ,所以我们要求1的反导函数,即Φ+c,其中的常数c可以在积分的过程中消掉,所以可以忽略不计。

sinu的反导函数是-cosu+c,常数c同样可以忽略不计。

将反导函数代入Eo可得:

将Eo的值代入之前的diffuse 公式可得:

由此我们可以得到Lr和diffuse 的关系:

接下来,我们再思考一个问题。

我能否创建一个函数,使其能够算出光线照到物体表面后,有多少能量向什么方向反射?

答案是肯定的,这种函数就叫BRDF。

BRDF 全称Bidirectional Reflectance Distribution Function,译作双向反射分布函数。

BRDF 是用来区分不同材质的关键。

BRDF要解决的问题是光线打到物体表面后,会有多少power 被反射到哪些方向上去。

在当前的Lambert 材质中,Ei 就是所有光线打到一个单位面积后产生的power,即irradiance。

Lr就是被反射出去的一条光线在单位立体角中的power,即radiant intensity。

至于反射的方向,就是均匀的半球方向。

因此,Lambert BRDF 计算公式如下:

我们在three.js 的着色器源码中,可以看到Lambert 材质的BRDF 代码。

javascript 复制代码
vec3 BRDF_Lambert( const in vec3 diffuseColor ) {
    return RECIPROCAL_PI * diffuseColor;
} // validated

上面的RECIPROCAL_PI 是1/π,因此BRDF_Lambert 返回的结果就是diffuseColor/π。

这段代码挺有意思的,Lambert的BRDF虽然经过了缜密的计算,但结果非常简单,以至于作者在后面还特意注释了个validated,生怕我们不相信。

因为Lambert 是一种理想化的均匀散射光线的模型,所以其BRDF 不需要考虑其光线的入射方向和反射方向的关系。

对于无法均匀散射光线的模型,我们通常会引入入射方向和反射方向的概念,并以微分的方式表示BRDF。

  • fr(ωi→ωr):BRDF,i方向的radiant intensity 照射到单位面积上后,向r方向反射出多少power
  • ωi:入射方向i 的立体角
  • ωr:反射方向r的立体角
  • dLr(ωr):单位面积对来自i方向的入射光power的反射,即Exiting Radiance。
  • dEi(ωi):单位面积的接收到的来自i方向的入射光的能量,即Incident Radiance。

在上面的公式里我们看到dLr(ωr)和dEi(ωi) 都属于Radiance。

Radiance 是power在单位立体角、单位面积中的能量。

Radiance 根据入射和出射方向分成Incident Radiance 和Exiting Radiance 两种。

Incident Radiance 是irradiance 在单位立体角中的power。

公式如下:

  • p:光源位置
  • ω:立体角
  • dE(p):微分irradiance
  • dω:微分立体角
  • dωcosθ:与单位面积垂直的微分立体角

Exiting Radiance 是来自于单位面积的radiant intensity。

格式如下:

  • dI(p,ω):微分radiant intensity
  • dA:微分面积
  • dAcosθ:与反射光垂直的微分面积

其它的BRDF 我得在后面的文章里说了,这一篇就算是通过微分立体角说一下辐射度量学里的基础概念了。

总结

立体角在辐射度量学中可以起到度量衡的作用。

微分立体角可以用于描述从光源发出的power 在空间中的分布情况。

Radiometry(辐射度量学)在物理上定义了光照的若干属性,并且描述了光的传播与衰减方式。

Radiometry定义的光照属性有以下几种:

  • Radiant energy:光源的所有能量,以焦耳为单位。
  • Radiant flux(power):Radiant energy 在单位时间中的能量。
  • Radiant intensity:power在单位立体角中的能量。
  • Irradiance:power在单位面积中的能量。
  • Radiance:power在立体角、单位面积中的能量。

参考链接:

www.bilibili.com/video/BV1X7...

www.cnblogs.com/wantnon/p/6...

相关推荐
学不会•1 小时前
css数据不固定情况下,循环加不同背景颜色
前端·javascript·html
活宝小娜4 小时前
vue不刷新浏览器更新页面的方法
前端·javascript·vue.js
程序视点4 小时前
【Vue3新工具】Pinia.js:提升开发效率,更轻量、更高效的状态管理方案!
前端·javascript·vue.js·typescript·vue·ecmascript
coldriversnow4 小时前
在Vue中,vue document.onkeydown 无效
前端·javascript·vue.js
我开心就好o4 小时前
uniapp点左上角返回键, 重复来回跳转的问题 解决方案
前端·javascript·uni-app
开心工作室_kaic5 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
刚刚好ā5 小时前
js作用域超全介绍--全局作用域、局部作用、块级作用域
前端·javascript·vue.js·vue
沉默璇年6 小时前
react中useMemo的使用场景
前端·react.js·前端框架
yqcoder6 小时前
reactflow 中 useNodesState 模块作用
开发语言·前端·javascript
2401_882727576 小时前
BY组态-低代码web可视化组件
前端·后端·物联网·低代码·数学建模·前端框架