物理引擎p2.js的碰撞检测实验

影响p2的碰撞检测的因素

首先是 p2.Body.type: DYNAMIC,STATIC和KINEMATIC。

DYNAMIC

  • 动态刚体
  • 一般通过force和velocity由物理引擎来控制位置

STATIC

  • 静态刚体
  • 一般没有改变位置的需求

KINEMATIC

  • 动态刚体
  • 不通过引擎来控制位置信息,而是通过直接修改Position来修改位置

其他 可能影响碰撞的属性:

mass
重量

sensor
传感器,充当传感器的刚体,将可以被穿透

碰撞过滤

可以通过设置p2.Body的collisionGroup && collisionMask属性来进行碰撞过滤,避免产生过多无用的碰撞检测消耗时间。

collisionGroup
表示刚体所属的碰撞组

collisionMask
表示可与该刚体发生碰撞的碰撞组

是否进行碰撞的判定方式

if(shapeA.collisionGroup & shapeB.collisionMask)!=0 && (shapeB.collisionGroup & shapeA.collisionMask)!=0){
// The shapes can collide
}

不参与碰撞则设置为0,碰撞所有则为 -1

allCollisionsShape.collisionMask = -1;
noCollisionsShape.collisionMask = 0;

注意:当不设置这两个值时,默认是进行碰撞检测的。

测试

方法 p2.Body.overlaps(body:p2.Body) 可以在引擎调用step后查询碰撞两个刚体的碰撞结果。以下是分组测试结果:

实验结果图:

结论

  1. 仅当参与碰撞检测的两个刚体中,至少有一个是DYNAMIC时,引擎才会判定碰撞成功。
  2. mass和sensor的值并不影响碰撞结果。
  3. mass为0的刚体,可能被弹飞。
  4. sensor为true,即设置为传感器的刚体可以被穿透。
  5. 对于DYNAMIC类型刚体,如果sensor为false(默认值),碰撞成功时,引擎会自动改变其位置信息,避免穿透。

参考文献

p2.js Wiki: https://github.com/schteppe/p2.js/wiki

问题

那么问题就来了,如果要用p2.js来实现Unity里的 trigger,该怎么配置呢?


如果你有什么问题和评论,欢迎关注我的公众号 阿斌的日常 与我讨论。