2D多边形物理引擎三角形相交检测与碰撞位置计算方法咨询
2D三角形相交检测与碰撞计算方案
静态重叠判断方法
针对两个无运动的三角形,最通用且高效的方案是分离轴定理(SAT),仅需6次轴检测即可完成判断,完全覆盖相交、包含、边重合等所有情况:
- 潜在分离轴选取:两个三角形各取3条边的法向量作为检测轴,无需对法向量做归一化处理,不影响重叠判断结果。边的法向量计算方式:对边端点
p1(x1,y1)、p2(x2,y2),边向量为(x2-x1, y2-y1),对应的法向量取(y1-y2, x2-x1)即可。 - 投影计算:将两个三角形的6个顶点分别向当前检测轴投影,得到每个三角形的投影区间
[min1, max1]和[min2, max2]。 - 重叠判断:若任意一条轴上的两个投影区间无重叠,可直接判定两个三角形不相交;若6条轴的投影均存在重叠,则判定两个三角形存在重叠。
小提示:浮点计算时可加入
1e-6量级的容差参数,避免精度误差导致的误判。
带运动的碰撞位置计算
假设两个三角形在单时间步内做匀速直线运动,分别对应速度向量vA、vB,可通过连续版分离轴定理计算碰撞时间与碰撞位置:
- 先计算两个三角形的相对运动速度
v_rel = vB - vA,简化后续投影随时间变化的计算逻辑。 - 对6条待检测的分离轴,分别计算两个三角形投影区间随时间变化的函数,推导得到两个投影区间从分离变为重叠的最早时间
toi(碰撞时间),以及从重叠变回分离的最晚时间。 - 取所有轴
toi的最大值作为最终碰撞时间t_collide,若t_collide落在[0, 1](对应完整时间步的归一化时间)区间内,说明该时间步内会发生碰撞。 - 碰撞位置计算:将两个三角形的所有顶点按各自速度更新到
t_collide对应的时刻坐标,此时两个三角形刚好接触,取重叠边的交点、或落在对方边/内部的顶点即可作为碰撞点。
内容的提问来源于stack exchange,提问作者moohot
相关产品推荐
相关产品推荐

