繁体   English   中英

使用交点找到最小平移向量

[英]Finding the minimum translation vector using intersection points

我正在构建一个基于Paper.js的应用程序。
我有一个项目列表,每个项目都由一个顶级组和一堆路径作为孩子组成。
我需要实现碰撞检测,目前的工作,像这样:

  1. 拖动项目时,使用Path#getIntersections(path)方法对照同一层中的任何其他路径检查其组件( 组成的路径)

  2. 如果该方法返回一个非空数组(CurveLocations,它们描述的交叉点的)我知道有一个碰撞。 我停止拖动并合并项目。

  3. 如果返回的数组为空,则没有冲突要处理,因此无需中断拖动。 我将拖动的项目平移(移动)到拖动的距离。

而现在,这是我需要在步骤2中要做到:

在检测到碰撞时,我需要将项目移动到最接近的“合法”位置(最接近当前鼠标的位置,而不会重叠任何其他形状/边界)。

现在,我可以实现SAT或GJK并使用getIntersections方法来解决它,但是我唯一缺少的就是MTV(如果我没记错的话)。

可有人请确认这是否是要么可能与否,如果是的话,怎么样?


更新资料

摆弄各种鼠标事件后,我得出了当前(不完善)的解决方案:

  1. onMouseDown:保存鼠标偏移(项目位置减去鼠标位置)

  2. onMouseDrag:检查交叉点。 如果是这样,则在检查返回true时,通过event.delta.negate()翻译拖动的对象。 完成后,更新偏移量。
    如果没有检测到交叉点,只是移动拖动的项目到鼠标位置减去偏移量。

  3. onMouseUp:与拖动事件相同,除了如果未检测到碰撞,则什么也不做。

这或多或少地起作用,除了令人不安的是,它不涉及遏制。
如果时间允许,将以示例进行更新。

如果只有两个形状,并且它们都非常接近圆和框并且具有相似的大小,则可以获取形状的边界框的中心,并将这些中心点用作方向向量。 然后,将其逐渐移开,直到不再有路口为止。 但是,如果您将U或O之类的形状围绕另一个较小的形状,则此方法可能不会给出最短的距离。 如果移开会撞到其他物体,也是如此。

因此,我认为您真正需要的是一个数值解决方案,该解决方案以直径不断增大的圆形方式将形状从其中心点移开,直到不再有任何相交为止。

另一个问题可能是当您的形状封闭在另一个形状中而您甚至没有任何相交处时。 因此,我想使用hittest会更好。

编辑:这是我尝试用中点解释的一个非常简单但不是很好的优化示例 如果看不到任何叠加层,请重新加载。 对于循环方式,检查会变得更加复杂,因为您不仅要移走形状,而且还要沿所有其他方向移动形状。

Edit2:第二个示例 ,用于检查相交并将形状移到外部。 如您所见,仅交叉点不足以检查障碍物是否大于拖动的项目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM