力的认识

最后更新于 2023-06-29

在前一章节,我们认识了动画的原理,以及如何基于 p5.js 帧绘制来实现动画。那如何让动画呈现得更加自然呢?

在自然界里,物体的运动都是存在规律的:皮球落在地上会反弹,苹果从树上掉下来的时候速度会越来越快,小车在发动机停止后由于惯性还会运动一段距离才能停下来,这些都是自然界里大家习以为常的事情,而这背后的一切都是由于“力”这个无所不在的因素导致的。

这一章节,就让我们来认识大自然的魔法——力,学习如何基于力来实现更加自然的动画效果。

## 力的介绍

力是物体之间相互作用的结果,是一个具有大小和方向的物理量,它可以改变物体的速度、方向或形状。力可以分为多种类型,如重力、摩擦力、弹力、引力等。

在 p5.js 中,我们可以使用向量来表示力。向量是一种具有大小和方向的量,刚好可以满足力的模拟。通过定义力的大小和方向,我们可以创建一个力向量,并将其应用于物体上。p5.js 提供了丰富的向量函数和方法,使得对力的模拟变得简单而直观。

### 重力的模拟

下面我们来看一个重力模拟的例子:

重力的方向指向地心,向下,重力的大小公式是 $G = mg$,其中 $m$ 为物体的质量,$g$ 为重力常数,它的值约为 $9.8N/kg$。

基于 P5.js 的 createVector() 方法,我们可以方便地创建一个向量来表示重力。

const gravityForce = createVector(0, -9.8).mult(m)

### 摩擦力的模拟

摩擦力在生活中无处不在,如上面提到的小车的例子。

摩擦力的大小与物体所受的正压力成正比。可以使用一个常数(称为摩擦系数)来表示这种比例关系。根据摩擦力的公式:$f = μ * N$,我们可以计算出摩擦力的大小,其中 $μ$ 是摩擦系数,$N$ 是正向力,而摩擦力的方向与物体的运动方向相反。

来看看基于 p5.js 如何模拟摩擦力:

首先定义一个速度向量,横向速度为 5,纵向速度为 0, 即该物体沿着水平方向运动向右运动。

const velocity = createVector(5, 0)

假设定义摩擦系数为 0.1,那么摩擦力的大小为 $f = 0.1 * N$,而摩擦力的方向与速度的方向相反,则有:

const friction = velocity.normalize().mult(-1).mult(0.1 * N)

在上述代码中,将 velocity 进行归一化,乘以 -1,获得摩擦力的方向,再乘以摩擦力的大小,即得到摩擦力向量。

需要注意的是,在实际应用中,我们可能需要考虑正向力的具体情况,这里暂时将其忽略,以简化模拟。

下面来看一个具体的例子:创建一个小球在斜面上滑动的模拟,展示摩擦对物体运动的影响。

### 引力模拟

### 弹簧模拟

### 简化力模拟公式

为了方便理解和计算,我们可以对力的模拟公式进行简化。例如,当不考虑物体的质量时,我们可以将重力的公式简化为$G = g$,其中$g$是一个常量。在 p5.js的模拟世界中,我们可以作为这个世界的创世主,自由地调整$g$的数值,而不必拘泥于真实世界中的数值。这样一来,我们可以更加灵活地探索不同的场景和效果。

### 综合案例:下雨了

下雨了,雨滴从天上落下来,我们可以通过交互让雨下得更大些。