最近在研究绳子,找到了一个效果还不错的绳子效果,先看效果~
绳子的碰撞未实现,这种绳子主要就是实现一些项目中的简单绳子的表现的~
可以看到绳子的模拟效果已经是有了。这种方式实现的绳子优缺点也很明显
1.优点是绳子的性能比较高
2.缺点是,模拟的比较简单并不能模拟真实的环境。
代码在这里~VertRope.zip (858.2 KB)
核心逻辑也比较简单
这张图就是实现绳子的关键了。我们将整个绳子离散为一系列的点,这些点这里我们叫做粒子(particles),每个粒子都通过vert积分算法模拟重力。且前后相邻的每两个粒子组成一个约束系统,这里我们就叫stick
每一个stick都由前后两个粒子组成,在实际的实现中,我们不需要考虑每个粒子对绳子的整体系统有何影响,只需要考虑每个stick中的两个粒子的相互关系即可
粒子和stick的类如上图所示
我们先来看下 vert积分公式
Verlet算法是经典力学(牛顿力学)中的一种最为普遍的积分方法
具体细节我们也不用管只需要知道。我们要计算 t(n+1)时刻的位置。主要知道tn时刻和t(n-1)时刻的位置
以及tn时刻的加速度a就能实现了
公式中并不需要用到速度。所以实现起来也比较简单了
重力模拟出来之后如果不对绳子进行约束,绳子肯定会无限下落。所以约束代码如下
这里的约束类似于胡克定律
在初始化stick时。当确定了两端的点时也就确定了原生长度,(也就是弹簧未经拉伸或者压缩的原生长度),在外力影响后,stick超过原始长度时要收缩,小于原始长度时要拉伸,也就是往stick两端的向量方向上移动。
当粒子间的移动模拟好之后。我们就只需要通过graphics绘制出来即可
结束语:
这个绳子的实现也只是vert积分的简单应用,还需要多多学习~希望这个绳子能帮到大家哈,技术需要分享才能不断变强!
参考文档
https://zhuanlan.zhihu.com/p/583197760