如何计算运动圆形Circle C与矩形Rectangle R的碰撞点?
运动圆形与静止矩形的碰撞点计算方法
核心思路
把动态碰撞问题转化为静态相交问题:给矩形反向施加圆形的速度矢量,相当于将矩形做对应平移,问题就等价于静止圆形与平移后的矩形的静态相交检测,找到最早的碰撞时刻后,再反推碰撞点。
具体步骤
1. 明确基础参数
- 圆形C:圆心坐标
(cx, cy),半径r,速度矢量(vx, vy) - 矩形R(以轴对齐为例):边界坐标
x_min、x_max、y_min、y_max(若为旋转矩形,先通过坐标变换转为轴对齐场景)
2. 计算有效碰撞时间
分别计算圆形与矩形四条边的潜在碰撞时间,筛选出最早的有效时间t_hit(t需≥0,且为所有可行解中的最小值):
- 碰撞左边界(x=x_min):仅当
vx<0时可能,t_left = (x_min - r - cx)/vx - 碰撞右边界(x=x_max):仅当
vx>0时可能,t_right = (x_max + r - cx)/vx - 碰撞下边界(y=y_min):仅当
vy<0时可能,t_bottom = (y_min - r - cy)/vy - 碰撞上边界(y=y_max):仅当
vy>0时可能,t_top = (y_max + r - cy)/vy
从所有符合条件的t中取最小值即为碰撞时刻,若无符合条件的t,判定无碰撞。
3. 推导碰撞点
根据t_hit对应的边界,直接计算碰撞点坐标:
- 碰撞左/右边界:x坐标为
x_min - r或x_max + r,y坐标为cy + vy*t_hit - 碰撞上/下边界:y坐标为
y_max + r或y_min - r,x坐标为cx + vx*t_hit
4. 特殊情况处理
- 圆形初始已与矩形重叠:此时
t_hit=0,碰撞点取圆形与矩形的静态交点 - 圆形速度方向远离矩形:直接判定无碰撞
简化技巧
- 无需遍历所有四条边,仅计算圆形朝向的1-2条边界的碰撞时间,减少计算量
- 旋转矩形可通过逆旋转变换,将圆形、速度矢量与矩形统一转为轴对齐场景,计算完成后再做逆向变换还原坐标
内容的提问来源于stack exchange,提问作者Jason Boyd
相关产品推荐
相关产品推荐

