首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多目标碰撞

多目标碰撞
EN

Stack Overflow用户
提问于 2013-09-02 18:03:22
回答 2查看 3.9K关注 0票数 6

我为了好玩而写了一个简单的物理系统,我遇到了一个让我陷入困境的问题。

现在的基本算法是:

  1. 移动物体
  2. 检查碰撞
  3. 如果有碰撞
    • 以最小距离移动对象以解决冲突。
    • 根据法线、质量等来调整速度

我有一个移动的身体向两个移动,静止的,无质量的,身体。

移动的物体一步一步地被转换成与其中一个物体碰撞。

我的反应是找到我能移动的最小距离,这样它们就不再碰撞了。在这种情况下,这意味着将动态物体直接向下移动。然而,现在它正与另一个盒子相撞。

我对这个盒子重复同样的事情,试图移动这个动态的盒子,这样它就不再碰撞了,但是这把它推回到了第一个盒子里。这会永远重复。我的算法有根本缺陷吗?

EN

回答 2

Stack Overflow用户

发布于 2013-09-03 11:36:44

与其在检测到碰撞后向下移动,不如将移回来自的方向。这样,您就可以保证,如果我们假设初始状态没有冲突,则最终必须处于没有冲突的状态。

我们需要通过缩小(缩放) v来将其放入对象交集中来找出它的大小。缩小的v会有正确的震级,所以如果我们向后移动到-v的方向,那么我们就不再相交了。

让我们假设一个交集由一个x_intersection和一个y_intersection组件组成。为了找出我们需要向后移动到不再相交的数量,我们需要缩放原始的v = (v_x, v_y)向量。如果x_intersection是较小的交点,那么我们通过x_intersection / v_x缩放v,然后通过-v * x_intersection / v_x将对象移回。这意味着我们将通过-(x_intersection, x_intersection * v_y/v_x)返回。如果y_intersection是较小的交点,那么我们通过y_intersection / v_y缩放v,然后通过-v * y_intersection / v_y = -(y_intersection * v_x/v_y, y_intersection)将对象向后移动。

所以我想说你算法中的步骤可能是:

  1. 通过移动向量v移动对象
  2. 检查所有碰撞
  3. 如果有碰撞
代码语言:javascript
复制
- For all collision objects find the minimum scaling of `v` by which we we would need to move back. This scaling can be computed as the minimum of two ratios

给定v= (v_x,v_y) min_i = min(x_intersection / v_x,y_intersection / v_y) --找到所有对象的最小比例。

min_o = min(min_i)表示所有i

-用最小比缩放负移动方向得到的物体向后移动。这就是v2 = (min_o*-v)v2是我们用来向后移动的向量。

  1. 回到步骤2

例如:第一个选择w

然后选择u2

已完成:

票数 5
EN

Stack Overflow用户

发布于 2013-09-02 18:58:49

对于您描述的问题(完全未经测试),可能有一个可能的解决方案:

  1. 将对象移动为完整的时间步骤dt
  2. 检查是否与其他对象发生冲突,这可能是多个对象。
  3. 用插值法计算“撞击时间”,即小于时间步长的实数。对与之碰撞的每个对象执行此操作,并选择最小的对象。这给了您第一次碰撞t_col < dt的时间。
  4. 重做最后一步,但现在只为t_col移动对象,使其准确地击中对象,然后开始翻转速度和其他与碰撞有关的物理。现在,您可以在这里完成这一步,如果您懒惰(可能是好的,因为dt应该很小),或者继续移动另一个dt - t_col,看看您是否碰到了其他的东西。

这不是我刚刚发明的东西,但是类似于Simulink用来模拟这种不连续问题的零交叉检测

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

https://stackoverflow.com/questions/18578656

复制
相关文章

相似问题

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