【发布时间】:2020-10-07 09:14:58
【问题描述】:
我遇到的问题是,我试图在这个基本物理模拟(Java [Processing])中向对象添加阻力,但是一旦我添加了适当的公式,它会导致对象速度相反地急剧增加方向。当然问题是由于某种原因计算的阻力太高了,但我不确定为什么会发生这种情况,因为我使用的是现实世界的方程式。
void setup(){size(1280,720);}
class Circle{
float x,y,r,m,dx,dy,ax,ay,fx,fy;
Circle(float xPos, float yPos, float Radius, float Mass){
x = xPos;
y = yPos;
r = Radius;
m = Mass;
}
void ADD_DRAG(){
fx -= 0.5 * 1.225 * dx * dx * 0.5 * r * PI;
fy -= 0.5 * 1.225 * dy * dy * 0.5 * r * PI;
}
void update(){
ADD_DRAG();
ax = fx / m;
ay = fy / m;
dx += ax / frameRate;
dy += ay / frameRate;
x += dx / frameRate;
y += dy / frameRate;
}
}
Circle[] SceneObjects = {new Circle(50,50,20,20000),new Circle(50,50,2,20)};
void draw(){
background(51);
for (Circle c : SceneObjects){
c.update();
circle(c.x * 3,c.y * 3,c.r * 3);
}
}
void mouseClicked(){
if(SceneObjects[1].fx != 2000)
SceneObjects[1].fx = 2000;
else
SceneObjects[1].fx = 0;
}
这是代码,本质上是一个 Circle 类,它存储对象属性,然后在每个绘制循环中更新所应用的力。 mouseClicked void 仅用于通过向对象添加力进行测试。感谢所有和任何帮助,谢谢!
我正在使用的数学:
为ax = fx / m; 重新排列了 F=ma
加速度 * 时间 = dx += ax / frameRate; 的速度(帧速率为 1/次)
距离 = 速度 * 时间 = 对于x += dx / frameRate;(同上)
对于阻力 im,使用这个方程 https://www.grc.nasa.gov/WWW/K-12/rocket/drageq.html 并添加常数,例如空气密度等。
【问题讨论】:
-
我不是专家,但你应该整合渐变吗?
-
我认为因为 dx 和 dy 是以 m/s 为单位除以帧速率的速度会给出米,因为帧速率是 1/s。积分不只是做同一件事的不同方式吗?
-
我不这么认为。如果你想要净 x 和 y,你绝对可以整合 x (+= ),但整合 dx 和 dy 至少对我来说没有意义。您能否编辑帖子并附上您正在使用的数学的链接?
-
我已经添加了数学。也只是以防万一 fx = 力 ax = 加速度 dx = 速度 x = 位置,我觉得我没有解释过,谢谢!
-
这个网站也展示了速度的积分与加速度的关系physics.info/kinematics-calculus
标签: java processing simulation physics