我们在上一篇文做完了整体案例场景的搭建,而我们接下来则是要把後续的物理运算做完~
简单用图片讲解一下这个案例的物理模型 :
画面中每一颗球都是以具有弹力
的Cord(弦)
来串连,而球本身会具有重量,
这意味着整条弹力链
在静止的时候,重力
和弹力
其实会维持打平的状态。
而若今天我们用某种手段去改变球
与球
之间的距离
,这样就会破坏弹力
和重力
之间的平衡。
当弦(Cord)
被拉长
的时候,两颗球之间的弹力
就会变强,进而导致上面
的球被往下
拉,下面
的球
被往上
拉,而上面
的球
又连锁影响更上面的球
。
实录影片:
这部分的话可以利用泡沫排序法(Bubble Sorting);
逻辑流程上大概是像这样的:
Canvas
, 抓取clientX/clientYgrabBall(x, y) {
if (!!this.ballGrabbed) return;
// 用泡沫排序法去求得目前距离滑鼠位置最近的球
this.ballGrabbed = this.balls[0];
let shortestDist = this.getDist(x, y, this.ballGrabbed);
for (const ball of this.balls) {
const dist = this.getDist(x, y, ball);
if (dist <= shortestDist) {
shortestDist = dist;
this.ballGrabbed = ball;
}
}
if (this.ballGrabbed.fixed || shortestDist > MAX_GRAB_DIST) return;
this.pullBall(x, y, shortestDist)
}
其余逻辑的部分其实跟一维弹力模拟差异不大
完整程序的部分可以看这边的Repo~
https://github.com/mizok/ithelp2021/tree/master/src/js/elastic-2d/index.js
Repo 的 github page :
https://mizok.github.io/ithelp2021/elastic-2d.html
如果对过程中的运算有问题,都可以在下面的留言区提出~ 我会尽可能地去回答
在接下来的文章,我们将会提到磁力/ 引力 的实作,磁力/ 引力其实和弹力有异曲同工之妙, 敬请各位期待 :D ~
<<: 连续 30 天 玩玩看 ProtoPie - Day 18
>>: #18 No-code 之旅 — 读取资料库来实作部落格 ft. Notion SDK
-风险处理(风险应对) 无论我们实施哪种加密方案,都可以降低风险。ISO 27005 使用术语“风...
实例变数 实例变数(instance variable)拥有储存资料成员的记忆体空间,不与其他物件共...
1.疑问? 一定要用Bootstrap吗? => 自己决定 我朋友说Bootstrap业界没人...
什麽是 Code splitting?为什麽要做 Code splitting? 如果你的网站是用 ...
今天来实作二元树~ 首先来定义一下资料结构 type Node struct { Left *Nod...