大概一年前,在油管上看到这个视频:
Fluid Flux 2.0 - Coastline [Unreal Engine 5]
https://www.youtube.com/watch?v=zLmiqJJI5ZQ
但当时事情多,就只收藏了一下,没细研究。后来还看到有人移植《戴子玲:Fluid Flux 2.0 的近岸海浪》。
虽然我们本来就是UE项目,移植更方便,但是想仔细看下原理。
通过删除次要内容,拆出来核心逻辑如下:
效果:(将区域范围缩小到了100,手动拖动WaveProfileTime)
下面来分析原理,主要是搞懂:
1. WorldCoastlineMap和WavePofileMap这两个图的含义。
2. 由WorldCoastlineMap生成海岸线的原理。
3. 由WavePofileMap生成单个动画的原理。
一、WorldCoastlineMap含义
WorldCoastlineMap:
再看G、B通道,在材质中,它们也是先被0.5减,然后连到Direction:
(因为G通道看起来像从左往右打光,所以我们用左亮右暗的球代表它,因为B通道看起来像从上往下打光,所以我们用上亮下暗的球代表它)
至此Distance和Direction的含义都清楚了,一个是(从陆地)“到海岸的距离”,一个是(从陆地)“指向海岸的方向”。
二、海岸线UV计算
由Distance和Direction计算海岸线UV,虽然连线摆在那儿,但默认的WorldCoastlineMap较复杂,难看清所以然。于是有必要自己弄一个简单的WorldCoastlineMap,就一个如图所示左高右低的简单斜面,Distance值左大右小,Direction=(-1,0,0):
为了方便做各种试验,在Houdini中复现了一下(为了代码简洁,参数随手写死的,与UE中的并不一致):
2. UE中WaveProfileMap的Wrap模式U是设置为Wrap,V设置为Clamp:
U这样改写以后,V就可以直接写成:
v=u-dis+offset;
其中offset就相当于UE里的WaveProfileDistance,用于控制浪到海岸的距离。
这样一来,公式比UE里连的更简洁了,下面就基于此来理解原理。
V可视化长这样:
2. 加noise有两个效应:
效应1:条纹产生扭曲。
效应2:条纹V方向上渐变产生交错。
最右一行是将WaveProfileMap换成了如下自定义贴图(为了观察UV):
三、海浪翻滚动画实现
从上面自定义贴图的视频中可以看到,如果不加noise的话,看起来就是贴图在沿着条纹平移。把自定义贴图换回WaveProfileMap,并加上Vector Disp,加noise与不加noise效果对比如下:
在浪垂直于条纹向前推进的过程中,还会有翻滚效果,拉近可以看得比较清楚:
这涉及到WaveProfileMap的含义。
打开UE工程的WaveProfileMap关卡,可以看到制作WaveProfileMap的方式,是用一排样条线做出了一个卷曲的海浪形状:
后一种理解更符合此方法的本意。
在Houdini用一个移动立面进行截取,可以直观看到2D海浪动画的样子:
四、不规则海岸
上面通过构造最简的直线形海岸,大致看清了原理。依此原理,容易生成其它形状海岸,比如(为了方便,仍然在Houdini里验证):
(1)圆形:
五、不足(个人观点)
是否可以考虑不用通过DIS和DIR简单的数学运算生成UV,而是用离线方法生成更好的UV,从而得到更好的效果,或许是一个改进方向。
近期精彩回顾