gpt4 book ai didi

collision-detection - 重力物理学,避免无限反弹?

转载 作者:行者123 更新时间:2023-12-04 08:16:54 24 4
gpt4 key购买 nike

据我所知,有一种非常标准的方法来实现重力,这几乎是真正的交易;在每个时间步将一个数字(例如 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 时,产生的弹跳速度应为上次的一半,并逐渐降低直到可以将其丢弃为“停止”。通过引入纯常量加法——无论是直接加到速度上,还是将它加到另一个被加到速度上的值上——就会产生这个问题。我需要知 Prop 体如何解决这个问题。

最佳答案

刚刚处理了同样的问题。

这是为我修复它的代码:

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
}

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

关于collision-detection - 重力物理学,避免无限反弹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15052500/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com