Catlike Coding的Flow篇章的学习记录,整篇不会贴代码,原链接代码写的很详细,还有源码。他所有教程最大的特点就是每一步都写出思路,可能是错的,但是会进一步讲怎么修正和改善,你能清晰地了解到他的思考过程,这比直接放出结果的教程更有意义。首先这篇讲的是Valve 最早运用在Left 4 Dead 2上运用的水体技术,分享在SIGGRAPH 2010。这篇的目的不是仅仅为了描述水,而是在流动的液体,泥浆和熔岩都可以视为Flow,但是教程不涉及复杂的物理交互模拟。
首先采用均匀排布的颜色色块纹理来观察UV变化。
先说整体思路:
1,实现一个UVFlow的函数先让UV流动起来,即给其添加一个随机方向的 vector X_Time,随机可以通过采样让UV产生采样的位置变化。
2,如果一直朝一个方向变化,则最后的采样失真会很严重,所以加上时间重置试一试。
3,时间重置会产生间隔和重复感,再增加一个时间相关的0-1权重,使两个重复片段间衔接过渡自然,但是权重导致黑色脉冲,在视觉上反而更严重了。
4,增加采样低频柏林噪声图,并添加到时间变量上,等于给时间增加了不同的相位差,导致UV沿着柏林噪声的坡度方向消退。
5,黑色的波纹般的消退并不令人满足,我们可以进一步思考,如果不使其消散成黑色,而是和另一种东西融合,先和原始未扭曲的纹理进行混合试一下。
融合效果并不好,固定纹理会淡入淡出,再加上两种模式并不相同,动静结合很容易看出破绽,于是想到与另一个时间轴上的自己结合,时间偏差设置为一半的时间间隔,也就是0.5S。
6,虽然还有不规则波纹,效果已经好了很多,但是因为两种重复模式实际是相同的,所以持续周期时间只有原来的一半。我们也增加bias(0.5)在UV上,巧合的是因为我们使用的基础纹理在偏差后白色线框保持不变,色块发生偏移,这导致在新的Flow效果中,和之前的区别在于,白的波纹仍然是0.5S的周期,而颜色的变化周期是1S。
7,既然设置偏差很有效,我们不妨设置一个变化更复杂的偏差给UV,这样能使得变化周期更长。先试试简单按照时间来给予一个UV偏差,这会导致整个动画滑动(懒得搞动图,效果利用下图脑补下,大体上虽然还在变换,但是各种色块不断往右移动)。
8,添加jump来实现变换,给一个UJump和VJump分别强度控制UV跳跃距离,为了实现跳跃,需要在每个时间节点处跳跃,原文的函数其实和floor函数相似,在每个时间节点进行floor跳跃。