6分钟了解游戏中水波特效是什么原理?

我们在玩有些游戏的时候,比如《terraria》场景中钓鱼的时候,正常场景的体验让人感觉非常舒适,身临其境的钓鱼场景,水面荡起涟漪。这不就是游戏给我们的一种放松的体验嘛:

这个时候相信你会想到,这是如何实现的呢?

其实我们并不需要特别复杂的理论就可以做到。主要思路就是,我们可以把这个2D平台的水的大矩形微分成n个小的独立矩形,通过多个小的矩形的阻尼振动就可以实现这个效果。微分就是n越多,越丝滑,n趋近于无穷,那就没有任何锯齿了。

那么问题就来了?什么是阻尼振动。其实,咱们在初中物理就学过了:

阻尼(英语:damping)是指任何振动系统在振动中,由于外界作用(如流体阻力、摩擦力等)或系统本身固有的原因引起的振动幅度逐渐下降的特性,以及此一特性的量化表征。

非常拗口的定义,其实我们我们通过一个理想的弹框运动就可以理解这段话,如下图所示:

看,是不是在生活中非常的常见,生活才是我们获取知识的源泉。这里我们需要知道。图中的方块在运动过程中要受到两个力作用:一个是弹簧力,一个是阻尼力。弹簧力非常好理解,那么阻尼力是什么呢?咱们通俗点讲,就理解成阻力最简单了。那么我们可以观察到,这两个力施加给方块是有区别的:

弹簧力:我们设定弹簧与方块都静止时的位置为0,那么方块相对于静止时的位置x,决定弹簧施加力的方向。当x<0时,弹簧施加拉力;当x>0时,弹簧施加推力;当x=0时,没有力。到这里我们发现,弹簧力对方块施加的力的方向跟相对位置x是有关,这就有了弹簧力的公式:

Fs = -k * x; // Fs是弹簧力,k是弹性系数常量,x是相对位移

阻尼力:就更加容易了,因为是阻力,所以任何时候都是跟方块前进方向相反。我们设定方块的速度为v,那么有了阻尼力的攻势:

Fd = -c * v; // Fd是阻尼力,c是阻尼系数常量,v是当前速度

到这里,我们还是不知道怎么跟运动结合起来吧,还缺了个理论,就是力与运动的关系,这个时候我们不假思索就可以蹦出牛顿第二定律,确实如此,这就是力与运动的解。这太普遍被接受了,咱们直接上公式就好:

F = m * a; // m是物体质量,a为物体加速度

有人又疑惑了,前面阻尼力公式不是已经说明了力与速度的关系了吗?其实,它只是表明了瞬时的速度与受力的关系,并没有说明物体要如何运动的关系。

好了,有了以上的基础,咱们就可推导出物体的加速度了,就可以知道下一步物体下一步该怎样运动。由于我们研究的运动,质量不是一个关键因素,我们就可以取质量m为1,那么我们合并一下公式:

// 根据牛顿第二定律,m = 1
a = F;
// 而F是由Fs和Fd构成
a = Fs + Fd;
// 最终加速度
a = - c*v - k*x
// 根据速度与加速关系
v = a * t


// 最终v的计算为
v = (-c*v - k*x) * t

终于我们把运动推导出来了,可以根据时间t来进行当前速度v的求解。在游戏中,时间跟画布刷新的帧率相关,一般我们现在游戏都是用60帧/秒(也会有更高的帧率,不过这里以60帧/秒为例子),我们假设每一帧都更新速度,即1/60≈0.0167秒更新一次速度。所以在设定公式中几个常量系数的时候,要按照0.0167秒来设定。

如果我们给一个初始速度给振子,那么会是这样的效果:

到此为止,我们只解决了其中单个方块的振动,而波是需要传播的,另外传播也要衰减,否则永远振动跟现实就脱离了。我们期望的效果是所有振子都协同运动,那才会是一个水波的体验。

波的传播:其实波传递更简单,我们只需要设定好传播系数s即可,即Vnew = ΔV * s。当前波的振速Vn,它前个波振速为Vn-1,后面一个为Vn+1,那么前后的振速修正量值为:

Dn-1 = (Vn - Vn-1) * s; // 向前传播修正量
Dn+1 = (Vn - Vn+1) * s; // 向后传播修正量


Vn-1 += Dn-1;
Vn+1 += Dn+1;

那么经过n个修正后,它们的运动该是这种状况:

到此为止,我们已经把水波的全部特效已经实现。如上所说,我们切分的水方块的n越大,则运动越细腻,越没有锯齿。当然,这里就会让你付出更多的计算量。

所以在真正编程的时候,还是需要考虑效率问题。要平衡特效与计算量的关系,否则卡顿了体验就不好了。

最后我们以钓鱼的结束本篇:

看完了,别忘下方的关注、点赞、分享、在看:),关注西蒙讲编程,与微信公众号同名且唯一名称,一起共同进步!

展开阅读全文

页面更新:2024-05-02

标签:阻尼   常量   矩形   水波   方块   系数   弹簧   物体   公式   特效   原理   速度   关系

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top