我正在构建基于Paper.js的应用程序 我有一个项目列表,每个项目由一个顶级组和一组路径组成 我需要实现碰撞检测,目前的工作原理如下:
拖动项目时,将使用相同图层中的任何其他路径检查其组件(由其组成的路径) 路径#getIntersections(路径)方法。
如果该方法返回一个非空数组(CurveLocations,它描述了交点),我知道那里有一个碰撞。一世 停止拖动并合并项目。
- 醇>
如果返回的数组为空,则无法处理冲突,因此无需中断拖动。我翻译(移动)拖动的项目 被拉的距离。
现在,这就是我在第2步中需要做的事情:
检测到碰撞后,我需要将物品移动到最近的位置 "法律"位置(最近的当前鼠标位置没有 重叠任何其他形状/边框)。
现在我可以在没有getIntersections方法的情况下实现SAT或GJK并解决它,但我唯一缺少的是MTV(如果我没有弄错的话)。
有人可以确认这是否可能,如果可能,那么如何?
在摆弄各种鼠标事件后,我已经找到了一个当前(不完美)的解决方案:
onMouseDown:保存鼠标偏移(项目位置减去鼠标位置)
onMouseDrag:检查交叉点。如果是这样,则在check返回true时,通过event.delta.negate()转换拖动的对象。完成后,更新偏移量 如果未检测到交叉点,只需将拖动的项目移动到鼠标位置减去偏移量。
- onMouseUp:与拖动事件相同,除非未检测到任何碰撞,则不执行任何操作。
醇>
这或多或少都在起作用,除了它的紧张之外它并没有处理遏制。
将在时间允许的情况下更新示例。
答案 0 :(得分:0)
如果你只有两个形状并且它们都非常接近圆形和方框并且具有相似的大小,你可以获得形状边界框的中心并使用这些中心点作为方向向量。然后你逐渐移动它,直到没有交叉点为止。但是如果你有像U或O这样的形状围绕另一个较小的形状,那么这种方法可能不会给出最短的距离。如果移开将会击中其他物体。
所以我认为你真正需要的是一种数字解决方案,它将形状从圆形方式移动到中心点,直径不断增大,直到不再有任何交叉点为止。
另一个问题可能是当你的形状被包围在另一个形状中时你甚至没有任何交叉点。所以我想最好使用hittest。
编辑: 这是我试图用中间点解释的一个非常简单的非常优化example。如果您没有看到任何叠加,请重新加载。对于循环方式,检查变得更加复杂,因为您不仅要移动形状,还要移动所有其他类型的方向。
Edit2:检查交叉点并将形状移到外面的第二个example。正如您所看到的那样,单独的交叉点不足以检查障碍物是否比拖动物品更大。