gpt4 book ai didi

math - 实时计算碰撞——处理时间延迟

转载 作者:行者123 更新时间:2023-12-04 11:25:47 25 4
gpt4 key购买 nike

假设:

  • 您正在编写一个程序,其中 3 个(或更多)圆圈(或其他几何图形)实时在屏幕上四处移动,所有圆圈都以不同的速度移动,由于物理计算。

  • 只能对每一帧进行计算

  • 每一帧,你必须确保在这一帧和最后一帧之间的时间内“碰撞”/“已经碰撞”的圆圈将通过物理计算“弹开”

  • 假设在第 x 帧和第 x+1 帧之间的时间内,三个圆圈将相互碰撞。但是,在第 x 帧期间,没有一个圆圈相互接触。在第 x+1 帧中,同样适用(无碰撞)我将尝试用一张图片更好地说明这一点:

enter image description here

问题:

有什么好的方法可以像这样跟踪碰撞,从而不会由于两帧之间的某些(意外的)大时间延迟而跳过碰撞?

这个问题在我脑海中盘旋了太久...

编辑:

对于所有认为这篇文章是 OT 的人:请参阅 this在您投票赞成关闭之前。

最佳答案

要正确执行此操作:

  • 计算您的圆圈的精确碰撞时间,而不是四舍五入到下一帧:
    • 如果您的对象在超过一维的范围内移动,则需要寻根。
  • 按顺序解决冲突,如下所示:
    • 在上述确切的碰撞时间停止模拟。
    • 解决第一次碰撞中圆圈的物理问题。
    • 重新计算以确定新轨迹引起的任何碰撞。
    • 重新启动模拟。
    • 重复,直到到达帧末且没有发生碰撞。
  • 物理学方面的任何其他计划外变化也需要更新即将发生的碰撞。

您可能会注意到这可能会导致大量计算。如果你的球失去动能并最终相互搁置,这可能会特别令人讨厌——如果你的物理学使这种情况成为可能,你将需要为“静止接触”添加某种阈值(不幸的是,这可能会使情况复杂化你的物理学非常重要)。


更新,回应评论:我想明确指出,我的回答忽略了您的一个假设——如果您假装帧边界之间没有任何时间,您就无法准确地处理碰撞。碰撞不会发生在帧边界;一般来说,碰撞将发生在帧边界之间,因此您的计算需要反射(reflect)这一点。

如果您假设帧之间的所有运动都是线性的(即,您的模拟在帧边界上进行所有加速),那么确定是否发生碰撞、发生碰撞的位置和时间实际上非常简单。它将您的帧间“模拟”减少到几乎没有——即使您的模拟是 2D 或 3D,您也可以以封闭形式求解方程:

posAB = posA - posB                [relative vector between circles A and B]
velAB = velA - velB [relative velocity between circles A and B]
posAB(t) = posAB(0) + t * velAB [relative vector as a function of time]
rAB = rA + rB [sum of radii of the two circles]
collision happens when distance(t) = abs(posAB(t)) == rAB
-> rAB^2 = | posAB(t) |^2 = | posAB(0) + t * velAB |^2
-> t^2 * |velAB|^2 + t * 2*posAB(0).velAB + |posAB(0)|^2 - rAB^2 == 0
solve quadratic equation for t:
- if discriminant is negative, there is no collision.
- if collision times are outside current timestep, there is no current collision.
- otherwise, smallest t should be the correct collision time.
- watch out for cases like 2 circles coming *out* of collision...

最后,听起来您正在尝试进行过早的优化。最好先让事情正常运行,然后再让它们运行得更快;在运行代码之前,您不会知道实际的瓶颈。事实上,我还认为您低估了现代计算机的能力。当然,您总是可以添加足够多的对象来拖慢您的计算机,但我想您会惊讶于它需要多少...

关于math - 实时计算碰撞——处理时间延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8569129/

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