[英]Finding the minimum translation vector using intersection points
我正在構建一個基於Paper.js的應用程序。
我有一個項目列表,每個項目都由一個頂級組和一堆路徑作為孩子組成。
我需要實現碰撞檢測,目前的工作,像這樣:
拖動項目時,使用Path#getIntersections(path)方法對照同一層中的任何其他路徑檢查其組件( 組成的路徑) 。
如果該方法返回一個非空數組(CurveLocations,它們描述的交叉點的)我知道有一個碰撞。 我停止拖動並合並項目。
如果返回的數組為空,則沒有沖突要處理,因此無需中斷拖動。 我將拖動的項目平移(移動)到拖動的距離。
而現在,這是我需要在步驟2中要做到:
在檢測到碰撞時,我需要將項目移動到最接近的“合法”位置(最接近當前鼠標的位置,而不會重疊任何其他形狀/邊界)。
現在,我可以實現SAT或GJK並使用getIntersections方法來解決它,但是我唯一缺少的就是MTV(如果我沒記錯的話)。
可有人請確認這是否是要么可能與否,如果是的話,怎么樣?
擺弄各種鼠標事件后,我得出了當前(不完善)的解決方案:
onMouseDown:保存鼠標偏移(項目位置減去鼠標位置)
onMouseDrag:檢查交叉點。 如果是這樣,則在檢查返回true時,通過event.delta.negate()翻譯拖動的對象。 完成后,更新偏移量。
如果沒有檢測到交叉點,只是移動拖動的項目到鼠標位置減去偏移量。- onMouseUp:與拖動事件相同,除了如果未檢測到碰撞,則什么也不做。
這或多或少地起作用,除了令人不安的是,它不涉及遏制。
如果時間允許,將以示例進行更新。
如果只有兩個形狀,並且它們都非常接近圓和框並且具有相似的大小,則可以獲取形狀的邊界框的中心,並將這些中心點用作方向向量。 然后,將其逐漸移開,直到不再有路口為止。 但是,如果您將U或O之類的形狀圍繞另一個較小的形狀,則此方法可能不會給出最短的距離。 如果移開會撞到其他物體,也是如此。
因此,我認為您真正需要的是一個數值解決方案,該解決方案以直徑不斷增大的圓形方式將形狀從其中心點移開,直到不再有任何相交為止。
另一個問題可能是當您的形狀封閉在另一個形狀中而您甚至沒有任何相交處時。 因此,我想使用hittest會更好。
編輯:這是我嘗試用中點解釋的一個非常簡單但不是很好的優化示例 。 如果看不到任何疊加層,請重新加載。 對於循環方式,檢查會變得更加復雜,因為您不僅要移走形狀,而且還要沿所有其他方向移動形狀。
Edit2:第二個示例 ,用於檢查相交並將形狀移到外部。 如您所見,僅交叉點不足以檢查障礙物是否大於拖動的項目。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.