首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >重力物理学,避免无限的反弹?

重力物理学,避免无限的反弹?
EN

Stack Overflow用户
提问于 2013-02-24 14:06:47
回答 2查看 1.9K关注 0票数 3

据我所知,有一种非常标准的方法来实现重力,这几乎是真正的方法;在一个物体的向下垂直速度中加入一个数字(比如9.8)。

然而,这个简单的数学在我的程序(and apparently others)中导致了“无限反弹”的问题。到目前为止,简单的测试案例中有一个球直接下降,并击中了“地板”。在碰撞时,球的矢量被偏转,并减少1/4 (一个占位符的恢复系数)。在每一时间步骤中,重力值(在我的例子中大约为2)被添加到向量中。结果,球会反弹,然后反弹得越来越低.然后,它不是真正的停止,甚至是明显的停止(真正的目标),而是在屏幕底部上下抖动。调试读数显示,它的速度从不会下降到2以下超过几个帧,因为这个常数只是不断地被添加和取消,并再次无限期地添加。

现在,理解为什么不是困难的部分。这正是我从一开始就担心的,我只是觉得我忽略了一些数学魔法,因为在解释数学时,没有人真正提到过这样的问题。但是--因为从来没有人讨论过--这确实让我好奇,修复它的“典型”方法是什么?

编辑:在做了大量的工作后,我已经确定单独使用单独的加速值并不能解决这个问题--它仍然会尝试添加一些恒定的重力分数。恒定的时间步长意味着恒定的加速度;恒定的加速度意味着恒速的增加。弹跳恢复系数会使速度降低到一个点,并使加速度负值,但是加速度会从0开始。就像这样:

  1. 加速度从0开始,速度是y。
  2. 加速度由(grav *timestep一步步)递增。
  3. 速度随着加速度而增加。
  4. 重申2-3,直到与地板碰撞。
  5. 加速度现在回到0。
  6. 速度矢量相应地反映,然后乘以CoR。
  7. 当速度从负值变为0,再次变为正时,重申2-3次.
  8. 重申2-7,每一次反弹保持的势头比上次少。
  9. 反弹现在已经非常小了。
  10. 速度现在小于(grav * timestep)。
  11. 与地板碰撞,加速度回到0。
  12. 加速又增加了(grav *timestep一秒)。
  13. 速度因加速度而增加--现在足以同时从负向正摆动。
  14. 无限重复11-13次。

现在,总的问题是而不是,速度永远不会等于0。这是意料之中的。但我们也期待的是,一个无限递减的数字。当恢复系数设定为0.5时,所产生的反弹速度应为最后一次反弹速度的一半,逐渐减少,直至可作为“停止”予以丢弃。通过引入纯常数加法--不管是直接加到速度上,还是把它加到另一个加到速度上的值--就产生了这个问题。我需要知道如何解决这个问题,特别是。

EN

回答 2

Stack Overflow用户

发布于 2013-10-26 02:06:52

只是处理了同样的问题。

这里是为我修复它的代码:

代码语言:javascript
运行
复制
if (cat.y + cat.height >= ground.y)    // if the cat has hit the ground
{
    cat.y = ground.y - cat.height;    // reset to the bottom
    cat.vector.y = Math.round(COR * -cat.vector.y);    // might want to round down
}

这里的重要部分是四舍五入。

票数 1
EN

Stack Overflow用户

发布于 2013-04-01 18:05:21

要解决这个问题,你唯一要做的就是当球击中地面时,倒转垂直速度,并将球放在障碍物上,这样球就会锁定在地面上,因为9.8 /4向上的速度不足以“解锁”它,并使它再次反弹。

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

https://stackoverflow.com/questions/15052500

复制
相关文章

相似问题

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