Ripple [水波] 程序实现水波效果 水纹特效 算法 |
您所在的位置:网站首页 › 3dmax怎么做一圈一圈的水波 › Ripple [水波] 程序实现水波效果 水纹特效 算法 |
看到左边这幅动画 (如果没有出现,请耐心的稍等片刻) ,你也许不会相信它其实是 用电脑做出来的,这就是 “ 水波 ” 特效的魅力所在。
在介绍编程之前,先让我们来回顾一下在高中的物理课上我们所学的关于水波的知识。
水波有如下几个特性:
扩散 :当你投一块石头到水中,你会看到一个以石头入水点为圆心所形成的一圈圈的水 波,这里,你可能会被这个现象所误导,以为水波上的每一点都是以石头入水点为中心 向外扩散的,这是错误的。实际上, 水波上的任何一点在任何时候都是以自己为圆心向 四周扩散 的,之所以会形成一个环状的水波,是因为水波的内部因为扩散的对称而相互 抵消了。
衰减 :因为水是有阻尼的,否则,当你在水池中投入石头,水波就会永不停止的震荡下 去。
水的折射 :因为水波上不同地点的倾斜角度不同,所以,因为水的折射,我们从观察点 垂直往下看到的水底并不是在观察点的正下方,而有一定的偏移。 如果不考虑水面上部 的光线反射,这就是我们能感觉到水波形状的原因 。
反射 :水波遇到障碍物会反射。
衍射 :忽然又想到这一点,但是在程序里却看不到,如果能在水池中央放上一块礁石, 或放一个中间有缝的隔板,那么就能看到水波的衍射现象了。
好了,有了这几个特性,再运用数学和几何知识,我们就可以模拟出真实的水波了。但是,如果 你曾用 3DMax 做过水波的动画,你就会知道要渲染出一幅真实形状的水波画面少说也得好几十 秒, 而我们现在需要的是实时的渲染, 每秒种至少也得渲染 20 帧才能使得水波得以平滑的显示。 考虑到电脑运算的速度, 我们不可能按照正弦函数或精确的公式来构造水波, 不能用乘除法, 更 不能用 sin 、 cos ,只能用一种取近似值的快速算法,尽管这种算法存在一定误差,但是为了满足 实时动画的要求,我们不得不这样做。
首先我们要建立两个与水池图象一样大小的数组 buf1[PoolWidth*PoolHeight] 和 buf2[PoolWidth*PoolHeight] ( PoolWidth= 水池图象的象素宽度、 PoolHeight= 水池图象的 象素高度) , 用来保存水面上每一个点的前一时刻和后一时刻波幅数据, 因为波幅也就代表了波 的能量, 所以以后我们称这两个数组为波能缓冲区。 水面在初始状态时是一个平面, 各点的波幅 都为 0 ,所以,这两个数组的初始值都等于 0 。
下面来推导计算波幅的公式 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |