You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MatterJS中让堆叠圆形仅与地面碰撞、互不碰撞?

在MatterJS中实现圆形互不碰撞、仅与地面碰撞的方案

解决这个问题的核心是利用MatterJS的**碰撞过滤(collisionFilter)**功能,通过配置物体的碰撞组来控制碰撞行为,具体操作如下:

关键配置思路

给所有堆叠的圆形设置统一的负数碰撞组ID,同组的负数ID物体之间不会触发碰撞;地面保持默认组(或设置不同组),这样圆形只会和地面发生碰撞,彼此之间完全无碰撞。

修改后的完整代码

var stack = Composites.stack(300, 0, 3, 3, 10, 10, function(x, y) {
    return Bodies.circle(x, y, Common.random(10, 20), {
        friction: 0, 
        restitution: 0.2, 
        density: 0.001,
        // 核心:设置负数组ID,同组圆形互不碰撞
        collisionFilter: { group: -1 }
    });
}); 

Composite.add(world, stack);

Composite.add(world, [
    Bodies.rectangle(300, 300, 600, 20, { 
        isStatic: true, 
        friction: 0, 
        render: { fillStyle: '#060a19' }
        // 地面使用默认组(0),与圆形的-1组不同,会正常碰撞
    }),
]); 

配置说明

  • collisionFilter.group的规则:当值为负数时,同组的物体之间不会产生碰撞反应;不同组的物体(比如这里圆形的-1组和地面的默认0组)会正常进行碰撞检测。
  • 这种方式简单直接,不需要额外配置碰撞类别(category)和掩码(mask),完全满足需求。

内容的提问来源于stack exchange,提问作者user500665

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 07:43:14