我对processing和一般的编码非常陌生。我试着做一个物理模拟,一个球在重力的作用下弹跳,加速和减速。
你可以看到,它在下降的过程中运行得很好,但是在反弹之后,它再也没有达到顶峰,我不明白为什么。在下降的过程中,速度应该是乘以重力,而在上升的过程中,它会被重力除以。我想,由于某种原因,代码在上升的过程中循环得更快/次数更多,因此速度更慢。在这个示例中,我希望当它再次击中ypos = 0时,可以翻转这个方向,但是当ballspeed = very慢下来的时候,我确实尝试了翻转这个方向,并且它做了几次反弹,每次都变得越来越低。具有讽刺意味的是,它表现得更现实,好像有一些能量损失,但这不是我现在想要的,因为我没有添加任何这样的因素!
void setup(){
size(500,650);
background(0);
}
float ballspeed = (0.1);
float ypos = (20);
int direction=(1);
float gravity=(1.098);
void draw(){
background(0);
ballmove();
}
void ballmove(){
stroke(255);
noFill();
ellipse(250,ypos,50,50);
if ( direction == 1){
ballspeed = ballspeed * gravity;
ypos = ypos + ballspeed;
}
if ( direction ==- 1 ){
ballspeed = ballspeed / gravity;
ypos = ypos + (ballspeed);
}
if ( ypos > 600 ){
direction =- direction;
ballspeed =- ballspeed;
}
if ( ypos == 0 ){
ballspeed = 0.1;
direction =- direction;
}
}发布于 2022-07-31 23:06:04
这是因为你在这里做的是欧拉积分,它只是对现实世界的近似,因为时间步骤并不是无限短。在现实世界中,对象的速度和位置不是每n毫秒更新一次,它一直在发生,所以使用这种方法,你能做的最好的就是减少你的时间步骤,但它永远不会是完美的。
编辑:我刚刚注意到你被重力相乘和除以。这不是物理的工作原理:你应该用gravity*timestep减去,因为速度是加速度的反导数(在你的例子中是-gravity)。就像这样,你的模型会更加现实,你甚至不需要改变向上和向下的方式。
在任何情况下,这个公式:Ypos = h - g / 2 * (time % sqrt(8 * h / g) - sqrt(2 * h / g)) ^ 2将给出确切的结果,即使它不再是一个真正的sim。
https://stackoverflow.com/questions/73160312
复制相似问题