【发布时间】:2014-01-29 15:07:47
【问题描述】:
我正在构建一个基于 Paper.js 的应用程序。
我有一个项目列表,每个项目都由一个顶级组和一堆作为孩子的路径组成。
我需要实现碰撞检测,目前的工作方式如下:
当一个项目被拖动时,它的组件(它所包含的路径)会使用 Path#getIntersections(path) 方法。
如果该方法返回一个非空数组(CurveLocations,它描述了交点),我就知道发生了碰撞。一世 停止拖动并组合项目。
如果返回的数组为空,则无需处理碰撞,因此无需中断拖动。我翻译(移动)拖动的项目 它被拖动的距离。
现在,我需要在第 2 步中执行以下操作:
检测到碰撞后,我需要将项目移动到最近的位置 “合法”位置(最接近当前鼠标位置,没有 重叠任何其他形状/边框)。
现在我可以着手实施 SAT 或 GJK 并在没有 getIntersections 方法的情况下解决它,但我这里唯一缺少的是 MTV(如果我没记错的话)。
有人可以确认这是否可能,如果是,那么如何?
更新
在摆弄了各种鼠标事件之后,我得出了一个当前(不完美)的解决方案:
onMouseDown:保存鼠标偏移量(项目位置减去鼠标位置)
onMouseDrag: 检查交叉路口。如果是这样,当检查返回 true 时,通过 event.delta.negate() 翻译拖动的对象。完成后,更新偏移量。
如果没有检测到交叉点,只需将拖动的项目移动到鼠标位置减去偏移量。- onMouseUp:与拖动事件中的相同,但如果未检测到碰撞则不执行任何操作。
这或多或少是有效的,除了它很紧张而且它不处理收容问题。
将在时间允许的情况下更新示例。
【问题讨论】:
标签: javascript geometry collision-detection vector-graphics paperjs