这是一个帖子,链接到有关类似类型的模拟的论文(在工程/学术环境而不是游戏中):https : //gamedev.stackexchange.com/a/10350/6398
对于这种“线”模拟,我已经尝试了至少两种不同的方法来进行碰撞检测和响应(如游戏中的Umihara Kawase所示);至少,我认为这是您所追求的—这类模拟似乎没有特定的术语,我只是倾向于将其称为“线”而不是“绳”,因为这似乎是大多数人认为“绳”是“粒子链”的代名词。而且,如果您希望忍者绳子保持粘性(即它可以推动和拉动),则它更像是一根刚性钢丝,而不是绳索。无论如何..
Pekuja的答案很好,您可以通过求解三个点的有符号区域为0的时间来实现连续碰撞检测。
(我无法完全回忆起OTOH,但是您可以按以下方法进行处理:找到点a包含在通过b,c的直线中的时间t((我想我是通过求解何时dot(ab,cb)= 0以找到t的值,然后给定有效时间0 <= t <1,找到段bc上a的参数位置s,即a =(1-s)b + s c,如果a在b和c(即0 <= s <= 1)表示有效碰撞。
AFAICR也可以采用另一种方法(即求解s,然后将其插入以找到t),但是它的直观性要差很多。(很抱歉,如果这没有任何意义,我没有时间去整理笔记,已经过去了几年!)
因此,您现在可以计算事件发生的所有时间(即应插入或删除绳索节点);处理最早的事件(插入或删除节点),然后重复/递归直到t = 0和t = 1之间没有其他事件。
有关此方法的一个警告:如果绳索可以缠绕的对象是动态的(尤其是模拟它们及其对绳索的影响,反之亦然),那么如果这些对象夹住/穿过每个对象,则可能会出现问题。其他-电线可能会缠结。在box2d样式的物理模拟中,要防止这种交互作用/运动(对象的角相互滑过),绝对是具有挑战性的。在这种情况下,对象之间的少量渗透是正常行为。
(至少..这是我的“ wire”实现之一的问题。)
另一种解决方案更稳定,但在某些情况下会错过一些碰撞,它只是使用静态测试(即,不必担心按时间排序,只需在发现碰撞时递归细分每个碰撞段即可),可以坚固得多-导线不会在角落缠结,并且少量的穿透就可以了。
我认为Pekuja的方法也适用于此,但是还有其他方法。我使用的一种方法是添加辅助碰撞数据:在世界上的每个凸顶点v(即绳索可以缠绕的形状的角)处,添加一个点u形成有向线段uv,其中u是一些点“在角落内”(即,在世界内部,在“ v”之后;要计算u,您可以沿v的内插法线从v向内投射光线,并在v之后或在光线与世界的边缘相交之前停止一段距离,退出实心区域。或者,您也可以使用可视工具/关卡编辑器手动将线段绘制到世界中。
无论如何,您现在有了一组“角线段” uv;对于导线中的每个uv和每个段ab,检查ab和uv是否相交(即静态,布尔线段-线段交点查询);如果是这样,则递归(将线段ab分成av和vb,即插入v),记录绳索在v处弯曲的方向。然后对于导线中的每对相邻线段ab,bc,测试当前的弯曲方向是否在b处与生成b时相同(所有这些“弯曲方向”测试都只是有符号区域测试);如果不是,则将两个段合并为ac(即删除b)。
或者,也许我合并然后拆分了,但我忘了-但它确实可以至少在两种可能的顺序之一中起作用!:)
给定当前帧计算的所有线段,然后可以模拟两个线端点之间的距离约束(甚至可以包含内部点,即线与世界之间的接触点,但这要涉及更多点)。
无论如何,希望这会有所帮助...我链接的帖子中的论文也应该给您一些想法。