首页 > 解决方案 > 为什么使用碰撞过滤器删除所有碰撞?

问题描述

我有 4 个身体:2 个球和 2 个平台。

我希望球能够重叠(没有碰撞),但仍然与两个平台发生碰撞。我已经阅读了官方的Matter.js 文档并使用了collisionFilter演示,但仍然无法掌握实现我需要的东西。

let defaultCollision = 0x0001;
let ballCollision = 0x0002;
let holderCollision = 0x0004;
let floorCollision = 0x0008;

ball1 = Bodies.circle(...
  collisionFiler: { mask: ballCollision }
  ...
});

ball2 = Bodies.circle(...
  collisionFiler: { mask: ballCollision }
  ...
});
// ^ these balls don't collide, which is good.

platform1 = Bodies.circle(...
  collisionFiler: { mask: holderCollision }
  ...
});

platform2 = Bodies.circle(...
  collisionFiler: { mask: floorCollision }
  ...
});
// I don't understand why the balls pass right through these platforms...

任何帮助将不胜感激。

标签: javascriptmatter.js

解决方案


好吧,我想出了一个解决方案!

在 Matter.js 演示中,我一直忽略 和 之间的collisionFilter: { mask: defaultCategory | redCategory }不同collisionFilter: { category: defaultCategory | redCategory }。不同之处在于maskcategory规则。

要实现球重叠但与平台碰撞的结果:

let defaultCollisionCategory = 0x0001;
let ballCollisionCategory = 0x0002;


ball1 = Bodies.circle(...
  collisionFiler: { category: ballCollisionCategory }
  ...
});

ball2 = Bodies.circle(...
  collisionFiler: { mask: defaultCollisionCategory }
  ...
});

// You do not need to set either the collisionFiler mask or category, and the balls will collide with them

希望这可以帮助!


推荐阅读