Matter.js 碰撞过滤不起作用

问题描述 投票:0回答:2

受到代码子弹的启发,我想制作一个爬坡赛车游戏,所以像他一样,我正在使用 p5.js 引擎,但与他不同的是,我将使用 matter.js 作为我的物理引擎。我使用柏林噪声完成了地形创建。现在正在制造汽车。我不想使用 matter.js 汽车,因为那里似乎没有任何碰撞,所以计划 b 是创建 2 个圆圈,它们是我们相互约束的轮子。还要创建一个受车轮约束的车身。现在我也希望它是这样的,以便车轮与地面以及车身与地面之间发生碰撞,而不是车身与车轮之间发生碰撞,因为我想在我的车中使用悬架。所以我的问题是如何做到地面可以与车身和车轮碰撞但车身和车轮不会相互碰撞。我一直在尝试许多失败的尝试,这是最新的 https://github.com/KidCoderT/hill-climb-racing 我不明白为什么会这样。我创造了 3 个不同的面具。

let worldCategory = 0x0002,
carBodyCategory = 0x0003,
carWheelCategory = 0x0004;

并将它们分别应用于每个项目,但它们都相互碰撞,我做错了什么。请帮帮我谢谢

collision p5.js matter.js
2个回答
0
投票

你可以这样做:

// Assuming that parameters (a, b) contains (a.x, a.y, a.radius) (b.x, b.y, b.radius)

function CircleCollision(a, b) {
  let dst = Math.floor(sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)));

  if (dst < a.radius + b.radius) {
    return true;
  }

  return false;
}

0
投票

我只是被类似的事情困住了,所以这里有一个解决方案,以防有人还在寻找它:

要过滤碰撞,除了您创建的类别之外,我们还需要masks告诉Matter引擎身体将与哪些类别发生碰撞。所以,使用你的类别:

let worldCategory = 0x0002,
carBodyCategory = 0x0003,
carWheelCategory = 0x0004;

我们需要将它们赋值给物质体的

collisionFilter
属性,例如:

const wheel = Matter.Body.circle(xPox, yPos, radius, {
  collisionFilter: {
    category: carWheelCategory
  }
})
const carBody = Matter.Body.rectangle(xPox, yPos, width, height, {
  collisionFilter: {
    category: carBodyCategory
  }
})
const ground = Matter.Body.rectangle(xPox, yPos, width, height, {
  collisionFilter: {
    category: worldCategory
  }
})

现在,我们可以为每个对象添加掩码以告诉它它可以与哪个类别发生碰撞。例如,下面将使地面与车轮和车身发生碰撞:

const ground = Matter.Body.rectangle(xPox, yPos, width, height, {
  collisionFilter: {
    category: worldCategory,
    mask: wheelCategory | carBodyCategory
  }
})

这就是我们如何精确控制什么会与什么发生碰撞。

© www.soinside.com 2019 - 2024. All rights reserved.