pymunk中ContactPoint与ContactPointSet.points的区别及相关疑问
Pymunk碰撞接触点与距离疑问解答
1. ContactPoint中point_a/point_b对应的形状
- Arbiter对象的
shape_a和shape_b对应碰撞的两个形状,顺序固定(和你设置碰撞处理时的形状对一致)。 - 每个
ContactPoint里的point_a是Arbiter.shape_a表面的接触位置,point_b是Arbiter.shape_b表面的接触位置。 - 由于
ContactPointSet.points最多包含2个ContactPoint实例,所以会出现最多4个点——每一对(point_a, point_b)对应一个接触位置在两个形状上的各自映射。
2. ContactPoint与ContactPointSet的distance区别
ContactPoint.distance:单个接触点处两个形状的穿透距离(重叠时为负值,正值表示物体接近但未接触),这是该接触点的精确距离/穿透深度。ContactPointSet.distance:是所有接触点distance的综合参考值(通常为平均值),用来表示整体碰撞的穿透程度,若需要单个接触点的细节,直接用对应ContactPoint的distance即可。
3. 为什么一个ContactPoint包含两个点?
- 两个碰撞物体的接触位置在各自表面的坐标并不一定重合——尤其是存在穿透时,两个形状的“接触点”是各自表面上对应碰撞位置的点。
- 举个例子:圆形碰撞矩形侧面时,圆形上的接触点是圆周上的某点,矩形上的接触点是侧面的对应点,这两个点的连线方向就是碰撞法向量方向,
distance就是这两个点在法向量上的距离(负值代表重叠深度)。 - 本质上,
point_a和point_b是同一碰撞接触事件在两个物体表面的“对应点”,用来分别标记每个物体上的接触位置。
内容的提问来源于stack exchange,提问作者baronch
相关产品推荐
相关产品推荐

