真实的海浪是由风吹拂产生的,所以波浪的主要传播方向应该与风向 一致。但风是混沌的,波浪不会 100% 笔直地顺着风走,而是会以风向为主轴,向两侧呈扇形发散。
实现起来也比较简单,只需要计算波矢量与风向的夹角,夹角越大,能量迅速衰减,夹角超出 $[-90^\circ,90^\circ]$ 的频谱能量直接赋零。
$$ S(k)=S_0(k)D(\theta) $$$D(\theta)$ 会使用一些非线性函数来表示迅速衰减的过程,如,
$$ D(\theta) = \begin{cases} \cos^2(\theta) & -90^\circ \le \theta \le 90^\circ \\ 0 & \text{Other} \end{cases} $$$$ D(\theta)=D'(\hat{k},\hat{w})=max(0, \hat{k} \cdot \hat{w}) $$
示例代码:
float WindAngle; // 风向 (弧度)
...
{
...
float DirectionalSpreading(float2 k)
{
float cosAngle = cos(atan2(k.y, k.x) - WindAngle);
if (cosAngle > 0.0)
return cosAngle * cosAngle;
return 0.0;
}
jonswapResult *= DirectionalSpreading(k); // * 2.0 / PI
}2.0 / PI:这是一个归一化系数,保证引入方向扩散后,整个半球的能量积分总和依然等于 $1$,确保总能量不增不减。