Day18 - 物理模拟篇 - 弹力、引力与磁力III - 成为Canvas Ninja ~ 理解2D渲染的精髓

二维弹性模拟(第二部分)

我们在上一篇文做完了整体案例场景的搭建,而我们接下来则是要把後续的物理运算做完~

简单用图片讲解一下这个案例的物理模型 :

img

画面中每一颗球都是以具有弹力Cord(弦) 来串连,而球本身会具有重量,
这意味着整条弹力链在静止的时候,重力弹力 其实会维持打平的状态。

而若今天我们用某种手段去改变之间的距离,这样就会破坏弹力重力之间的平衡。

弦(Cord)拉长的时候,两颗球之间的弹力就会变强,进而导致上面的球被往拉,下面被往拉,而上面又连锁影响更上面的

实录影片:

怎麽实作抓取球的部分?

这部分的话可以利用泡沫排序法(Bubble Sorting);

逻辑流程上大概是像这样的:

  • 监听滑鼠点击到Canvas, 抓取clientX/clientY
  • 用for loop 一一比对滑鼠点击点和每一颗球的距离
  • 距离最小者(并且同时要小於最大容许抓取距离)就是被抓取到的那颗球
grabBall(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

风险处置(风险回应)[Risk Treatment (Risk Response)]

-风险处理(风险应对) 无论我们实施哪种加密方案,都可以降低风险。ISO 27005 使用术语“风...

DAY12-JAVA的类别(6)-变数和函数

实例变数 实例变数(instance variable)拥有储存资料成员的记忆体空间,不与其他物件共...

Day 10 (Bootstrap)

1.疑问? 一定要用Bootstrap吗? => 自己决定 我朋友说Bootstrap业界没人...

[铁人赛 Day05] React 中的 Code splitting(代码分离)方法

什麽是 Code splitting?为什麽要做 Code splitting? 如果你的网站是用 ...

Day.24 Binary Search Tree II

今天来实作二元树~ 首先来定义一下资料结构 type Node struct { Left *Nod...