首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加工物理Sim

加工物理Sim
EN

Stack Overflow用户
提问于 2022-07-28 23:58:13
回答 1查看 45关注 0票数 2

我对processing和一般的编码非常陌生。我试着做一个物理模拟,一个球在重力的作用下弹跳,加速和减速。

你可以看到,它在下降的过程中运行得很好,但是在反弹之后,它再也没有达到顶峰,我不明白为什么。在下降的过程中,速度应该是乘以重力,而在上升的过程中,它会被重力除以。我想,由于某种原因,代码在上升的过程中循环得更快/次数更多,因此速度更慢。在这个示例中,我希望当它再次击中ypos = 0时,可以翻转这个方向,但是当ballspeed = very慢下来的时候,我确实尝试了翻转这个方向,并且它做了几次反弹,每次都变得越来越低。具有讽刺意味的是,它表现得更现实,好像有一些能量损失,但这不是我现在想要的,因为我没有添加任何这样的因素!

代码语言:javascript
复制
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;
  }
}
EN

回答 1

Stack Overflow用户

发布于 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。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73160312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档