如何在 Cannon.js 中对对象主体 (parent/child) 进行分组?

How to group object bodies (parent/child) in Cannon.js?

我到处搜索并查看了很好的问题和文档,但似乎除了在两个 Cannon 主体之间创建约束之外,没有办法将不同质量的形状分组(例如)。

目前我使用 lockConstraint 但那是一个 hack...有时,当我的对象发生碰撞时,“"child"”对象的旋转突然旋转到不需要的位置.. .

有没有更合适的方法呢?

编辑: 我想要实现的是:我创造了一辆汽车,我希望他的重心位于 4 个轮子的中心。 为此,我创建了一个 .collisionResponse 设置为 0 和我想要的质量的主体,并将其定位在轮子的中心。 然后我创建质量很小的底盘和新的 CANNON.LockConstraint(chassisBody, mass, 0.5) 允许 2 个对象 "grouped".

无法为 Cannon.js 中的每个形状设置 mass/density。但是,您可以将质心移近较重的形状以获得等效效果。

锤子就是一个很好的例子,因为在典型的锤子中,头部的密度比轴大得多。如果你扔一个锤子,它会围绕靠近它头部的一点旋转,因为头部比轴重。

要在 cannon.js 中制作锤子,您可以使用两个盒子。

var head = new CANNON.Box(new CANNON.Vec3(2,1,1));
var shaft = new CANNON.Box(new CANNON.Vec3(0.5,3,0.5));

现在,要assemble将形状合为一体,您可以这样做:

var body = new CANNON.Body({ mass: 1 });
body.addShape(shaft, shaftPosition);
body.addShape(head, headPosition);

根据您使用的形状位置(shaftPosition、headPosition),您可以在 Body 中局部更改它们的位置,同时,它们相对于质心(也称为旋转中心)的位置。 设置 headPosition=(0,0,0) 和 shaftPosition=(0,3,0) 会使锤子在扔锤子时围绕头部旋转。然而,如果你把它反过来,锤子会绕着轴的中心旋转......这看起来像头部和轴具有相似的密度。尝试不同的位置以找到相对于形状的完美旋转中心。

Body#addShape 的完整签名可让您添加完整的刚性变换以在体内定位形状。它是:

body.addShape(shape, position, quaternion);