物理引擎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后查询碰撞两个刚体的碰撞结果。以下是分组测试结果:
实验结果图:
结论
- 仅当参与碰撞检测的两个刚体中,至少有一个是DYNAMIC时,引擎才会判定碰撞成功。
- mass和sensor的值并不影响碰撞结果。
- mass为0的刚体,可能被弹飞。
- sensor为true,即设置为传感器的刚体可以被穿透。
- 对于DYNAMIC类型刚体,如果sensor为false(默认值),碰撞成功时,引擎会自动改变其位置信息,避免穿透。
参考文献
p2.js Wiki: https://github.com/schteppe/p2.js/wiki
问题
那么问题就来了,如果要用p2.js来实现Unity里的 trigger,该怎么配置呢?
如果你有什么问题和评论,欢迎关注我的公众号 阿斌的日常 与我讨论。