书名:代码本色:用编程模拟自然系统
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
目录
2.8 空气和流体阻力
代表阻力
我们的最终目的就是计算这个阻力向量,将它传入applyForce()函数
-1/2是一个常量:
-0.5.对我们来说,这个数值并没有多少意义,因为这只是一个随意编造的常量.但有一点很重要,该常量必须是一个负数,这代表阻力的方向和速度的方向相反(和摩擦力类似)
ρ是希腊字母rho,它代表流体的密度,
在这里我们并不需要关心它.为了简化问题,我们假设流体的密度是1.
v代表物体的移动速率.
前面我们已经接触过它了,速率等于速度向量的大小:
velocity.magnitude(),
指v的平方或者v*v
A代表物体前端推动流体(或气体)流动部分的面积.
举个例子,根据空气动力学设计的兰博基尼跑车所受的空气阻力肯定比四四方方的沃尔沃汽车小.
为了方便模拟,我们假定物体都是球形的,因此,这个变量也将被我们忽略
是阻力系数,
它和摩擦系数ρ类似,是一个常量.我们可以根据阻力的强弱确定它的大小
看起来是否很熟悉?
它代表速度的单位向量,也就是velocity.normalize().
和摩擦力一样,阻力的方向也和物体的运动方向相反
我们决定只保留其中一些有用的元素,最后得到简化版的阻力公式:
float c = 0.1; // 阻力系数
float speed = v.mag(); // 速度
float dragMagnitude = c * speed * speed; // 公式的第一部分(大小)
PVector drag = velocity.get();
drag.mult(-1); // 公式的第二部分(方向)
drag.normalize();
drag.mult(dragMagnitude); // 合并大小和方向
class Liquid {
float x,y,w,h; 流体对象包含一个阻力系数变量
float c;
Liquid(float x_, float y_, float w_, float h_, float c_) {
x = x_;
y = y_;
w = w_;
h = h_;
c = c_;
}
void display() {
noStroke();
fill(175);
rect(x,y,w,h);
}
}
Liquid liquid; 初始化流体对象,它的阻力系数很低,等于0.1,否则对象穿过流体时会很快停止运动
void setup() {
liquid = new Liquid(0, height/2, width, height/2, 0.1);
}